davy66666 пре 1 месец
комит
1f81edc4fb
28 измењених фајлова са 8969 додато и 0 уклоњено
  1. 214 0
      client/rtcservice/rtcservice.go
  2. 32 0
      etc/rtc.yaml
  3. 90 0
      go.mod
  4. 279 0
      go.sum
  5. 7 0
      internal/config/config.go
  6. 30 0
      internal/logic/rtcservice/deletemeetingrecordslogic.go
  7. 30 0
      internal/logic/rtcservice/deletesignalrecordslogic.go
  8. 30 0
      internal/logic/rtcservice/getmeetingrecordslogic.go
  9. 30 0
      internal/logic/rtcservice/getsignalinvitationinfologic.go
  10. 30 0
      internal/logic/rtcservice/getsignalinvitationinfostartapplogic.go
  11. 31 0
      internal/logic/rtcservice/getsignalinvitationrecordslogic.go
  12. 30 0
      internal/logic/rtcservice/signalcloseroomlogic.go
  13. 31 0
      internal/logic/rtcservice/signalcreatemeetinglogic.go
  14. 30 0
      internal/logic/rtcservice/signalgetmeetingslogic.go
  15. 30 0
      internal/logic/rtcservice/signalgetroombygroupidlogic.go
  16. 30 0
      internal/logic/rtcservice/signalgetroomslogic.go
  17. 30 0
      internal/logic/rtcservice/signalgettokenbyroomidlogic.go
  18. 30 0
      internal/logic/rtcservice/signaljoinmeetinglogic.go
  19. 30 0
      internal/logic/rtcservice/signalmessageassemblelogic.go
  20. 30 0
      internal/logic/rtcservice/signaloperatestreamlogic.go
  21. 31 0
      internal/logic/rtcservice/signalsendcustomsignallogic.go
  22. 30 0
      internal/logic/rtcservice/signalupdatemeetinginfologic.go
  23. 112 0
      internal/server/rtcservice/rtcserviceserver.go
  24. 13 0
      internal/svc/servicecontext.go
  25. 6340 0
      pb/rtc/rtc.pb.go
  26. 735 0
      pb/rtc/rtc_grpc.pb.go
  27. 39 0
      rtc.go
  28. 595 0
      rtc.proto

+ 214 - 0
client/rtcservice/rtcservice.go

@@ -0,0 +1,214 @@
+// Code generated by goctl. DO NOT EDIT.
+// goctl 1.7.3
+// Source: rtc.proto
+
+package rtcservice
+
+import (
+	"context"
+
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+)
+
+type (
+	BoolValue                              = rtc.BoolValue
+	BytesValue                             = rtc.BytesValue
+	DeleteMeetingRecordsReq                = rtc.DeleteMeetingRecordsReq
+	DeleteMeetingRecordsResp               = rtc.DeleteMeetingRecordsResp
+	DeleteSignalRecordsReq                 = rtc.DeleteSignalRecordsReq
+	DeleteSignalRecordsResp                = rtc.DeleteSignalRecordsResp
+	DoubleValue                            = rtc.DoubleValue
+	FileRecord                             = rtc.FileRecord
+	FloatValue                             = rtc.FloatValue
+	GetJoinTokenReq                        = rtc.GetJoinTokenReq
+	GetJoinTokenResp                       = rtc.GetJoinTokenResp
+	GetMeetingRecordsReq                   = rtc.GetMeetingRecordsReq
+	GetMeetingRecordsResp                  = rtc.GetMeetingRecordsResp
+	GetSignalInvitationInfoReq             = rtc.GetSignalInvitationInfoReq
+	GetSignalInvitationInfoResp            = rtc.GetSignalInvitationInfoResp
+	GetSignalInvitationInfoStartAppReq     = rtc.GetSignalInvitationInfoStartAppReq
+	GetSignalInvitationInfoStartAppResp    = rtc.GetSignalInvitationInfoStartAppResp
+	GetSignalInvitationRecordsReq          = rtc.GetSignalInvitationRecordsReq
+	GetSignalInvitationRecordsResp         = rtc.GetSignalInvitationRecordsResp
+	GroupInfo                              = rtc.GroupInfo
+	GroupMemberFullInfo                    = rtc.GroupMemberFullInfo
+	Int32Value                             = rtc.Int32Value
+	Int64Value                             = rtc.Int64Value
+	InvitationInfo                         = rtc.InvitationInfo
+	MeetingInfo                            = rtc.MeetingInfo
+	MeetingRecord                          = rtc.MeetingRecord
+	MeetingUser                            = rtc.MeetingUser
+	OfflinePushInfo                        = rtc.OfflinePushInfo
+	ParticipantMetaData                    = rtc.ParticipantMetaData
+	PublicUserInfo                         = rtc.PublicUserInfo
+	RequestPagination                      = rtc.RequestPagination
+	SignalAcceptReq                        = rtc.SignalAcceptReq
+	SignalAcceptResp                       = rtc.SignalAcceptResp
+	SignalCancelReq                        = rtc.SignalCancelReq
+	SignalCancelResp                       = rtc.SignalCancelResp
+	SignalCloseRoomReq                     = rtc.SignalCloseRoomReq
+	SignalCloseRoomResp                    = rtc.SignalCloseRoomResp
+	SignalCreateMeetingReq                 = rtc.SignalCreateMeetingReq
+	SignalCreateMeetingResp                = rtc.SignalCreateMeetingResp
+	SignalGetMeetingsReq                   = rtc.SignalGetMeetingsReq
+	SignalGetMeetingsResp                  = rtc.SignalGetMeetingsResp
+	SignalGetRoomByGroupIDReq              = rtc.SignalGetRoomByGroupIDReq
+	SignalGetRoomByGroupIDResp             = rtc.SignalGetRoomByGroupIDResp
+	SignalGetRoomsReq                      = rtc.SignalGetRoomsReq
+	SignalGetRoomsResp                     = rtc.SignalGetRoomsResp
+	SignalGetTokenByRoomIDReq              = rtc.SignalGetTokenByRoomIDReq
+	SignalGetTokenByRoomIDResp             = rtc.SignalGetTokenByRoomIDResp
+	SignalHungUpReq                        = rtc.SignalHungUpReq
+	SignalHungUpResp                       = rtc.SignalHungUpResp
+	SignalInviteInGroupReq                 = rtc.SignalInviteInGroupReq
+	SignalInviteInGroupResp                = rtc.SignalInviteInGroupResp
+	SignalInviteReq                        = rtc.SignalInviteReq
+	SignalInviteResp                       = rtc.SignalInviteResp
+	SignalJoinMeetingReq                   = rtc.SignalJoinMeetingReq
+	SignalJoinMeetingResp                  = rtc.SignalJoinMeetingResp
+	SignalMessageAssembleReq               = rtc.SignalMessageAssembleReq
+	SignalMessageAssembleResp              = rtc.SignalMessageAssembleResp
+	SignalOnRoomParticipantConnectedReq    = rtc.SignalOnRoomParticipantConnectedReq
+	SignalOnRoomParticipantDisconnectedReq = rtc.SignalOnRoomParticipantDisconnectedReq
+	SignalOnStreamChangeReq                = rtc.SignalOnStreamChangeReq
+	SignalOperateStreamReq                 = rtc.SignalOperateStreamReq
+	SignalOperateStreamResp                = rtc.SignalOperateStreamResp
+	SignalRecord                           = rtc.SignalRecord
+	SignalRejectReq                        = rtc.SignalRejectReq
+	SignalRejectResp                       = rtc.SignalRejectResp
+	SignalReq                              = rtc.SignalReq
+	SignalResp                             = rtc.SignalResp
+	SignalSendCustomSignalReq              = rtc.SignalSendCustomSignalReq
+	SignalSendCustomSignalResp             = rtc.SignalSendCustomSignalResp
+	SignalUpdateMeetingInfoReq             = rtc.SignalUpdateMeetingInfoReq
+	SignalUpdateMeetingInfoResp            = rtc.SignalUpdateMeetingInfoResp
+	SignalUser                             = rtc.SignalUser
+	StringValue                            = rtc.StringValue
+	UInt32Value                            = rtc.UInt32Value
+	UInt64Value                            = rtc.UInt64Value
+	UserInfo                               = rtc.UserInfo
+
+	RtcService interface {
+		SignalMessageAssemble(ctx context.Context, in *SignalMessageAssembleReq, opts ...grpc.CallOption) (*SignalMessageAssembleResp, error)
+		SignalGetRoomByGroupID(ctx context.Context, in *SignalGetRoomByGroupIDReq, opts ...grpc.CallOption) (*SignalGetRoomByGroupIDResp, error)
+		SignalGetTokenByRoomID(ctx context.Context, in *SignalGetTokenByRoomIDReq, opts ...grpc.CallOption) (*SignalGetTokenByRoomIDResp, error)
+		SignalGetRooms(ctx context.Context, in *SignalGetRoomsReq, opts ...grpc.CallOption) (*SignalGetRoomsResp, error)
+		GetSignalInvitationInfo(ctx context.Context, in *GetSignalInvitationInfoReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoResp, error)
+		GetSignalInvitationInfoStartApp(ctx context.Context, in *GetSignalInvitationInfoStartAppReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoStartAppResp, error)
+		// meeting
+		SignalCreateMeeting(ctx context.Context, in *SignalCreateMeetingReq, opts ...grpc.CallOption) (*SignalCreateMeetingResp, error)
+		SignalJoinMeeting(ctx context.Context, in *SignalJoinMeetingReq, opts ...grpc.CallOption) (*SignalJoinMeetingResp, error)
+		SignalUpdateMeetingInfo(ctx context.Context, in *SignalUpdateMeetingInfoReq, opts ...grpc.CallOption) (*SignalUpdateMeetingInfoResp, error)
+		SignalCloseRoom(ctx context.Context, in *SignalCloseRoomReq, opts ...grpc.CallOption) (*SignalCloseRoomResp, error)
+		SignalGetMeetings(ctx context.Context, in *SignalGetMeetingsReq, opts ...grpc.CallOption) (*SignalGetMeetingsResp, error)
+		SignalOperateStream(ctx context.Context, in *SignalOperateStreamReq, opts ...grpc.CallOption) (*SignalOperateStreamResp, error)
+		// custom signal
+		SignalSendCustomSignal(ctx context.Context, in *SignalSendCustomSignalReq, opts ...grpc.CallOption) (*SignalSendCustomSignalResp, error)
+		// rtc cms
+		GetSignalInvitationRecords(ctx context.Context, in *GetSignalInvitationRecordsReq, opts ...grpc.CallOption) (*GetSignalInvitationRecordsResp, error)
+		DeleteSignalRecords(ctx context.Context, in *DeleteSignalRecordsReq, opts ...grpc.CallOption) (*DeleteSignalRecordsResp, error)
+		GetMeetingRecords(ctx context.Context, in *GetMeetingRecordsReq, opts ...grpc.CallOption) (*GetMeetingRecordsResp, error)
+		DeleteMeetingRecords(ctx context.Context, in *DeleteMeetingRecordsReq, opts ...grpc.CallOption) (*DeleteMeetingRecordsResp, error)
+	}
+
+	defaultRtcService struct {
+		cli zrpc.Client
+	}
+)
+
+func NewRtcService(cli zrpc.Client) RtcService {
+	return &defaultRtcService{
+		cli: cli,
+	}
+}
+
+func (m *defaultRtcService) SignalMessageAssemble(ctx context.Context, in *SignalMessageAssembleReq, opts ...grpc.CallOption) (*SignalMessageAssembleResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalMessageAssemble(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalGetRoomByGroupID(ctx context.Context, in *SignalGetRoomByGroupIDReq, opts ...grpc.CallOption) (*SignalGetRoomByGroupIDResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalGetRoomByGroupID(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalGetTokenByRoomID(ctx context.Context, in *SignalGetTokenByRoomIDReq, opts ...grpc.CallOption) (*SignalGetTokenByRoomIDResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalGetTokenByRoomID(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalGetRooms(ctx context.Context, in *SignalGetRoomsReq, opts ...grpc.CallOption) (*SignalGetRoomsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalGetRooms(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) GetSignalInvitationInfo(ctx context.Context, in *GetSignalInvitationInfoReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.GetSignalInvitationInfo(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) GetSignalInvitationInfoStartApp(ctx context.Context, in *GetSignalInvitationInfoStartAppReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoStartAppResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.GetSignalInvitationInfoStartApp(ctx, in, opts...)
+}
+
+// meeting
+func (m *defaultRtcService) SignalCreateMeeting(ctx context.Context, in *SignalCreateMeetingReq, opts ...grpc.CallOption) (*SignalCreateMeetingResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalCreateMeeting(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalJoinMeeting(ctx context.Context, in *SignalJoinMeetingReq, opts ...grpc.CallOption) (*SignalJoinMeetingResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalJoinMeeting(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalUpdateMeetingInfo(ctx context.Context, in *SignalUpdateMeetingInfoReq, opts ...grpc.CallOption) (*SignalUpdateMeetingInfoResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalUpdateMeetingInfo(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalCloseRoom(ctx context.Context, in *SignalCloseRoomReq, opts ...grpc.CallOption) (*SignalCloseRoomResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalCloseRoom(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalGetMeetings(ctx context.Context, in *SignalGetMeetingsReq, opts ...grpc.CallOption) (*SignalGetMeetingsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalGetMeetings(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) SignalOperateStream(ctx context.Context, in *SignalOperateStreamReq, opts ...grpc.CallOption) (*SignalOperateStreamResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalOperateStream(ctx, in, opts...)
+}
+
+// custom signal
+func (m *defaultRtcService) SignalSendCustomSignal(ctx context.Context, in *SignalSendCustomSignalReq, opts ...grpc.CallOption) (*SignalSendCustomSignalResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.SignalSendCustomSignal(ctx, in, opts...)
+}
+
+// rtc cms
+func (m *defaultRtcService) GetSignalInvitationRecords(ctx context.Context, in *GetSignalInvitationRecordsReq, opts ...grpc.CallOption) (*GetSignalInvitationRecordsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.GetSignalInvitationRecords(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) DeleteSignalRecords(ctx context.Context, in *DeleteSignalRecordsReq, opts ...grpc.CallOption) (*DeleteSignalRecordsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.DeleteSignalRecords(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) GetMeetingRecords(ctx context.Context, in *GetMeetingRecordsReq, opts ...grpc.CallOption) (*GetMeetingRecordsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.GetMeetingRecords(ctx, in, opts...)
+}
+
+func (m *defaultRtcService) DeleteMeetingRecords(ctx context.Context, in *DeleteMeetingRecordsReq, opts ...grpc.CallOption) (*DeleteMeetingRecordsResp, error) {
+	client := rtc.NewRtcServiceClient(m.cli.Conn())
+	return client.DeleteMeetingRecords(ctx, in, opts...)
+}

+ 32 - 0
etc/rtc.yaml

@@ -0,0 +1,32 @@
+Name: openim
+ListenOn: 0.0.0.0:11200
+Etcd:
+  Hosts:
+  - 127.0.0.1:12379
+  Key: /openim/signal
+
+Redis:
+  Host: "127.0.0.1:16379"  # Redis 主机地址
+  Type: node
+  Pass: "KRXbzyT1mLseE8GJ8UgCir0txCf"       # 如果 Redis 有密码,可以在这里设置
+  Tls: false         # 最小空闲连接数
+
+openimRpcName:
+  user: user
+  msg: msg
+
+rpc:
+  listenIP: ""
+  registerIP: ""
+
+  rtc:
+    name: rtc
+    port:
+      - 11200
+
+rtc:
+  url:
+    - ws://localhost:7880 # External Address
+  # innerUrl: ws://localhost:7880 # Internal Address
+  apiKey: "APIGPxHjU9iCgGo"
+  apiSecret: "5XsotiNCkAkW2nrGeAt48aWxnwHjAnrX1aeRFo9tuKI"

+ 90 - 0
go.mod

@@ -0,0 +1,90 @@
+module self-im-rtc
+
+go 1.23.2
+
+require (
+	github.com/zeromicro/go-zero v1.8.2
+	google.golang.org/grpc v1.72.0
+	google.golang.org/protobuf v1.36.6
+)
+
+require (
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+	github.com/fatih/color v1.18.0 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/swag v0.22.4 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/mock v1.6.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/google/gnostic-models v0.6.8 // indirect
+	github.com/google/go-cmp v0.6.0 // indirect
+	github.com/google/gofuzz v1.2.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.17.11 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+	github.com/openzipkin/zipkin-go v0.4.3 // indirect
+	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+	github.com/prometheus/client_golang v1.21.1 // indirect
+	github.com/prometheus/client_model v0.6.1 // indirect
+	github.com/prometheus/common v0.62.0 // indirect
+	github.com/prometheus/procfs v0.15.1 // indirect
+	github.com/redis/go-redis/v9 v9.7.3 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.15 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/otel v1.34.0 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.34.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
+	go.opentelemetry.io/otel/trace v1.34.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.6.0 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/net v0.35.0 // indirect
+	golang.org/x/oauth2 v0.26.0 // indirect
+	golang.org/x/sys v0.30.0 // indirect
+	golang.org/x/term v0.29.0 // indirect
+	golang.org/x/text v0.22.0 // indirect
+	golang.org/x/time v0.10.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	k8s.io/api v0.29.3 // indirect
+	k8s.io/apimachinery v0.29.4 // indirect
+	k8s.io/client-go v0.29.3 // indirect
+	k8s.io/klog/v2 v2.110.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
+	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
+)

+ 279 - 0
go.sum

@@ -0,0 +1,279 @@
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE=
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0=
+github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
+github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
+github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
+github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
+github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
+github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
+github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
+github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
+github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
+github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
+github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg=
+github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
+github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
+github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
+github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
+github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
+github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
+github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/zeromicro/go-zero v1.8.2 h1:AbJckBoojbr1lqCN1dkvURTIHOau7yvKReEd7ZmjuCk=
+github.com/zeromicro/go-zero v1.8.2/go.mod h1:G5dF+jzCEuq0t1j8qdrtVAy30QMgctGcKSfqFIGsvSg=
+go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk=
+go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU=
+go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4=
+go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU=
+go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
+go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
+go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
+go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM=
+go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
+go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
+go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
+go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
+go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
+go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
+go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
+go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
+go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
+go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
+golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
+golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
+golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
+golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
+golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
+golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
+golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0=
+google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a h1:51aaUVRocpvUOSQKM6Q7VuoaktNIaMCLuhZB6DKksq4=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
+google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM=
+google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
+gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw=
+k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80=
+k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q=
+k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg=
+k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0=
+k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
+k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=

+ 7 - 0
internal/config/config.go

@@ -0,0 +1,7 @@
+package config
+
+import "github.com/zeromicro/go-zero/zrpc"
+
+type Config struct {
+	zrpc.RpcServerConf
+}

+ 30 - 0
internal/logic/rtcservice/deletemeetingrecordslogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DeleteMeetingRecordsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDeleteMeetingRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteMeetingRecordsLogic {
+	return &DeleteMeetingRecordsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DeleteMeetingRecordsLogic) DeleteMeetingRecords(in *rtc.DeleteMeetingRecordsReq) (*rtc.DeleteMeetingRecordsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.DeleteMeetingRecordsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/deletesignalrecordslogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DeleteSignalRecordsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDeleteSignalRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteSignalRecordsLogic {
+	return &DeleteSignalRecordsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DeleteSignalRecordsLogic) DeleteSignalRecords(in *rtc.DeleteSignalRecordsReq) (*rtc.DeleteSignalRecordsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.DeleteSignalRecordsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/getmeetingrecordslogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetMeetingRecordsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewGetMeetingRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMeetingRecordsLogic {
+	return &GetMeetingRecordsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *GetMeetingRecordsLogic) GetMeetingRecords(in *rtc.GetMeetingRecordsReq) (*rtc.GetMeetingRecordsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.GetMeetingRecordsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/getsignalinvitationinfologic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetSignalInvitationInfoLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewGetSignalInvitationInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetSignalInvitationInfoLogic {
+	return &GetSignalInvitationInfoLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *GetSignalInvitationInfoLogic) GetSignalInvitationInfo(in *rtc.GetSignalInvitationInfoReq) (*rtc.GetSignalInvitationInfoResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.GetSignalInvitationInfoResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/getsignalinvitationinfostartapplogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetSignalInvitationInfoStartAppLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewGetSignalInvitationInfoStartAppLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetSignalInvitationInfoStartAppLogic {
+	return &GetSignalInvitationInfoStartAppLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *GetSignalInvitationInfoStartAppLogic) GetSignalInvitationInfoStartApp(in *rtc.GetSignalInvitationInfoStartAppReq) (*rtc.GetSignalInvitationInfoStartAppResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.GetSignalInvitationInfoStartAppResp{}, nil
+}

+ 31 - 0
internal/logic/rtcservice/getsignalinvitationrecordslogic.go

@@ -0,0 +1,31 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type GetSignalInvitationRecordsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewGetSignalInvitationRecordsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetSignalInvitationRecordsLogic {
+	return &GetSignalInvitationRecordsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// rtc cms
+func (l *GetSignalInvitationRecordsLogic) GetSignalInvitationRecords(in *rtc.GetSignalInvitationRecordsReq) (*rtc.GetSignalInvitationRecordsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.GetSignalInvitationRecordsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalcloseroomlogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalCloseRoomLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalCloseRoomLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalCloseRoomLogic {
+	return &SignalCloseRoomLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalCloseRoomLogic) SignalCloseRoom(in *rtc.SignalCloseRoomReq) (*rtc.SignalCloseRoomResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalCloseRoomResp{}, nil
+}

+ 31 - 0
internal/logic/rtcservice/signalcreatemeetinglogic.go

@@ -0,0 +1,31 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalCreateMeetingLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalCreateMeetingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalCreateMeetingLogic {
+	return &SignalCreateMeetingLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// meeting
+func (l *SignalCreateMeetingLogic) SignalCreateMeeting(in *rtc.SignalCreateMeetingReq) (*rtc.SignalCreateMeetingResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalCreateMeetingResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalgetmeetingslogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalGetMeetingsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalGetMeetingsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalGetMeetingsLogic {
+	return &SignalGetMeetingsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalGetMeetingsLogic) SignalGetMeetings(in *rtc.SignalGetMeetingsReq) (*rtc.SignalGetMeetingsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalGetMeetingsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalgetroombygroupidlogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalGetRoomByGroupIDLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalGetRoomByGroupIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalGetRoomByGroupIDLogic {
+	return &SignalGetRoomByGroupIDLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalGetRoomByGroupIDLogic) SignalGetRoomByGroupID(in *rtc.SignalGetRoomByGroupIDReq) (*rtc.SignalGetRoomByGroupIDResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalGetRoomByGroupIDResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalgetroomslogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalGetRoomsLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalGetRoomsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalGetRoomsLogic {
+	return &SignalGetRoomsLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalGetRoomsLogic) SignalGetRooms(in *rtc.SignalGetRoomsReq) (*rtc.SignalGetRoomsResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalGetRoomsResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalgettokenbyroomidlogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalGetTokenByRoomIDLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalGetTokenByRoomIDLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalGetTokenByRoomIDLogic {
+	return &SignalGetTokenByRoomIDLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalGetTokenByRoomIDLogic) SignalGetTokenByRoomID(in *rtc.SignalGetTokenByRoomIDReq) (*rtc.SignalGetTokenByRoomIDResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalGetTokenByRoomIDResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signaljoinmeetinglogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalJoinMeetingLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalJoinMeetingLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalJoinMeetingLogic {
+	return &SignalJoinMeetingLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalJoinMeetingLogic) SignalJoinMeeting(in *rtc.SignalJoinMeetingReq) (*rtc.SignalJoinMeetingResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalJoinMeetingResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalmessageassemblelogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalMessageAssembleLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalMessageAssembleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalMessageAssembleLogic {
+	return &SignalMessageAssembleLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalMessageAssembleLogic) SignalMessageAssemble(in *rtc.SignalMessageAssembleReq) (*rtc.SignalMessageAssembleResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalMessageAssembleResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signaloperatestreamlogic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalOperateStreamLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalOperateStreamLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalOperateStreamLogic {
+	return &SignalOperateStreamLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalOperateStreamLogic) SignalOperateStream(in *rtc.SignalOperateStreamReq) (*rtc.SignalOperateStreamResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalOperateStreamResp{}, nil
+}

+ 31 - 0
internal/logic/rtcservice/signalsendcustomsignallogic.go

@@ -0,0 +1,31 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalSendCustomSignalLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalSendCustomSignalLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalSendCustomSignalLogic {
+	return &SignalSendCustomSignalLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+// custom signal
+func (l *SignalSendCustomSignalLogic) SignalSendCustomSignal(in *rtc.SignalSendCustomSignalReq) (*rtc.SignalSendCustomSignalResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalSendCustomSignalResp{}, nil
+}

+ 30 - 0
internal/logic/rtcservice/signalupdatemeetinginfologic.go

@@ -0,0 +1,30 @@
+package rtcservicelogic
+
+import (
+	"context"
+
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SignalUpdateMeetingInfoLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSignalUpdateMeetingInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SignalUpdateMeetingInfoLogic {
+	return &SignalUpdateMeetingInfoLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *SignalUpdateMeetingInfoLogic) SignalUpdateMeetingInfo(in *rtc.SignalUpdateMeetingInfoReq) (*rtc.SignalUpdateMeetingInfoResp, error) {
+	// todo: add your logic here and delete this line
+
+	return &rtc.SignalUpdateMeetingInfoResp{}, nil
+}

+ 112 - 0
internal/server/rtcservice/rtcserviceserver.go

@@ -0,0 +1,112 @@
+// Code generated by goctl. DO NOT EDIT.
+// goctl 1.7.3
+// Source: rtc.proto
+
+package server
+
+import (
+	"context"
+
+	"self-im-rtc/internal/logic/rtcservice"
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+)
+
+type RtcServiceServer struct {
+	svcCtx *svc.ServiceContext
+	rtc.UnimplementedRtcServiceServer
+}
+
+func NewRtcServiceServer(svcCtx *svc.ServiceContext) *RtcServiceServer {
+	return &RtcServiceServer{
+		svcCtx: svcCtx,
+	}
+}
+
+func (s *RtcServiceServer) SignalMessageAssemble(ctx context.Context, in *rtc.SignalMessageAssembleReq) (*rtc.SignalMessageAssembleResp, error) {
+	l := rtcservicelogic.NewSignalMessageAssembleLogic(ctx, s.svcCtx)
+	return l.SignalMessageAssemble(in)
+}
+
+func (s *RtcServiceServer) SignalGetRoomByGroupID(ctx context.Context, in *rtc.SignalGetRoomByGroupIDReq) (*rtc.SignalGetRoomByGroupIDResp, error) {
+	l := rtcservicelogic.NewSignalGetRoomByGroupIDLogic(ctx, s.svcCtx)
+	return l.SignalGetRoomByGroupID(in)
+}
+
+func (s *RtcServiceServer) SignalGetTokenByRoomID(ctx context.Context, in *rtc.SignalGetTokenByRoomIDReq) (*rtc.SignalGetTokenByRoomIDResp, error) {
+	l := rtcservicelogic.NewSignalGetTokenByRoomIDLogic(ctx, s.svcCtx)
+	return l.SignalGetTokenByRoomID(in)
+}
+
+func (s *RtcServiceServer) SignalGetRooms(ctx context.Context, in *rtc.SignalGetRoomsReq) (*rtc.SignalGetRoomsResp, error) {
+	l := rtcservicelogic.NewSignalGetRoomsLogic(ctx, s.svcCtx)
+	return l.SignalGetRooms(in)
+}
+
+func (s *RtcServiceServer) GetSignalInvitationInfo(ctx context.Context, in *rtc.GetSignalInvitationInfoReq) (*rtc.GetSignalInvitationInfoResp, error) {
+	l := rtcservicelogic.NewGetSignalInvitationInfoLogic(ctx, s.svcCtx)
+	return l.GetSignalInvitationInfo(in)
+}
+
+func (s *RtcServiceServer) GetSignalInvitationInfoStartApp(ctx context.Context, in *rtc.GetSignalInvitationInfoStartAppReq) (*rtc.GetSignalInvitationInfoStartAppResp, error) {
+	l := rtcservicelogic.NewGetSignalInvitationInfoStartAppLogic(ctx, s.svcCtx)
+	return l.GetSignalInvitationInfoStartApp(in)
+}
+
+// meeting
+func (s *RtcServiceServer) SignalCreateMeeting(ctx context.Context, in *rtc.SignalCreateMeetingReq) (*rtc.SignalCreateMeetingResp, error) {
+	l := rtcservicelogic.NewSignalCreateMeetingLogic(ctx, s.svcCtx)
+	return l.SignalCreateMeeting(in)
+}
+
+func (s *RtcServiceServer) SignalJoinMeeting(ctx context.Context, in *rtc.SignalJoinMeetingReq) (*rtc.SignalJoinMeetingResp, error) {
+	l := rtcservicelogic.NewSignalJoinMeetingLogic(ctx, s.svcCtx)
+	return l.SignalJoinMeeting(in)
+}
+
+func (s *RtcServiceServer) SignalUpdateMeetingInfo(ctx context.Context, in *rtc.SignalUpdateMeetingInfoReq) (*rtc.SignalUpdateMeetingInfoResp, error) {
+	l := rtcservicelogic.NewSignalUpdateMeetingInfoLogic(ctx, s.svcCtx)
+	return l.SignalUpdateMeetingInfo(in)
+}
+
+func (s *RtcServiceServer) SignalCloseRoom(ctx context.Context, in *rtc.SignalCloseRoomReq) (*rtc.SignalCloseRoomResp, error) {
+	l := rtcservicelogic.NewSignalCloseRoomLogic(ctx, s.svcCtx)
+	return l.SignalCloseRoom(in)
+}
+
+func (s *RtcServiceServer) SignalGetMeetings(ctx context.Context, in *rtc.SignalGetMeetingsReq) (*rtc.SignalGetMeetingsResp, error) {
+	l := rtcservicelogic.NewSignalGetMeetingsLogic(ctx, s.svcCtx)
+	return l.SignalGetMeetings(in)
+}
+
+func (s *RtcServiceServer) SignalOperateStream(ctx context.Context, in *rtc.SignalOperateStreamReq) (*rtc.SignalOperateStreamResp, error) {
+	l := rtcservicelogic.NewSignalOperateStreamLogic(ctx, s.svcCtx)
+	return l.SignalOperateStream(in)
+}
+
+// custom signal
+func (s *RtcServiceServer) SignalSendCustomSignal(ctx context.Context, in *rtc.SignalSendCustomSignalReq) (*rtc.SignalSendCustomSignalResp, error) {
+	l := rtcservicelogic.NewSignalSendCustomSignalLogic(ctx, s.svcCtx)
+	return l.SignalSendCustomSignal(in)
+}
+
+// rtc cms
+func (s *RtcServiceServer) GetSignalInvitationRecords(ctx context.Context, in *rtc.GetSignalInvitationRecordsReq) (*rtc.GetSignalInvitationRecordsResp, error) {
+	l := rtcservicelogic.NewGetSignalInvitationRecordsLogic(ctx, s.svcCtx)
+	return l.GetSignalInvitationRecords(in)
+}
+
+func (s *RtcServiceServer) DeleteSignalRecords(ctx context.Context, in *rtc.DeleteSignalRecordsReq) (*rtc.DeleteSignalRecordsResp, error) {
+	l := rtcservicelogic.NewDeleteSignalRecordsLogic(ctx, s.svcCtx)
+	return l.DeleteSignalRecords(in)
+}
+
+func (s *RtcServiceServer) GetMeetingRecords(ctx context.Context, in *rtc.GetMeetingRecordsReq) (*rtc.GetMeetingRecordsResp, error) {
+	l := rtcservicelogic.NewGetMeetingRecordsLogic(ctx, s.svcCtx)
+	return l.GetMeetingRecords(in)
+}
+
+func (s *RtcServiceServer) DeleteMeetingRecords(ctx context.Context, in *rtc.DeleteMeetingRecordsReq) (*rtc.DeleteMeetingRecordsResp, error) {
+	l := rtcservicelogic.NewDeleteMeetingRecordsLogic(ctx, s.svcCtx)
+	return l.DeleteMeetingRecords(in)
+}

+ 13 - 0
internal/svc/servicecontext.go

@@ -0,0 +1,13 @@
+package svc
+
+import "self-im-rtc/internal/config"
+
+type ServiceContext struct {
+	Config config.Config
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	return &ServiceContext{
+		Config: c,
+	}
+}

+ 6340 - 0
pb/rtc/rtc.pb.go

@@ -0,0 +1,6340 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.36.1
+// 	protoc        v5.29.3
+// source: rtc.proto
+
+package rtc
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type ParticipantMetaData struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	GroupInfo       *GroupInfo             `protobuf:"bytes,1,opt,name=groupInfo,proto3" json:"groupInfo,omitempty"`
+	GroupMemberInfo *GroupMemberFullInfo   `protobuf:"bytes,2,opt,name=groupMemberInfo,proto3" json:"groupMemberInfo,omitempty"`
+	UserInfo        *PublicUserInfo        `protobuf:"bytes,3,opt,name=userInfo,proto3" json:"userInfo,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *ParticipantMetaData) Reset() {
+	*x = ParticipantMetaData{}
+	mi := &file_rtc_proto_msgTypes[0]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *ParticipantMetaData) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ParticipantMetaData) ProtoMessage() {}
+
+func (x *ParticipantMetaData) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[0]
+	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 ParticipantMetaData.ProtoReflect.Descriptor instead.
+func (*ParticipantMetaData) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *ParticipantMetaData) GetGroupInfo() *GroupInfo {
+	if x != nil {
+		return x.GroupInfo
+	}
+	return nil
+}
+
+func (x *ParticipantMetaData) GetGroupMemberInfo() *GroupMemberFullInfo {
+	if x != nil {
+		return x.GroupMemberInfo
+	}
+	return nil
+}
+
+func (x *ParticipantMetaData) GetUserInfo() *PublicUserInfo {
+	if x != nil {
+		return x.UserInfo
+	}
+	return nil
+}
+
+type GroupInfo struct {
+	state                  protoimpl.MessageState `protogen:"open.v1"`
+	GroupID                string                 `protobuf:"bytes,1,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	GroupName              string                 `protobuf:"bytes,2,opt,name=groupName,proto3" json:"groupName,omitempty"`
+	Notification           string                 `protobuf:"bytes,3,opt,name=notification,proto3" json:"notification,omitempty"`
+	Introduction           string                 `protobuf:"bytes,4,opt,name=introduction,proto3" json:"introduction,omitempty"`
+	FaceURL                string                 `protobuf:"bytes,5,opt,name=faceURL,proto3" json:"faceURL,omitempty"`
+	OwnerUserID            string                 `protobuf:"bytes,6,opt,name=ownerUserID,proto3" json:"ownerUserID,omitempty"`
+	CreateTime             int64                  `protobuf:"varint,7,opt,name=createTime,proto3" json:"createTime,omitempty"`
+	MemberCount            uint32                 `protobuf:"varint,8,opt,name=memberCount,proto3" json:"memberCount,omitempty"`
+	Ex                     string                 `protobuf:"bytes,9,opt,name=ex,proto3" json:"ex,omitempty"`
+	Status                 int32                  `protobuf:"varint,10,opt,name=status,proto3" json:"status,omitempty"`
+	CreatorUserID          string                 `protobuf:"bytes,11,opt,name=creatorUserID,proto3" json:"creatorUserID,omitempty"`
+	GroupType              int32                  `protobuf:"varint,12,opt,name=groupType,proto3" json:"groupType,omitempty"`
+	NeedVerification       int32                  `protobuf:"varint,13,opt,name=needVerification,proto3" json:"needVerification,omitempty"`
+	LookMemberInfo         int32                  `protobuf:"varint,14,opt,name=lookMemberInfo,proto3" json:"lookMemberInfo,omitempty"`
+	ApplyMemberFriend      int32                  `protobuf:"varint,15,opt,name=applyMemberFriend,proto3" json:"applyMemberFriend,omitempty"`
+	NotificationUpdateTime int64                  `protobuf:"varint,16,opt,name=notificationUpdateTime,proto3" json:"notificationUpdateTime,omitempty"`
+	NotificationUserID     string                 `protobuf:"bytes,17,opt,name=notificationUserID,proto3" json:"notificationUserID,omitempty"`
+	DisplayIsRead          bool                   `protobuf:"varint,18,opt,name=displayIsRead,proto3" json:"displayIsRead,omitempty"`
+	unknownFields          protoimpl.UnknownFields
+	sizeCache              protoimpl.SizeCache
+}
+
+func (x *GroupInfo) Reset() {
+	*x = GroupInfo{}
+	mi := &file_rtc_proto_msgTypes[1]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GroupInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupInfo) ProtoMessage() {}
+
+func (x *GroupInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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)
+}
+
+// Deprecated: Use GroupInfo.ProtoReflect.Descriptor instead.
+func (*GroupInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GroupInfo) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetGroupName() string {
+	if x != nil {
+		return x.GroupName
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetNotification() string {
+	if x != nil {
+		return x.Notification
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetIntroduction() string {
+	if x != nil {
+		return x.Introduction
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetFaceURL() string {
+	if x != nil {
+		return x.FaceURL
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetOwnerUserID() string {
+	if x != nil {
+		return x.OwnerUserID
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetCreateTime() int64 {
+	if x != nil {
+		return x.CreateTime
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetMemberCount() uint32 {
+	if x != nil {
+		return x.MemberCount
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetCreatorUserID() string {
+	if x != nil {
+		return x.CreatorUserID
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetGroupType() int32 {
+	if x != nil {
+		return x.GroupType
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetNeedVerification() int32 {
+	if x != nil {
+		return x.NeedVerification
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetLookMemberInfo() int32 {
+	if x != nil {
+		return x.LookMemberInfo
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetApplyMemberFriend() int32 {
+	if x != nil {
+		return x.ApplyMemberFriend
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetNotificationUpdateTime() int64 {
+	if x != nil {
+		return x.NotificationUpdateTime
+	}
+	return 0
+}
+
+func (x *GroupInfo) GetNotificationUserID() string {
+	if x != nil {
+		return x.NotificationUserID
+	}
+	return ""
+}
+
+func (x *GroupInfo) GetDisplayIsRead() bool {
+	if x != nil {
+		return x.DisplayIsRead
+	}
+	return false
+}
+
+type GroupMemberFullInfo struct {
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	GroupID        string                 `protobuf:"bytes,1,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	UserID         string                 `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID,omitempty"`
+	RoleLevel      int32                  `protobuf:"varint,3,opt,name=roleLevel,proto3" json:"roleLevel,omitempty"`
+	JoinTime       int64                  `protobuf:"varint,4,opt,name=joinTime,proto3" json:"joinTime,omitempty"`
+	Nickname       string                 `protobuf:"bytes,5,opt,name=nickname,proto3" json:"nickname,omitempty"`
+	FaceURL        string                 `protobuf:"bytes,6,opt,name=faceURL,proto3" json:"faceURL,omitempty"`
+	AppMangerLevel int32                  `protobuf:"varint,7,opt,name=appMangerLevel,proto3" json:"appMangerLevel,omitempty"` //if >0
+	JoinSource     int32                  `protobuf:"varint,8,opt,name=joinSource,proto3" json:"joinSource,omitempty"`
+	OperatorUserID string                 `protobuf:"bytes,9,opt,name=operatorUserID,proto3" json:"operatorUserID,omitempty"`
+	Ex             string                 `protobuf:"bytes,10,opt,name=ex,proto3" json:"ex,omitempty"`
+	MuteEndTime    int64                  `protobuf:"varint,11,opt,name=muteEndTime,proto3" json:"muteEndTime,omitempty"`
+	InviterUserID  string                 `protobuf:"bytes,12,opt,name=inviterUserID,proto3" json:"inviterUserID,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
+}
+
+func (x *GroupMemberFullInfo) Reset() {
+	*x = GroupMemberFullInfo{}
+	mi := &file_rtc_proto_msgTypes[2]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GroupMemberFullInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GroupMemberFullInfo) ProtoMessage() {}
+
+func (x *GroupMemberFullInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[2]
+	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 GroupMemberFullInfo.ProtoReflect.Descriptor instead.
+func (*GroupMemberFullInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *GroupMemberFullInfo) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetRoleLevel() int32 {
+	if x != nil {
+		return x.RoleLevel
+	}
+	return 0
+}
+
+func (x *GroupMemberFullInfo) GetJoinTime() int64 {
+	if x != nil {
+		return x.JoinTime
+	}
+	return 0
+}
+
+func (x *GroupMemberFullInfo) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetFaceURL() string {
+	if x != nil {
+		return x.FaceURL
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetAppMangerLevel() int32 {
+	if x != nil {
+		return x.AppMangerLevel
+	}
+	return 0
+}
+
+func (x *GroupMemberFullInfo) GetJoinSource() int32 {
+	if x != nil {
+		return x.JoinSource
+	}
+	return 0
+}
+
+func (x *GroupMemberFullInfo) GetOperatorUserID() string {
+	if x != nil {
+		return x.OperatorUserID
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *GroupMemberFullInfo) GetMuteEndTime() int64 {
+	if x != nil {
+		return x.MuteEndTime
+	}
+	return 0
+}
+
+func (x *GroupMemberFullInfo) GetInviterUserID() string {
+	if x != nil {
+		return x.InviterUserID
+	}
+	return ""
+}
+
+type PublicUserInfo struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserID        string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	Nickname      string                 `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"`
+	FaceURL       string                 `protobuf:"bytes,3,opt,name=faceURL,proto3" json:"faceURL,omitempty"`
+	Ex            string                 `protobuf:"bytes,4,opt,name=ex,proto3" json:"ex,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *PublicUserInfo) Reset() {
+	*x = PublicUserInfo{}
+	mi := &file_rtc_proto_msgTypes[3]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PublicUserInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PublicUserInfo) ProtoMessage() {}
+
+func (x *PublicUserInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 PublicUserInfo.ProtoReflect.Descriptor instead.
+func (*PublicUserInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *PublicUserInfo) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *PublicUserInfo) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *PublicUserInfo) GetFaceURL() string {
+	if x != nil {
+		return x.FaceURL
+	}
+	return ""
+}
+
+func (x *PublicUserInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+type GetJoinTokenReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Room          string                 `protobuf:"bytes,1,opt,name=room,proto3" json:"room,omitempty"`
+	Identity      string                 `protobuf:"bytes,2,opt,name=identity,proto3" json:"identity,omitempty"`
+	MetaData      *ParticipantMetaData   `protobuf:"bytes,3,opt,name=metaData,proto3" json:"metaData,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetJoinTokenReq) Reset() {
+	*x = GetJoinTokenReq{}
+	mi := &file_rtc_proto_msgTypes[4]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetJoinTokenReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetJoinTokenReq) ProtoMessage() {}
+
+func (x *GetJoinTokenReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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)
+}
+
+// Deprecated: Use GetJoinTokenReq.ProtoReflect.Descriptor instead.
+func (*GetJoinTokenReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *GetJoinTokenReq) GetRoom() string {
+	if x != nil {
+		return x.Room
+	}
+	return ""
+}
+
+func (x *GetJoinTokenReq) GetIdentity() string {
+	if x != nil {
+		return x.Identity
+	}
+	return ""
+}
+
+func (x *GetJoinTokenReq) GetMetaData() *ParticipantMetaData {
+	if x != nil {
+		return x.MetaData
+	}
+	return nil
+}
+
+type GetJoinTokenResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Jwt           string                 `protobuf:"bytes,1,opt,name=jwt,proto3" json:"jwt,omitempty"`
+	LiveURL       string                 `protobuf:"bytes,2,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetJoinTokenResp) Reset() {
+	*x = GetJoinTokenResp{}
+	mi := &file_rtc_proto_msgTypes[5]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetJoinTokenResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetJoinTokenResp) ProtoMessage() {}
+
+func (x *GetJoinTokenResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[5]
+	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 GetJoinTokenResp.ProtoReflect.Descriptor instead.
+func (*GetJoinTokenResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *GetJoinTokenResp) GetJwt() string {
+	if x != nil {
+		return x.Jwt
+	}
+	return ""
+}
+
+func (x *GetJoinTokenResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+type SignalReq struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// Types that are valid to be assigned to Payload:
+	//
+	//	*SignalReq_Invite
+	//	*SignalReq_InviteInGroup
+	//	*SignalReq_Cancel
+	//	*SignalReq_Accept
+	//	*SignalReq_HungUp
+	//	*SignalReq_Reject
+	//	*SignalReq_GetTokenByRoomID
+	Payload       isSignalReq_Payload `protobuf_oneof:"payload"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalReq) Reset() {
+	*x = SignalReq{}
+	mi := &file_rtc_proto_msgTypes[6]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalReq) ProtoMessage() {}
+
+func (x *SignalReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[6]
+	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 SignalReq.ProtoReflect.Descriptor instead.
+func (*SignalReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *SignalReq) GetPayload() isSignalReq_Payload {
+	if x != nil {
+		return x.Payload
+	}
+	return nil
+}
+
+func (x *SignalReq) GetInvite() *SignalInviteReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_Invite); ok {
+			return x.Invite
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetInviteInGroup() *SignalInviteInGroupReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_InviteInGroup); ok {
+			return x.InviteInGroup
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetCancel() *SignalCancelReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_Cancel); ok {
+			return x.Cancel
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetAccept() *SignalAcceptReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_Accept); ok {
+			return x.Accept
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetHungUp() *SignalHungUpReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_HungUp); ok {
+			return x.HungUp
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetReject() *SignalRejectReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_Reject); ok {
+			return x.Reject
+		}
+	}
+	return nil
+}
+
+func (x *SignalReq) GetGetTokenByRoomID() *SignalGetTokenByRoomIDReq {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalReq_GetTokenByRoomID); ok {
+			return x.GetTokenByRoomID
+		}
+	}
+	return nil
+}
+
+type isSignalReq_Payload interface {
+	isSignalReq_Payload()
+}
+
+type SignalReq_Invite struct {
+	Invite *SignalInviteReq `protobuf:"bytes,1,opt,name=invite,proto3,oneof"`
+}
+
+type SignalReq_InviteInGroup struct {
+	InviteInGroup *SignalInviteInGroupReq `protobuf:"bytes,2,opt,name=inviteInGroup,proto3,oneof"`
+}
+
+type SignalReq_Cancel struct {
+	Cancel *SignalCancelReq `protobuf:"bytes,3,opt,name=cancel,proto3,oneof"`
+}
+
+type SignalReq_Accept struct {
+	Accept *SignalAcceptReq `protobuf:"bytes,4,opt,name=accept,proto3,oneof"`
+}
+
+type SignalReq_HungUp struct {
+	HungUp *SignalHungUpReq `protobuf:"bytes,5,opt,name=hungUp,proto3,oneof"`
+}
+
+type SignalReq_Reject struct {
+	Reject *SignalRejectReq `protobuf:"bytes,6,opt,name=reject,proto3,oneof"`
+}
+
+type SignalReq_GetTokenByRoomID struct {
+	GetTokenByRoomID *SignalGetTokenByRoomIDReq `protobuf:"bytes,7,opt,name=getTokenByRoomID,proto3,oneof"`
+}
+
+func (*SignalReq_Invite) isSignalReq_Payload() {}
+
+func (*SignalReq_InviteInGroup) isSignalReq_Payload() {}
+
+func (*SignalReq_Cancel) isSignalReq_Payload() {}
+
+func (*SignalReq_Accept) isSignalReq_Payload() {}
+
+func (*SignalReq_HungUp) isSignalReq_Payload() {}
+
+func (*SignalReq_Reject) isSignalReq_Payload() {}
+
+func (*SignalReq_GetTokenByRoomID) isSignalReq_Payload() {}
+
+type SignalSendCustomSignalReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	CustomInfo    string                 `protobuf:"bytes,2,opt,name=customInfo,proto3" json:"customInfo,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalSendCustomSignalReq) Reset() {
+	*x = SignalSendCustomSignalReq{}
+	mi := &file_rtc_proto_msgTypes[7]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalSendCustomSignalReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalSendCustomSignalReq) ProtoMessage() {}
+
+func (x *SignalSendCustomSignalReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalSendCustomSignalReq.ProtoReflect.Descriptor instead.
+func (*SignalSendCustomSignalReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *SignalSendCustomSignalReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalSendCustomSignalReq) GetCustomInfo() string {
+	if x != nil {
+		return x.CustomInfo
+	}
+	return ""
+}
+
+type SignalSendCustomSignalResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalSendCustomSignalResp) Reset() {
+	*x = SignalSendCustomSignalResp{}
+	mi := &file_rtc_proto_msgTypes[8]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalSendCustomSignalResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalSendCustomSignalResp) ProtoMessage() {}
+
+func (x *SignalSendCustomSignalResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[8]
+	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 SignalSendCustomSignalResp.ProtoReflect.Descriptor instead.
+func (*SignalSendCustomSignalResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{8}
+}
+
+type SignalGetMeetingsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserID        string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetMeetingsReq) Reset() {
+	*x = SignalGetMeetingsReq{}
+	mi := &file_rtc_proto_msgTypes[9]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetMeetingsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetMeetingsReq) ProtoMessage() {}
+
+func (x *SignalGetMeetingsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[9]
+	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 SignalGetMeetingsReq.ProtoReflect.Descriptor instead.
+func (*SignalGetMeetingsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *SignalGetMeetingsReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalGetMeetingsResp struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	MeetingInfoList []*MeetingInfo         `protobuf:"bytes,1,rep,name=meetingInfoList,proto3" json:"meetingInfoList,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *SignalGetMeetingsResp) Reset() {
+	*x = SignalGetMeetingsResp{}
+	mi := &file_rtc_proto_msgTypes[10]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetMeetingsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetMeetingsResp) ProtoMessage() {}
+
+func (x *SignalGetMeetingsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[10]
+	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 SignalGetMeetingsResp.ProtoReflect.Descriptor instead.
+func (*SignalGetMeetingsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *SignalGetMeetingsResp) GetMeetingInfoList() []*MeetingInfo {
+	if x != nil {
+		return x.MeetingInfoList
+	}
+	return nil
+}
+
+type SignalOperateStreamReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	StreamType    string                 `protobuf:"bytes,1,opt,name=streamType,proto3" json:"streamType,omitempty"`
+	RoomID        string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	UserID        string                 `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID,omitempty"`
+	Mute          bool                   `protobuf:"varint,4,opt,name=mute,proto3" json:"mute,omitempty"`
+	MuteAll       bool                   `protobuf:"varint,5,opt,name=muteAll,proto3" json:"muteAll,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalOperateStreamReq) Reset() {
+	*x = SignalOperateStreamReq{}
+	mi := &file_rtc_proto_msgTypes[11]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalOperateStreamReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalOperateStreamReq) ProtoMessage() {}
+
+func (x *SignalOperateStreamReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[11]
+	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 SignalOperateStreamReq.ProtoReflect.Descriptor instead.
+func (*SignalOperateStreamReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *SignalOperateStreamReq) GetStreamType() string {
+	if x != nil {
+		return x.StreamType
+	}
+	return ""
+}
+
+func (x *SignalOperateStreamReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalOperateStreamReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *SignalOperateStreamReq) GetMute() bool {
+	if x != nil {
+		return x.Mute
+	}
+	return false
+}
+
+func (x *SignalOperateStreamReq) GetMuteAll() bool {
+	if x != nil {
+		return x.MuteAll
+	}
+	return false
+}
+
+type SignalOperateStreamResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalOperateStreamResp) Reset() {
+	*x = SignalOperateStreamResp{}
+	mi := &file_rtc_proto_msgTypes[12]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalOperateStreamResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalOperateStreamResp) ProtoMessage() {}
+
+func (x *SignalOperateStreamResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[12]
+	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 SignalOperateStreamResp.ProtoReflect.Descriptor instead.
+func (*SignalOperateStreamResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{12}
+}
+
+type SignalOnStreamChangeReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	StreamType    string                 `protobuf:"bytes,2,opt,name=streamType,proto3" json:"streamType,omitempty"`
+	Mute          bool                   `protobuf:"varint,3,opt,name=mute,proto3" json:"mute,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalOnStreamChangeReq) Reset() {
+	*x = SignalOnStreamChangeReq{}
+	mi := &file_rtc_proto_msgTypes[13]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalOnStreamChangeReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalOnStreamChangeReq) ProtoMessage() {}
+
+func (x *SignalOnStreamChangeReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[13]
+	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 SignalOnStreamChangeReq.ProtoReflect.Descriptor instead.
+func (*SignalOnStreamChangeReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *SignalOnStreamChangeReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalOnStreamChangeReq) GetStreamType() string {
+	if x != nil {
+		return x.StreamType
+	}
+	return ""
+}
+
+func (x *SignalOnStreamChangeReq) GetMute() bool {
+	if x != nil {
+		return x.Mute
+	}
+	return false
+}
+
+type SignalCreateMeetingReq struct {
+	state             protoimpl.MessageState `protogen:"open.v1"`
+	MeetingDuration   int64                  `protobuf:"varint,1,opt,name=meetingDuration,proto3" json:"meetingDuration,omitempty"`
+	RoomID            string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	MeetingName       string                 `protobuf:"bytes,3,opt,name=meetingName,proto3" json:"meetingName,omitempty"`
+	MeetingHostUserID string                 `protobuf:"bytes,4,opt,name=meetingHostUserID,proto3" json:"meetingHostUserID,omitempty"`
+	Participant       *ParticipantMetaData   `protobuf:"bytes,5,opt,name=participant,proto3" json:"participant,omitempty"`
+	InviteeUserIDList []string               `protobuf:"bytes,6,rep,name=inviteeUserIDList,proto3" json:"inviteeUserIDList,omitempty"`
+	StartTime         int64                  `protobuf:"varint,7,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	Ex                string                 `protobuf:"bytes,8,opt,name=ex,proto3" json:"ex,omitempty"`
+	unknownFields     protoimpl.UnknownFields
+	sizeCache         protoimpl.SizeCache
+}
+
+func (x *SignalCreateMeetingReq) Reset() {
+	*x = SignalCreateMeetingReq{}
+	mi := &file_rtc_proto_msgTypes[14]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCreateMeetingReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCreateMeetingReq) ProtoMessage() {}
+
+func (x *SignalCreateMeetingReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[14]
+	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 SignalCreateMeetingReq.ProtoReflect.Descriptor instead.
+func (*SignalCreateMeetingReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *SignalCreateMeetingReq) GetMeetingDuration() int64 {
+	if x != nil {
+		return x.MeetingDuration
+	}
+	return 0
+}
+
+func (x *SignalCreateMeetingReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalCreateMeetingReq) GetMeetingName() string {
+	if x != nil {
+		return x.MeetingName
+	}
+	return ""
+}
+
+func (x *SignalCreateMeetingReq) GetMeetingHostUserID() string {
+	if x != nil {
+		return x.MeetingHostUserID
+	}
+	return ""
+}
+
+func (x *SignalCreateMeetingReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalCreateMeetingReq) GetInviteeUserIDList() []string {
+	if x != nil {
+		return x.InviteeUserIDList
+	}
+	return nil
+}
+
+func (x *SignalCreateMeetingReq) GetStartTime() int64 {
+	if x != nil {
+		return x.StartTime
+	}
+	return 0
+}
+
+func (x *SignalCreateMeetingReq) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+type SignalCreateMeetingResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Token         string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	RoomID        string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	LiveURL       string                 `protobuf:"bytes,3,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalCreateMeetingResp) Reset() {
+	*x = SignalCreateMeetingResp{}
+	mi := &file_rtc_proto_msgTypes[15]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCreateMeetingResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCreateMeetingResp) ProtoMessage() {}
+
+func (x *SignalCreateMeetingResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalCreateMeetingResp.ProtoReflect.Descriptor instead.
+func (*SignalCreateMeetingResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *SignalCreateMeetingResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalCreateMeetingResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalCreateMeetingResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+type SignalJoinMeetingReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	UserID        string                 `protobuf:"bytes,2,opt,name=userID,proto3" json:"userID,omitempty"`
+	Participant   *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalJoinMeetingReq) Reset() {
+	*x = SignalJoinMeetingReq{}
+	mi := &file_rtc_proto_msgTypes[16]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalJoinMeetingReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalJoinMeetingReq) ProtoMessage() {}
+
+func (x *SignalJoinMeetingReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalJoinMeetingReq.ProtoReflect.Descriptor instead.
+func (*SignalJoinMeetingReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *SignalJoinMeetingReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalJoinMeetingReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *SignalJoinMeetingReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+type SignalJoinMeetingResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Token         string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	RoomID        string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	LiveURL       string                 `protobuf:"bytes,3,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalJoinMeetingResp) Reset() {
+	*x = SignalJoinMeetingResp{}
+	mi := &file_rtc_proto_msgTypes[17]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalJoinMeetingResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalJoinMeetingResp) ProtoMessage() {}
+
+func (x *SignalJoinMeetingResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalJoinMeetingResp.ProtoReflect.Descriptor instead.
+func (*SignalJoinMeetingResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *SignalJoinMeetingResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalJoinMeetingResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalJoinMeetingResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+type SignalResp struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// Types that are valid to be assigned to Payload:
+	//
+	//	*SignalResp_Invite
+	//	*SignalResp_InviteInGroup
+	//	*SignalResp_Cancel
+	//	*SignalResp_Accept
+	//	*SignalResp_HungUp
+	//	*SignalResp_Reject
+	//	*SignalResp_GetTokenByRoomID
+	Payload       isSignalResp_Payload `protobuf_oneof:"payload"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalResp) Reset() {
+	*x = SignalResp{}
+	mi := &file_rtc_proto_msgTypes[18]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalResp) ProtoMessage() {}
+
+func (x *SignalResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalResp.ProtoReflect.Descriptor instead.
+func (*SignalResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *SignalResp) GetPayload() isSignalResp_Payload {
+	if x != nil {
+		return x.Payload
+	}
+	return nil
+}
+
+func (x *SignalResp) GetInvite() *SignalInviteResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_Invite); ok {
+			return x.Invite
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetInviteInGroup() *SignalInviteInGroupResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_InviteInGroup); ok {
+			return x.InviteInGroup
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetCancel() *SignalCancelResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_Cancel); ok {
+			return x.Cancel
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetAccept() *SignalAcceptResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_Accept); ok {
+			return x.Accept
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetHungUp() *SignalHungUpResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_HungUp); ok {
+			return x.HungUp
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetReject() *SignalRejectResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_Reject); ok {
+			return x.Reject
+		}
+	}
+	return nil
+}
+
+func (x *SignalResp) GetGetTokenByRoomID() *SignalGetTokenByRoomIDResp {
+	if x != nil {
+		if x, ok := x.Payload.(*SignalResp_GetTokenByRoomID); ok {
+			return x.GetTokenByRoomID
+		}
+	}
+	return nil
+}
+
+type isSignalResp_Payload interface {
+	isSignalResp_Payload()
+}
+
+type SignalResp_Invite struct {
+	Invite *SignalInviteResp `protobuf:"bytes,1,opt,name=invite,proto3,oneof"`
+}
+
+type SignalResp_InviteInGroup struct {
+	InviteInGroup *SignalInviteInGroupResp `protobuf:"bytes,2,opt,name=inviteInGroup,proto3,oneof"`
+}
+
+type SignalResp_Cancel struct {
+	Cancel *SignalCancelResp `protobuf:"bytes,3,opt,name=cancel,proto3,oneof"`
+}
+
+type SignalResp_Accept struct {
+	Accept *SignalAcceptResp `protobuf:"bytes,4,opt,name=accept,proto3,oneof"`
+}
+
+type SignalResp_HungUp struct {
+	HungUp *SignalHungUpResp `protobuf:"bytes,5,opt,name=hungUp,proto3,oneof"`
+}
+
+type SignalResp_Reject struct {
+	Reject *SignalRejectResp `protobuf:"bytes,6,opt,name=reject,proto3,oneof"`
+}
+
+type SignalResp_GetTokenByRoomID struct {
+	GetTokenByRoomID *SignalGetTokenByRoomIDResp `protobuf:"bytes,7,opt,name=getTokenByRoomID,proto3,oneof"`
+}
+
+func (*SignalResp_Invite) isSignalResp_Payload() {}
+
+func (*SignalResp_InviteInGroup) isSignalResp_Payload() {}
+
+func (*SignalResp_Cancel) isSignalResp_Payload() {}
+
+func (*SignalResp_Accept) isSignalResp_Payload() {}
+
+func (*SignalResp_HungUp) isSignalResp_Payload() {}
+
+func (*SignalResp_Reject) isSignalResp_Payload() {}
+
+func (*SignalResp_GetTokenByRoomID) isSignalResp_Payload() {}
+
+type InvitationInfo struct {
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	InviterUserID      string                 `protobuf:"bytes,1,opt,name=inviterUserID,proto3" json:"inviterUserID,omitempty"`
+	InviteeUserIDList  []string               `protobuf:"bytes,2,rep,name=inviteeUserIDList,proto3" json:"inviteeUserIDList,omitempty"`
+	CustomData         string                 `protobuf:"bytes,3,opt,name=customData,proto3" json:"customData,omitempty"`
+	GroupID            string                 `protobuf:"bytes,4,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	RoomID             string                 `protobuf:"bytes,5,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	Timeout            int32                  `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"`
+	MediaType          string                 `protobuf:"bytes,7,opt,name=mediaType,proto3" json:"mediaType,omitempty"`
+	PlatformID         int32                  `protobuf:"varint,8,opt,name=platformID,proto3" json:"platformID,omitempty"`
+	SessionType        int32                  `protobuf:"varint,9,opt,name=sessionType,proto3" json:"sessionType,omitempty"`
+	InitiateTime       int64                  `protobuf:"varint,10,opt,name=initiateTime,proto3" json:"initiateTime,omitempty"`
+	BusyLineUserIDList []string               `protobuf:"bytes,11,rep,name=busyLineUserIDList,proto3" json:"busyLineUserIDList,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
+}
+
+func (x *InvitationInfo) Reset() {
+	*x = InvitationInfo{}
+	mi := &file_rtc_proto_msgTypes[19]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *InvitationInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*InvitationInfo) ProtoMessage() {}
+
+func (x *InvitationInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 InvitationInfo.ProtoReflect.Descriptor instead.
+func (*InvitationInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *InvitationInfo) GetInviterUserID() string {
+	if x != nil {
+		return x.InviterUserID
+	}
+	return ""
+}
+
+func (x *InvitationInfo) GetInviteeUserIDList() []string {
+	if x != nil {
+		return x.InviteeUserIDList
+	}
+	return nil
+}
+
+func (x *InvitationInfo) GetCustomData() string {
+	if x != nil {
+		return x.CustomData
+	}
+	return ""
+}
+
+func (x *InvitationInfo) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+func (x *InvitationInfo) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *InvitationInfo) GetTimeout() int32 {
+	if x != nil {
+		return x.Timeout
+	}
+	return 0
+}
+
+func (x *InvitationInfo) GetMediaType() string {
+	if x != nil {
+		return x.MediaType
+	}
+	return ""
+}
+
+func (x *InvitationInfo) GetPlatformID() int32 {
+	if x != nil {
+		return x.PlatformID
+	}
+	return 0
+}
+
+func (x *InvitationInfo) GetSessionType() int32 {
+	if x != nil {
+		return x.SessionType
+	}
+	return 0
+}
+
+func (x *InvitationInfo) GetInitiateTime() int64 {
+	if x != nil {
+		return x.InitiateTime
+	}
+	return 0
+}
+
+func (x *InvitationInfo) GetBusyLineUserIDList() []string {
+	if x != nil {
+		return x.BusyLineUserIDList
+	}
+	return nil
+}
+
+type MeetingInfo struct {
+	state                       protoimpl.MessageState `protogen:"open.v1"`
+	RoomID                      string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	MeetingName                 string                 `protobuf:"bytes,2,opt,name=meetingName,proto3" json:"meetingName,omitempty"`
+	Ex                          string                 `protobuf:"bytes,3,opt,name=ex,proto3" json:"ex,omitempty"`
+	HostUserID                  string                 `protobuf:"bytes,4,opt,name=hostUserID,proto3" json:"hostUserID,omitempty"`
+	InviteeUserIDList           []string               `protobuf:"bytes,5,rep,name=inviteeUserIDList,proto3" json:"inviteeUserIDList,omitempty"` //邀请列表
+	CreateTime                  int64                  `protobuf:"varint,6,opt,name=createTime,proto3" json:"createTime,omitempty"`
+	StartTime                   int64                  `protobuf:"varint,7,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	EndTime                     int64                  `protobuf:"varint,8,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	ParticipantCanUnmuteSelf    bool                   `protobuf:"varint,9,opt,name=participantCanUnmuteSelf,proto3" json:"participantCanUnmuteSelf,omitempty"`       //成员是否能自己解除禁言
+	ParticipantCanEnableVideo   bool                   `protobuf:"varint,10,opt,name=participantCanEnableVideo,proto3" json:"participantCanEnableVideo,omitempty"`    //成员是否能开启视频
+	OnlyHostInviteUser          bool                   `protobuf:"varint,11,opt,name=onlyHostInviteUser,proto3" json:"onlyHostInviteUser,omitempty"`                  //仅主持人可邀请用户
+	OnlyHostShareScreen         bool                   `protobuf:"varint,12,opt,name=onlyHostShareScreen,proto3" json:"onlyHostShareScreen,omitempty"`                //仅主持人可共享屏幕
+	JoinDisableMicrophone       bool                   `protobuf:"varint,13,opt,name=joinDisableMicrophone,proto3" json:"joinDisableMicrophone,omitempty"`            //加入是否默认关麦克风
+	JoinDisableVideo            bool                   `protobuf:"varint,14,opt,name=joinDisableVideo,proto3" json:"joinDisableVideo,omitempty"`                      //加入是否默认关视频
+	IsMuteAllVideo              bool                   `protobuf:"varint,15,opt,name=isMuteAllVideo,proto3" json:"isMuteAllVideo,omitempty"`                          // 是否全员禁用视频
+	IsMuteAllMicrophone         bool                   `protobuf:"varint,16,opt,name=isMuteAllMicrophone,proto3" json:"isMuteAllMicrophone,omitempty"`                // 是否全员禁用麦克风
+	CanScreenUserIDList         []string               `protobuf:"bytes,17,rep,name=canScreenUserIDList,proto3" json:"canScreenUserIDList,omitempty"`                 // 可共享屏幕的ID列表
+	DisableMicrophoneUserIDList []string               `protobuf:"bytes,18,rep,name=disableMicrophoneUserIDList,proto3" json:"disableMicrophoneUserIDList,omitempty"` // 当前被禁言麦克风的id列表
+	DisableVideoUserIDList      []string               `protobuf:"bytes,19,rep,name=disableVideoUserIDList,proto3" json:"disableVideoUserIDList,omitempty"`           // 当前禁用视频流的ID列表
+	PinedUserIDList             []string               `protobuf:"bytes,20,rep,name=pinedUserIDList,proto3" json:"pinedUserIDList,omitempty"`                         // 置顶ID列表
+	BeWatchedUserIDList         []string               `protobuf:"bytes,21,rep,name=beWatchedUserIDList,proto3" json:"beWatchedUserIDList,omitempty"`                 // 正在被观看用户列表
+	unknownFields               protoimpl.UnknownFields
+	sizeCache                   protoimpl.SizeCache
+}
+
+func (x *MeetingInfo) Reset() {
+	*x = MeetingInfo{}
+	mi := &file_rtc_proto_msgTypes[20]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MeetingInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeetingInfo) ProtoMessage() {}
+
+func (x *MeetingInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[20]
+	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 MeetingInfo.ProtoReflect.Descriptor instead.
+func (*MeetingInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *MeetingInfo) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *MeetingInfo) GetMeetingName() string {
+	if x != nil {
+		return x.MeetingName
+	}
+	return ""
+}
+
+func (x *MeetingInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *MeetingInfo) GetHostUserID() string {
+	if x != nil {
+		return x.HostUserID
+	}
+	return ""
+}
+
+func (x *MeetingInfo) GetInviteeUserIDList() []string {
+	if x != nil {
+		return x.InviteeUserIDList
+	}
+	return nil
+}
+
+func (x *MeetingInfo) GetCreateTime() int64 {
+	if x != nil {
+		return x.CreateTime
+	}
+	return 0
+}
+
+func (x *MeetingInfo) GetStartTime() int64 {
+	if x != nil {
+		return x.StartTime
+	}
+	return 0
+}
+
+func (x *MeetingInfo) GetEndTime() int64 {
+	if x != nil {
+		return x.EndTime
+	}
+	return 0
+}
+
+func (x *MeetingInfo) GetParticipantCanUnmuteSelf() bool {
+	if x != nil {
+		return x.ParticipantCanUnmuteSelf
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetParticipantCanEnableVideo() bool {
+	if x != nil {
+		return x.ParticipantCanEnableVideo
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetOnlyHostInviteUser() bool {
+	if x != nil {
+		return x.OnlyHostInviteUser
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetOnlyHostShareScreen() bool {
+	if x != nil {
+		return x.OnlyHostShareScreen
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetJoinDisableMicrophone() bool {
+	if x != nil {
+		return x.JoinDisableMicrophone
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetJoinDisableVideo() bool {
+	if x != nil {
+		return x.JoinDisableVideo
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetIsMuteAllVideo() bool {
+	if x != nil {
+		return x.IsMuteAllVideo
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetIsMuteAllMicrophone() bool {
+	if x != nil {
+		return x.IsMuteAllMicrophone
+	}
+	return false
+}
+
+func (x *MeetingInfo) GetCanScreenUserIDList() []string {
+	if x != nil {
+		return x.CanScreenUserIDList
+	}
+	return nil
+}
+
+func (x *MeetingInfo) GetDisableMicrophoneUserIDList() []string {
+	if x != nil {
+		return x.DisableMicrophoneUserIDList
+	}
+	return nil
+}
+
+func (x *MeetingInfo) GetDisableVideoUserIDList() []string {
+	if x != nil {
+		return x.DisableVideoUserIDList
+	}
+	return nil
+}
+
+func (x *MeetingInfo) GetPinedUserIDList() []string {
+	if x != nil {
+		return x.PinedUserIDList
+	}
+	return nil
+}
+
+func (x *MeetingInfo) GetBeWatchedUserIDList() []string {
+	if x != nil {
+		return x.BeWatchedUserIDList
+	}
+	return nil
+}
+
+type SignalInviteReq struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	Invitation      *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	Participant     *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	UserID          string                 `protobuf:"bytes,4,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *SignalInviteReq) Reset() {
+	*x = SignalInviteReq{}
+	mi := &file_rtc_proto_msgTypes[21]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalInviteReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalInviteReq) ProtoMessage() {}
+
+func (x *SignalInviteReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[21]
+	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 SignalInviteReq.ProtoReflect.Descriptor instead.
+func (*SignalInviteReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *SignalInviteReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalInviteReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalInviteReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalInviteReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalInviteResp struct {
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	Token              string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	RoomID             string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	LiveURL            string                 `protobuf:"bytes,3,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	BusyLineUserIDList []string               `protobuf:"bytes,4,rep,name=busyLineUserIDList,proto3" json:"busyLineUserIDList,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
+}
+
+func (x *SignalInviteResp) Reset() {
+	*x = SignalInviteResp{}
+	mi := &file_rtc_proto_msgTypes[22]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalInviteResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalInviteResp) ProtoMessage() {}
+
+func (x *SignalInviteResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalInviteResp.ProtoReflect.Descriptor instead.
+func (*SignalInviteResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *SignalInviteResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalInviteResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalInviteResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+func (x *SignalInviteResp) GetBusyLineUserIDList() []string {
+	if x != nil {
+		return x.BusyLineUserIDList
+	}
+	return nil
+}
+
+type SignalInviteInGroupReq struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	Invitation      *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	Participant     *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	UserID          string                 `protobuf:"bytes,4,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *SignalInviteInGroupReq) Reset() {
+	*x = SignalInviteInGroupReq{}
+	mi := &file_rtc_proto_msgTypes[23]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalInviteInGroupReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalInviteInGroupReq) ProtoMessage() {}
+
+func (x *SignalInviteInGroupReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[23]
+	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 SignalInviteInGroupReq.ProtoReflect.Descriptor instead.
+func (*SignalInviteInGroupReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{23}
+}
+
+func (x *SignalInviteInGroupReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalInviteInGroupReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalInviteInGroupReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalInviteInGroupReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalInviteInGroupResp struct {
+	state              protoimpl.MessageState `protogen:"open.v1"`
+	Token              string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	RoomID             string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	LiveURL            string                 `protobuf:"bytes,3,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	BusyLineUserIDList []string               `protobuf:"bytes,4,rep,name=busyLineUserIDList,proto3" json:"busyLineUserIDList,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
+}
+
+func (x *SignalInviteInGroupResp) Reset() {
+	*x = SignalInviteInGroupResp{}
+	mi := &file_rtc_proto_msgTypes[24]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalInviteInGroupResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalInviteInGroupResp) ProtoMessage() {}
+
+func (x *SignalInviteInGroupResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[24]
+	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 SignalInviteInGroupResp.ProtoReflect.Descriptor instead.
+func (*SignalInviteInGroupResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *SignalInviteInGroupResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalInviteInGroupResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalInviteInGroupResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+func (x *SignalInviteInGroupResp) GetBusyLineUserIDList() []string {
+	if x != nil {
+		return x.BusyLineUserIDList
+	}
+	return nil
+}
+
+type SignalCancelReq struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	Invitation      *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	Participant     *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	UserID          string                 `protobuf:"bytes,4,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *SignalCancelReq) Reset() {
+	*x = SignalCancelReq{}
+	mi := &file_rtc_proto_msgTypes[25]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCancelReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCancelReq) ProtoMessage() {}
+
+func (x *SignalCancelReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[25]
+	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 SignalCancelReq.ProtoReflect.Descriptor instead.
+func (*SignalCancelReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *SignalCancelReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalCancelReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalCancelReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalCancelReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalCancelResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalCancelResp) Reset() {
+	*x = SignalCancelResp{}
+	mi := &file_rtc_proto_msgTypes[26]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCancelResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCancelResp) ProtoMessage() {}
+
+func (x *SignalCancelResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[26]
+	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 SignalCancelResp.ProtoReflect.Descriptor instead.
+func (*SignalCancelResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{26}
+}
+
+type SignalAcceptReq struct {
+	state            protoimpl.MessageState `protogen:"open.v1"`
+	Invitation       *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo  *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	Participant      *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	OpUserPlatformID int32                  `protobuf:"varint,4,opt,name=opUserPlatformID,proto3" json:"opUserPlatformID,omitempty"`
+	UserID           string                 `protobuf:"bytes,5,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
+}
+
+func (x *SignalAcceptReq) Reset() {
+	*x = SignalAcceptReq{}
+	mi := &file_rtc_proto_msgTypes[27]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalAcceptReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalAcceptReq) ProtoMessage() {}
+
+func (x *SignalAcceptReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[27]
+	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 SignalAcceptReq.ProtoReflect.Descriptor instead.
+func (*SignalAcceptReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *SignalAcceptReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalAcceptReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalAcceptReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalAcceptReq) GetOpUserPlatformID() int32 {
+	if x != nil {
+		return x.OpUserPlatformID
+	}
+	return 0
+}
+
+func (x *SignalAcceptReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalAcceptResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Token         string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	RoomID        string                 `protobuf:"bytes,2,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	LiveURL       string                 `protobuf:"bytes,3,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalAcceptResp) Reset() {
+	*x = SignalAcceptResp{}
+	mi := &file_rtc_proto_msgTypes[28]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalAcceptResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalAcceptResp) ProtoMessage() {}
+
+func (x *SignalAcceptResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[28]
+	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 SignalAcceptResp.ProtoReflect.Descriptor instead.
+func (*SignalAcceptResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *SignalAcceptResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalAcceptResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalAcceptResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+type SignalHungUpReq struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	Invitation      *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	UserID          string                 `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *SignalHungUpReq) Reset() {
+	*x = SignalHungUpReq{}
+	mi := &file_rtc_proto_msgTypes[29]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalHungUpReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalHungUpReq) ProtoMessage() {}
+
+func (x *SignalHungUpReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[29]
+	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 SignalHungUpReq.ProtoReflect.Descriptor instead.
+func (*SignalHungUpReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{29}
+}
+
+func (x *SignalHungUpReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalHungUpReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalHungUpReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalHungUpResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalHungUpResp) Reset() {
+	*x = SignalHungUpResp{}
+	mi := &file_rtc_proto_msgTypes[30]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalHungUpResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalHungUpResp) ProtoMessage() {}
+
+func (x *SignalHungUpResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[30]
+	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 SignalHungUpResp.ProtoReflect.Descriptor instead.
+func (*SignalHungUpResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{30}
+}
+
+type SignalRejectReq struct {
+	state            protoimpl.MessageState `protogen:"open.v1"`
+	Invitation       *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo  *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	Participant      *ParticipantMetaData   `protobuf:"bytes,3,opt,name=participant,proto3" json:"participant,omitempty"`
+	OpUserPlatformID int32                  `protobuf:"varint,4,opt,name=opUserPlatformID,proto3" json:"opUserPlatformID,omitempty"`
+	UserID           string                 `protobuf:"bytes,5,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
+}
+
+func (x *SignalRejectReq) Reset() {
+	*x = SignalRejectReq{}
+	mi := &file_rtc_proto_msgTypes[31]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalRejectReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalRejectReq) ProtoMessage() {}
+
+func (x *SignalRejectReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalRejectReq.ProtoReflect.Descriptor instead.
+func (*SignalRejectReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{31}
+}
+
+func (x *SignalRejectReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalRejectReq) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+func (x *SignalRejectReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalRejectReq) GetOpUserPlatformID() int32 {
+	if x != nil {
+		return x.OpUserPlatformID
+	}
+	return 0
+}
+
+func (x *SignalRejectReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalRejectResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalRejectResp) Reset() {
+	*x = SignalRejectResp{}
+	mi := &file_rtc_proto_msgTypes[32]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalRejectResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalRejectResp) ProtoMessage() {}
+
+func (x *SignalRejectResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalRejectResp.ProtoReflect.Descriptor instead.
+func (*SignalRejectResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{32}
+}
+
+type SignalGetRoomByGroupIDReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	GroupID       string                 `protobuf:"bytes,1,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetRoomByGroupIDReq) Reset() {
+	*x = SignalGetRoomByGroupIDReq{}
+	mi := &file_rtc_proto_msgTypes[33]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetRoomByGroupIDReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetRoomByGroupIDReq) ProtoMessage() {}
+
+func (x *SignalGetRoomByGroupIDReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[33]
+	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 SignalGetRoomByGroupIDReq.ProtoReflect.Descriptor instead.
+func (*SignalGetRoomByGroupIDReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{33}
+}
+
+func (x *SignalGetRoomByGroupIDReq) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+type SignalGetRoomByGroupIDResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Invitation    *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	Participant   []*ParticipantMetaData `protobuf:"bytes,2,rep,name=participant,proto3" json:"participant,omitempty"`
+	RoomID        string                 `protobuf:"bytes,3,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetRoomByGroupIDResp) Reset() {
+	*x = SignalGetRoomByGroupIDResp{}
+	mi := &file_rtc_proto_msgTypes[34]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetRoomByGroupIDResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetRoomByGroupIDResp) ProtoMessage() {}
+
+func (x *SignalGetRoomByGroupIDResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalGetRoomByGroupIDResp.ProtoReflect.Descriptor instead.
+func (*SignalGetRoomByGroupIDResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *SignalGetRoomByGroupIDResp) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalGetRoomByGroupIDResp) GetParticipant() []*ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalGetRoomByGroupIDResp) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+type SignalOnRoomParticipantConnectedReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Invitation    *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	Participant   []*ParticipantMetaData `protobuf:"bytes,2,rep,name=participant,proto3" json:"participant,omitempty"`
+	GroupID       string                 `protobuf:"bytes,3,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalOnRoomParticipantConnectedReq) Reset() {
+	*x = SignalOnRoomParticipantConnectedReq{}
+	mi := &file_rtc_proto_msgTypes[35]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalOnRoomParticipantConnectedReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalOnRoomParticipantConnectedReq) ProtoMessage() {}
+
+func (x *SignalOnRoomParticipantConnectedReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalOnRoomParticipantConnectedReq.ProtoReflect.Descriptor instead.
+func (*SignalOnRoomParticipantConnectedReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{35}
+}
+
+func (x *SignalOnRoomParticipantConnectedReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalOnRoomParticipantConnectedReq) GetParticipant() []*ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalOnRoomParticipantConnectedReq) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+type SignalOnRoomParticipantDisconnectedReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Invitation    *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	Participant   []*ParticipantMetaData `protobuf:"bytes,2,rep,name=participant,proto3" json:"participant,omitempty"`
+	GroupID       string                 `protobuf:"bytes,3,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) Reset() {
+	*x = SignalOnRoomParticipantDisconnectedReq{}
+	mi := &file_rtc_proto_msgTypes[36]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalOnRoomParticipantDisconnectedReq) ProtoMessage() {}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalOnRoomParticipantDisconnectedReq.ProtoReflect.Descriptor instead.
+func (*SignalOnRoomParticipantDisconnectedReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{36}
+}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) GetParticipant() []*ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalOnRoomParticipantDisconnectedReq) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+type SignalGetTokenByRoomIDReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	Participant   *ParticipantMetaData   `protobuf:"bytes,2,opt,name=participant,proto3" json:"participant,omitempty"`
+	UserID        string                 `protobuf:"bytes,3,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetTokenByRoomIDReq) Reset() {
+	*x = SignalGetTokenByRoomIDReq{}
+	mi := &file_rtc_proto_msgTypes[37]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetTokenByRoomIDReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetTokenByRoomIDReq) ProtoMessage() {}
+
+func (x *SignalGetTokenByRoomIDReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalGetTokenByRoomIDReq.ProtoReflect.Descriptor instead.
+func (*SignalGetTokenByRoomIDReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{37}
+}
+
+func (x *SignalGetTokenByRoomIDReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalGetTokenByRoomIDReq) GetParticipant() *ParticipantMetaData {
+	if x != nil {
+		return x.Participant
+	}
+	return nil
+}
+
+func (x *SignalGetTokenByRoomIDReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type SignalGetTokenByRoomIDResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Token         string                 `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	LiveURL       string                 `protobuf:"bytes,2,opt,name=liveURL,proto3" json:"liveURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetTokenByRoomIDResp) Reset() {
+	*x = SignalGetTokenByRoomIDResp{}
+	mi := &file_rtc_proto_msgTypes[38]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetTokenByRoomIDResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetTokenByRoomIDResp) ProtoMessage() {}
+
+func (x *SignalGetTokenByRoomIDResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalGetTokenByRoomIDResp.ProtoReflect.Descriptor instead.
+func (*SignalGetTokenByRoomIDResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{38}
+}
+
+func (x *SignalGetTokenByRoomIDResp) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *SignalGetTokenByRoomIDResp) GetLiveURL() string {
+	if x != nil {
+		return x.LiveURL
+	}
+	return ""
+}
+
+type SignalUpdateMeetingInfoReq struct {
+	state                             protoimpl.MessageState `protogen:"open.v1"`
+	RoomID                            string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	MeetingName                       *StringValue           `protobuf:"bytes,2,opt,name=meetingName,proto3" json:"meetingName,omitempty"`
+	Ex                                *StringValue           `protobuf:"bytes,3,opt,name=ex,proto3" json:"ex,omitempty"`
+	InviteeUserIDList                 []string               `protobuf:"bytes,4,rep,name=inviteeUserIDList,proto3" json:"inviteeUserIDList,omitempty"`
+	StartTime                         *Int64Value            `protobuf:"bytes,5,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	EndTime                           *Int64Value            `protobuf:"bytes,6,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	ParticipantCanUnmuteSelf          *BoolValue             `protobuf:"bytes,7,opt,name=participantCanUnmuteSelf,proto3" json:"participantCanUnmuteSelf,omitempty"`
+	ParticipantCanEnableVideo         *BoolValue             `protobuf:"bytes,8,opt,name=participantCanEnableVideo,proto3" json:"participantCanEnableVideo,omitempty"`
+	OnlyHostInviteUser                *BoolValue             `protobuf:"bytes,9,opt,name=onlyHostInviteUser,proto3" json:"onlyHostInviteUser,omitempty"`
+	OnlyHostShareScreen               *BoolValue             `protobuf:"bytes,10,opt,name=onlyHostShareScreen,proto3" json:"onlyHostShareScreen,omitempty"`
+	JoinDisableMicrophone             *BoolValue             `protobuf:"bytes,11,opt,name=joinDisableMicrophone,proto3" json:"joinDisableMicrophone,omitempty"`
+	JoinDisableVideo                  *BoolValue             `protobuf:"bytes,12,opt,name=joinDisableVideo,proto3" json:"joinDisableVideo,omitempty"`
+	IsMuteAllVideo                    *BoolValue             `protobuf:"bytes,13,opt,name=isMuteAllVideo,proto3" json:"isMuteAllVideo,omitempty"`
+	IsMuteAllMicrophone               *BoolValue             `protobuf:"bytes,14,opt,name=isMuteAllMicrophone,proto3" json:"isMuteAllMicrophone,omitempty"`
+	AddCanScreenUserIDList            []string               `protobuf:"bytes,15,rep,name=addCanScreenUserIDList,proto3" json:"addCanScreenUserIDList,omitempty"`
+	ReduceCanScreenUserIDList         []string               `protobuf:"bytes,16,rep,name=reduceCanScreenUserIDList,proto3" json:"reduceCanScreenUserIDList,omitempty"`
+	CanScreenUserIDList               []string               `protobuf:"bytes,17,rep,name=canScreenUserIDList,proto3" json:"canScreenUserIDList,omitempty"`
+	AddDisableMicrophoneUserIDList    []string               `protobuf:"bytes,18,rep,name=addDisableMicrophoneUserIDList,proto3" json:"addDisableMicrophoneUserIDList,omitempty"`
+	ReduceDisableMicrophoneUserIDList []string               `protobuf:"bytes,19,rep,name=reduceDisableMicrophoneUserIDList,proto3" json:"reduceDisableMicrophoneUserIDList,omitempty"`
+	DisableMicrophoneUserIDList       []string               `protobuf:"bytes,20,rep,name=disableMicrophoneUserIDList,proto3" json:"disableMicrophoneUserIDList,omitempty"`
+	AddDisableVideoUserIDList         []string               `protobuf:"bytes,21,rep,name=addDisableVideoUserIDList,proto3" json:"addDisableVideoUserIDList,omitempty"`
+	ReduceDisableVideoUserIDList      []string               `protobuf:"bytes,22,rep,name=reduceDisableVideoUserIDList,proto3" json:"reduceDisableVideoUserIDList,omitempty"`
+	DisableVideoUserIDList            []string               `protobuf:"bytes,23,rep,name=disableVideoUserIDList,proto3" json:"disableVideoUserIDList,omitempty"`
+	AddPinedUserIDList                []string               `protobuf:"bytes,24,rep,name=addPinedUserIDList,proto3" json:"addPinedUserIDList,omitempty"`
+	ReducePinedUserIDList             []string               `protobuf:"bytes,25,rep,name=reducePinedUserIDList,proto3" json:"reducePinedUserIDList,omitempty"`
+	PinedUserIDList                   []string               `protobuf:"bytes,26,rep,name=pinedUserIDList,proto3" json:"pinedUserIDList,omitempty"`
+	AddBeWatchedUserIDList            []string               `protobuf:"bytes,27,rep,name=addBeWatchedUserIDList,proto3" json:"addBeWatchedUserIDList,omitempty"`
+	ReduceBeWatchedUserIDList         []string               `protobuf:"bytes,28,rep,name=reduceBeWatchedUserIDList,proto3" json:"reduceBeWatchedUserIDList,omitempty"`
+	BeWatchedUserIDList               []string               `protobuf:"bytes,29,rep,name=beWatchedUserIDList,proto3" json:"beWatchedUserIDList,omitempty"`
+	unknownFields                     protoimpl.UnknownFields
+	sizeCache                         protoimpl.SizeCache
+}
+
+func (x *SignalUpdateMeetingInfoReq) Reset() {
+	*x = SignalUpdateMeetingInfoReq{}
+	mi := &file_rtc_proto_msgTypes[39]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalUpdateMeetingInfoReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalUpdateMeetingInfoReq) ProtoMessage() {}
+
+func (x *SignalUpdateMeetingInfoReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalUpdateMeetingInfoReq.ProtoReflect.Descriptor instead.
+func (*SignalUpdateMeetingInfoReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{39}
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetMeetingName() *StringValue {
+	if x != nil {
+		return x.MeetingName
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetEx() *StringValue {
+	if x != nil {
+		return x.Ex
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetInviteeUserIDList() []string {
+	if x != nil {
+		return x.InviteeUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetStartTime() *Int64Value {
+	if x != nil {
+		return x.StartTime
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetEndTime() *Int64Value {
+	if x != nil {
+		return x.EndTime
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetParticipantCanUnmuteSelf() *BoolValue {
+	if x != nil {
+		return x.ParticipantCanUnmuteSelf
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetParticipantCanEnableVideo() *BoolValue {
+	if x != nil {
+		return x.ParticipantCanEnableVideo
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetOnlyHostInviteUser() *BoolValue {
+	if x != nil {
+		return x.OnlyHostInviteUser
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetOnlyHostShareScreen() *BoolValue {
+	if x != nil {
+		return x.OnlyHostShareScreen
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetJoinDisableMicrophone() *BoolValue {
+	if x != nil {
+		return x.JoinDisableMicrophone
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetJoinDisableVideo() *BoolValue {
+	if x != nil {
+		return x.JoinDisableVideo
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetIsMuteAllVideo() *BoolValue {
+	if x != nil {
+		return x.IsMuteAllVideo
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetIsMuteAllMicrophone() *BoolValue {
+	if x != nil {
+		return x.IsMuteAllMicrophone
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetAddCanScreenUserIDList() []string {
+	if x != nil {
+		return x.AddCanScreenUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetReduceCanScreenUserIDList() []string {
+	if x != nil {
+		return x.ReduceCanScreenUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetCanScreenUserIDList() []string {
+	if x != nil {
+		return x.CanScreenUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetAddDisableMicrophoneUserIDList() []string {
+	if x != nil {
+		return x.AddDisableMicrophoneUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetReduceDisableMicrophoneUserIDList() []string {
+	if x != nil {
+		return x.ReduceDisableMicrophoneUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetDisableMicrophoneUserIDList() []string {
+	if x != nil {
+		return x.DisableMicrophoneUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetAddDisableVideoUserIDList() []string {
+	if x != nil {
+		return x.AddDisableVideoUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetReduceDisableVideoUserIDList() []string {
+	if x != nil {
+		return x.ReduceDisableVideoUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetDisableVideoUserIDList() []string {
+	if x != nil {
+		return x.DisableVideoUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetAddPinedUserIDList() []string {
+	if x != nil {
+		return x.AddPinedUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetReducePinedUserIDList() []string {
+	if x != nil {
+		return x.ReducePinedUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetPinedUserIDList() []string {
+	if x != nil {
+		return x.PinedUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetAddBeWatchedUserIDList() []string {
+	if x != nil {
+		return x.AddBeWatchedUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetReduceBeWatchedUserIDList() []string {
+	if x != nil {
+		return x.ReduceBeWatchedUserIDList
+	}
+	return nil
+}
+
+func (x *SignalUpdateMeetingInfoReq) GetBeWatchedUserIDList() []string {
+	if x != nil {
+		return x.BeWatchedUserIDList
+	}
+	return nil
+}
+
+type SignalUpdateMeetingInfoResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalUpdateMeetingInfoResp) Reset() {
+	*x = SignalUpdateMeetingInfoResp{}
+	mi := &file_rtc_proto_msgTypes[40]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalUpdateMeetingInfoResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalUpdateMeetingInfoResp) ProtoMessage() {}
+
+func (x *SignalUpdateMeetingInfoResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalUpdateMeetingInfoResp.ProtoReflect.Descriptor instead.
+func (*SignalUpdateMeetingInfoResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{40}
+}
+
+type SignalCloseRoomReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalCloseRoomReq) Reset() {
+	*x = SignalCloseRoomReq{}
+	mi := &file_rtc_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCloseRoomReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCloseRoomReq) ProtoMessage() {}
+
+func (x *SignalCloseRoomReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalCloseRoomReq.ProtoReflect.Descriptor instead.
+func (*SignalCloseRoomReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *SignalCloseRoomReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+type SignalCloseRoomResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalCloseRoomResp) Reset() {
+	*x = SignalCloseRoomResp{}
+	mi := &file_rtc_proto_msgTypes[42]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalCloseRoomResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalCloseRoomResp) ProtoMessage() {}
+
+func (x *SignalCloseRoomResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalCloseRoomResp.ProtoReflect.Descriptor instead.
+func (*SignalCloseRoomResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{42}
+}
+
+type SignalMessageAssembleReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	SignalReq     *SignalReq             `protobuf:"bytes,1,opt,name=signalReq,proto3" json:"signalReq,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalMessageAssembleReq) Reset() {
+	*x = SignalMessageAssembleReq{}
+	mi := &file_rtc_proto_msgTypes[43]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalMessageAssembleReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalMessageAssembleReq) ProtoMessage() {}
+
+func (x *SignalMessageAssembleReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalMessageAssembleReq.ProtoReflect.Descriptor instead.
+func (*SignalMessageAssembleReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{43}
+}
+
+func (x *SignalMessageAssembleReq) GetSignalReq() *SignalReq {
+	if x != nil {
+		return x.SignalReq
+	}
+	return nil
+}
+
+type SignalMessageAssembleResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	SignalResp    *SignalResp            `protobuf:"bytes,1,opt,name=signalResp,proto3" json:"signalResp,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalMessageAssembleResp) Reset() {
+	*x = SignalMessageAssembleResp{}
+	mi := &file_rtc_proto_msgTypes[44]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalMessageAssembleResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalMessageAssembleResp) ProtoMessage() {}
+
+func (x *SignalMessageAssembleResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_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 SignalMessageAssembleResp.ProtoReflect.Descriptor instead.
+func (*SignalMessageAssembleResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{44}
+}
+
+func (x *SignalMessageAssembleResp) GetSignalResp() *SignalResp {
+	if x != nil {
+		return x.SignalResp
+	}
+	return nil
+}
+
+type SignalGetRoomsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomIDs       []string               `protobuf:"bytes,1,rep,name=roomIDs,proto3" json:"roomIDs,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetRoomsReq) Reset() {
+	*x = SignalGetRoomsReq{}
+	mi := &file_rtc_proto_msgTypes[45]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetRoomsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetRoomsReq) ProtoMessage() {}
+
+func (x *SignalGetRoomsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[45]
+	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 SignalGetRoomsReq.ProtoReflect.Descriptor instead.
+func (*SignalGetRoomsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{45}
+}
+
+func (x *SignalGetRoomsReq) GetRoomIDs() []string {
+	if x != nil {
+		return x.RoomIDs
+	}
+	return nil
+}
+
+type SignalGetRoomsResp struct {
+	state         protoimpl.MessageState        `protogen:"open.v1"`
+	RoomList      []*SignalGetRoomByGroupIDResp `protobuf:"bytes,1,rep,name=roomList,proto3" json:"roomList,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalGetRoomsResp) Reset() {
+	*x = SignalGetRoomsResp{}
+	mi := &file_rtc_proto_msgTypes[46]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalGetRoomsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalGetRoomsResp) ProtoMessage() {}
+
+func (x *SignalGetRoomsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[46]
+	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 SignalGetRoomsResp.ProtoReflect.Descriptor instead.
+func (*SignalGetRoomsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{46}
+}
+
+func (x *SignalGetRoomsResp) GetRoomList() []*SignalGetRoomByGroupIDResp {
+	if x != nil {
+		return x.RoomList
+	}
+	return nil
+}
+
+type GetSignalInvitationInfoReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomID        string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationInfoReq) Reset() {
+	*x = GetSignalInvitationInfoReq{}
+	mi := &file_rtc_proto_msgTypes[47]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationInfoReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationInfoReq) ProtoMessage() {}
+
+func (x *GetSignalInvitationInfoReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[47]
+	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 GetSignalInvitationInfoReq.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationInfoReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{47}
+}
+
+func (x *GetSignalInvitationInfoReq) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+type GetSignalInvitationInfoResp struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	InvitationInfo  *InvitationInfo        `protobuf:"bytes,1,opt,name=invitationInfo,proto3" json:"invitationInfo,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationInfoResp) Reset() {
+	*x = GetSignalInvitationInfoResp{}
+	mi := &file_rtc_proto_msgTypes[48]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationInfoResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationInfoResp) ProtoMessage() {}
+
+func (x *GetSignalInvitationInfoResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[48]
+	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 GetSignalInvitationInfoResp.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationInfoResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{48}
+}
+
+func (x *GetSignalInvitationInfoResp) GetInvitationInfo() *InvitationInfo {
+	if x != nil {
+		return x.InvitationInfo
+	}
+	return nil
+}
+
+func (x *GetSignalInvitationInfoResp) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+type GetSignalInvitationInfoStartAppReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserID        string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationInfoStartAppReq) Reset() {
+	*x = GetSignalInvitationInfoStartAppReq{}
+	mi := &file_rtc_proto_msgTypes[49]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationInfoStartAppReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationInfoStartAppReq) ProtoMessage() {}
+
+func (x *GetSignalInvitationInfoStartAppReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[49]
+	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 GetSignalInvitationInfoStartAppReq.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationInfoStartAppReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{49}
+}
+
+func (x *GetSignalInvitationInfoStartAppReq) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+type GetSignalInvitationInfoStartAppResp struct {
+	state           protoimpl.MessageState `protogen:"open.v1"`
+	Invitation      *InvitationInfo        `protobuf:"bytes,1,opt,name=invitation,proto3" json:"invitation,omitempty"`
+	OfflinePushInfo *OfflinePushInfo       `protobuf:"bytes,2,opt,name=offlinePushInfo,proto3" json:"offlinePushInfo,omitempty"`
+	unknownFields   protoimpl.UnknownFields
+	sizeCache       protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationInfoStartAppResp) Reset() {
+	*x = GetSignalInvitationInfoStartAppResp{}
+	mi := &file_rtc_proto_msgTypes[50]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationInfoStartAppResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationInfoStartAppResp) ProtoMessage() {}
+
+func (x *GetSignalInvitationInfoStartAppResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[50]
+	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 GetSignalInvitationInfoStartAppResp.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationInfoStartAppResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{50}
+}
+
+func (x *GetSignalInvitationInfoStartAppResp) GetInvitation() *InvitationInfo {
+	if x != nil {
+		return x.Invitation
+	}
+	return nil
+}
+
+func (x *GetSignalInvitationInfoStartAppResp) GetOfflinePushInfo() *OfflinePushInfo {
+	if x != nil {
+		return x.OfflinePushInfo
+	}
+	return nil
+}
+
+type OfflinePushInfo struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Title         string                 `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"`
+	Desc          string                 `protobuf:"bytes,2,opt,name=desc,proto3" json:"desc,omitempty"`
+	Ex            string                 `protobuf:"bytes,3,opt,name=ex,proto3" json:"ex,omitempty"`
+	IOSPushSound  string                 `protobuf:"bytes,4,opt,name=iOSPushSound,proto3" json:"iOSPushSound,omitempty"`
+	IOSBadgeCount bool                   `protobuf:"varint,5,opt,name=iOSBadgeCount,proto3" json:"iOSBadgeCount,omitempty"`
+	SignalInfo    string                 `protobuf:"bytes,6,opt,name=signalInfo,proto3" json:"signalInfo,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *OfflinePushInfo) Reset() {
+	*x = OfflinePushInfo{}
+	mi := &file_rtc_proto_msgTypes[51]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *OfflinePushInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OfflinePushInfo) ProtoMessage() {}
+
+func (x *OfflinePushInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[51]
+	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 OfflinePushInfo.ProtoReflect.Descriptor instead.
+func (*OfflinePushInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{51}
+}
+
+func (x *OfflinePushInfo) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *OfflinePushInfo) GetDesc() string {
+	if x != nil {
+		return x.Desc
+	}
+	return ""
+}
+
+func (x *OfflinePushInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *OfflinePushInfo) GetIOSPushSound() string {
+	if x != nil {
+		return x.IOSPushSound
+	}
+	return ""
+}
+
+func (x *OfflinePushInfo) GetIOSBadgeCount() bool {
+	if x != nil {
+		return x.IOSBadgeCount
+	}
+	return false
+}
+
+func (x *OfflinePushInfo) GetSignalInfo() string {
+	if x != nil {
+		return x.SignalInfo
+	}
+	return ""
+}
+
+type SignalUser struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserID        string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	Nickname      string                 `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"`
+	Status        int32                  `protobuf:"varint,3,opt,name=status,proto3" json:"status,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *SignalUser) Reset() {
+	*x = SignalUser{}
+	mi := &file_rtc_proto_msgTypes[52]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalUser) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalUser) ProtoMessage() {}
+
+func (x *SignalUser) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[52]
+	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 SignalUser.ProtoReflect.Descriptor instead.
+func (*SignalUser) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{52}
+}
+
+func (x *SignalUser) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *SignalUser) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *SignalUser) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+type SignalRecord struct {
+	state               protoimpl.MessageState `protogen:"open.v1"`
+	RoomID              string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	SID                 string                 `protobuf:"bytes,2,opt,name=sID,proto3" json:"sID,omitempty"`
+	FileName            string                 `protobuf:"bytes,3,opt,name=fileName,proto3" json:"fileName,omitempty"`
+	MediaType           string                 `protobuf:"bytes,4,opt,name=mediaType,proto3" json:"mediaType,omitempty"`
+	SessionType         int32                  `protobuf:"varint,5,opt,name=sessionType,proto3" json:"sessionType,omitempty"`
+	InviterUserID       string                 `protobuf:"bytes,6,opt,name=inviterUserID,proto3" json:"inviterUserID,omitempty"`
+	InviterUserNickname string                 `protobuf:"bytes,7,opt,name=inviterUserNickname,proto3" json:"inviterUserNickname,omitempty"`
+	GroupID             string                 `protobuf:"bytes,8,opt,name=groupID,proto3" json:"groupID,omitempty"`
+	GroupName           string                 `protobuf:"bytes,9,opt,name=groupName,proto3" json:"groupName,omitempty"`
+	InviterUsers        []*SignalUser          `protobuf:"bytes,10,rep,name=inviterUsers,proto3" json:"inviterUsers,omitempty"`
+	CreateTime          int64                  `protobuf:"varint,11,opt,name=createTime,proto3" json:"createTime,omitempty"`
+	EndTime             int64                  `protobuf:"varint,12,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	Size                string                 `protobuf:"bytes,13,opt,name=size,proto3" json:"size,omitempty"`
+	FileURL             string                 `protobuf:"bytes,14,opt,name=fileURL,proto3" json:"fileURL,omitempty"`
+	unknownFields       protoimpl.UnknownFields
+	sizeCache           protoimpl.SizeCache
+}
+
+func (x *SignalRecord) Reset() {
+	*x = SignalRecord{}
+	mi := &file_rtc_proto_msgTypes[53]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *SignalRecord) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SignalRecord) ProtoMessage() {}
+
+func (x *SignalRecord) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[53]
+	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 SignalRecord.ProtoReflect.Descriptor instead.
+func (*SignalRecord) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{53}
+}
+
+func (x *SignalRecord) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetSID() string {
+	if x != nil {
+		return x.SID
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetFileName() string {
+	if x != nil {
+		return x.FileName
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetMediaType() string {
+	if x != nil {
+		return x.MediaType
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetSessionType() int32 {
+	if x != nil {
+		return x.SessionType
+	}
+	return 0
+}
+
+func (x *SignalRecord) GetInviterUserID() string {
+	if x != nil {
+		return x.InviterUserID
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetInviterUserNickname() string {
+	if x != nil {
+		return x.InviterUserNickname
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetGroupID() string {
+	if x != nil {
+		return x.GroupID
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetGroupName() string {
+	if x != nil {
+		return x.GroupName
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetInviterUsers() []*SignalUser {
+	if x != nil {
+		return x.InviterUsers
+	}
+	return nil
+}
+
+func (x *SignalRecord) GetCreateTime() int64 {
+	if x != nil {
+		return x.CreateTime
+	}
+	return 0
+}
+
+func (x *SignalRecord) GetEndTime() int64 {
+	if x != nil {
+		return x.EndTime
+	}
+	return 0
+}
+
+func (x *SignalRecord) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+func (x *SignalRecord) GetFileURL() string {
+	if x != nil {
+		return x.FileURL
+	}
+	return ""
+}
+
+type MeetingUser struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	UserID        string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	Nickname      string                 `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *MeetingUser) Reset() {
+	*x = MeetingUser{}
+	mi := &file_rtc_proto_msgTypes[54]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MeetingUser) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeetingUser) ProtoMessage() {}
+
+func (x *MeetingUser) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[54]
+	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 MeetingUser.ProtoReflect.Descriptor instead.
+func (*MeetingUser) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{54}
+}
+
+func (x *MeetingUser) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *MeetingUser) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+type FileRecord struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Size          string                 `protobuf:"bytes,1,opt,name=size,proto3" json:"size,omitempty"`
+	FileURL       string                 `protobuf:"bytes,2,opt,name=fileURL,proto3" json:"fileURL,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *FileRecord) Reset() {
+	*x = FileRecord{}
+	mi := &file_rtc_proto_msgTypes[55]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FileRecord) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FileRecord) ProtoMessage() {}
+
+func (x *FileRecord) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[55]
+	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 FileRecord.ProtoReflect.Descriptor instead.
+func (*FileRecord) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{55}
+}
+
+func (x *FileRecord) GetSize() string {
+	if x != nil {
+		return x.Size
+	}
+	return ""
+}
+
+func (x *FileRecord) GetFileURL() string {
+	if x != nil {
+		return x.FileURL
+	}
+	return ""
+}
+
+type MeetingRecord struct {
+	state            protoimpl.MessageState `protogen:"open.v1"`
+	RoomID           string                 `protobuf:"bytes,1,opt,name=roomID,proto3" json:"roomID,omitempty"`
+	MeetingName      string                 `protobuf:"bytes,2,opt,name=meetingName,proto3" json:"meetingName,omitempty"`
+	Ex               string                 `protobuf:"bytes,3,opt,name=ex,proto3" json:"ex,omitempty"`
+	HostUserID       string                 `protobuf:"bytes,4,opt,name=hostUserID,proto3" json:"hostUserID,omitempty"`
+	HostUserNickname string                 `protobuf:"bytes,5,opt,name=hostUserNickname,proto3" json:"hostUserNickname,omitempty"`
+	CreateTime       int64                  `protobuf:"varint,6,opt,name=createTime,proto3" json:"createTime,omitempty"`
+	StartTime        int64                  `protobuf:"varint,7,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	EndTime          int64                  `protobuf:"varint,8,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	JoinedUsers      []*MeetingUser         `protobuf:"bytes,9,rep,name=joinedUsers,proto3" json:"joinedUsers,omitempty"`
+	Status           int32                  `protobuf:"varint,10,opt,name=status,proto3" json:"status,omitempty"`
+	FileRecords      []*FileRecord          `protobuf:"bytes,11,rep,name=fileRecords,proto3" json:"fileRecords,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
+}
+
+func (x *MeetingRecord) Reset() {
+	*x = MeetingRecord{}
+	mi := &file_rtc_proto_msgTypes[56]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MeetingRecord) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MeetingRecord) ProtoMessage() {}
+
+func (x *MeetingRecord) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[56]
+	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 MeetingRecord.ProtoReflect.Descriptor instead.
+func (*MeetingRecord) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{56}
+}
+
+func (x *MeetingRecord) GetRoomID() string {
+	if x != nil {
+		return x.RoomID
+	}
+	return ""
+}
+
+func (x *MeetingRecord) GetMeetingName() string {
+	if x != nil {
+		return x.MeetingName
+	}
+	return ""
+}
+
+func (x *MeetingRecord) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *MeetingRecord) GetHostUserID() string {
+	if x != nil {
+		return x.HostUserID
+	}
+	return ""
+}
+
+func (x *MeetingRecord) GetHostUserNickname() string {
+	if x != nil {
+		return x.HostUserNickname
+	}
+	return ""
+}
+
+func (x *MeetingRecord) GetCreateTime() int64 {
+	if x != nil {
+		return x.CreateTime
+	}
+	return 0
+}
+
+func (x *MeetingRecord) GetStartTime() int64 {
+	if x != nil {
+		return x.StartTime
+	}
+	return 0
+}
+
+func (x *MeetingRecord) GetEndTime() int64 {
+	if x != nil {
+		return x.EndTime
+	}
+	return 0
+}
+
+func (x *MeetingRecord) GetJoinedUsers() []*MeetingUser {
+	if x != nil {
+		return x.JoinedUsers
+	}
+	return nil
+}
+
+func (x *MeetingRecord) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *MeetingRecord) GetFileRecords() []*FileRecord {
+	if x != nil {
+		return x.FileRecords
+	}
+	return nil
+}
+
+type GetSignalInvitationRecordsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Pagination    *RequestPagination     `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"`
+	SessionType   int32                  `protobuf:"varint,2,opt,name=sessionType,proto3" json:"sessionType,omitempty"`
+	SendID        string                 `protobuf:"bytes,3,opt,name=sendID,proto3" json:"sendID,omitempty"`
+	RecvID        string                 `protobuf:"bytes,4,opt,name=recvID,proto3" json:"recvID,omitempty"`
+	StartTime     int64                  `protobuf:"varint,5,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	EndTime       int64                  `protobuf:"varint,6,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	JoinedUsers   []*UserInfo            `protobuf:"bytes,7,rep,name=JoinedUsers,proto3" json:"JoinedUsers,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationRecordsReq) Reset() {
+	*x = GetSignalInvitationRecordsReq{}
+	mi := &file_rtc_proto_msgTypes[57]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationRecordsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationRecordsReq) ProtoMessage() {}
+
+func (x *GetSignalInvitationRecordsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[57]
+	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 GetSignalInvitationRecordsReq.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationRecordsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{57}
+}
+
+func (x *GetSignalInvitationRecordsReq) GetPagination() *RequestPagination {
+	if x != nil {
+		return x.Pagination
+	}
+	return nil
+}
+
+func (x *GetSignalInvitationRecordsReq) GetSessionType() int32 {
+	if x != nil {
+		return x.SessionType
+	}
+	return 0
+}
+
+func (x *GetSignalInvitationRecordsReq) GetSendID() string {
+	if x != nil {
+		return x.SendID
+	}
+	return ""
+}
+
+func (x *GetSignalInvitationRecordsReq) GetRecvID() string {
+	if x != nil {
+		return x.RecvID
+	}
+	return ""
+}
+
+func (x *GetSignalInvitationRecordsReq) GetStartTime() int64 {
+	if x != nil {
+		return x.StartTime
+	}
+	return 0
+}
+
+func (x *GetSignalInvitationRecordsReq) GetEndTime() int64 {
+	if x != nil {
+		return x.EndTime
+	}
+	return 0
+}
+
+func (x *GetSignalInvitationRecordsReq) GetJoinedUsers() []*UserInfo {
+	if x != nil {
+		return x.JoinedUsers
+	}
+	return nil
+}
+
+type RequestPagination struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	PageNumber    int32                  `protobuf:"varint,1,opt,name=pageNumber,proto3" json:"pageNumber,omitempty"`
+	ShowNumber    int32                  `protobuf:"varint,2,opt,name=showNumber,proto3" json:"showNumber,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *RequestPagination) Reset() {
+	*x = RequestPagination{}
+	mi := &file_rtc_proto_msgTypes[58]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *RequestPagination) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*RequestPagination) ProtoMessage() {}
+
+func (x *RequestPagination) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[58]
+	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 RequestPagination.ProtoReflect.Descriptor instead.
+func (*RequestPagination) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{58}
+}
+
+func (x *RequestPagination) GetPageNumber() int32 {
+	if x != nil {
+		return x.PageNumber
+	}
+	return 0
+}
+
+func (x *RequestPagination) GetShowNumber() int32 {
+	if x != nil {
+		return x.ShowNumber
+	}
+	return 0
+}
+
+type UserInfo struct {
+	state            protoimpl.MessageState `protogen:"open.v1"`
+	UserID           string                 `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"`
+	Nickname         string                 `protobuf:"bytes,2,opt,name=nickname,proto3" json:"nickname,omitempty"`
+	FaceURL          string                 `protobuf:"bytes,3,opt,name=faceURL,proto3" json:"faceURL,omitempty"`
+	Ex               string                 `protobuf:"bytes,4,opt,name=ex,proto3" json:"ex,omitempty"`
+	CreateTime       int64                  `protobuf:"varint,5,opt,name=createTime,proto3" json:"createTime,omitempty"`
+	AppMangerLevel   int32                  `protobuf:"varint,6,opt,name=appMangerLevel,proto3" json:"appMangerLevel,omitempty"`
+	GlobalRecvMsgOpt int32                  `protobuf:"varint,7,opt,name=globalRecvMsgOpt,proto3" json:"globalRecvMsgOpt,omitempty"`
+	Status           int32                  `protobuf:"varint,8,opt,name=status,proto3" json:"status,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
+}
+
+func (x *UserInfo) Reset() {
+	*x = UserInfo{}
+	mi := &file_rtc_proto_msgTypes[59]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UserInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserInfo) ProtoMessage() {}
+
+func (x *UserInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[59]
+	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 UserInfo.ProtoReflect.Descriptor instead.
+func (*UserInfo) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{59}
+}
+
+func (x *UserInfo) GetUserID() string {
+	if x != nil {
+		return x.UserID
+	}
+	return ""
+}
+
+func (x *UserInfo) GetNickname() string {
+	if x != nil {
+		return x.Nickname
+	}
+	return ""
+}
+
+func (x *UserInfo) GetFaceURL() string {
+	if x != nil {
+		return x.FaceURL
+	}
+	return ""
+}
+
+func (x *UserInfo) GetEx() string {
+	if x != nil {
+		return x.Ex
+	}
+	return ""
+}
+
+func (x *UserInfo) GetCreateTime() int64 {
+	if x != nil {
+		return x.CreateTime
+	}
+	return 0
+}
+
+func (x *UserInfo) GetAppMangerLevel() int32 {
+	if x != nil {
+		return x.AppMangerLevel
+	}
+	return 0
+}
+
+func (x *UserInfo) GetGlobalRecvMsgOpt() int32 {
+	if x != nil {
+		return x.GlobalRecvMsgOpt
+	}
+	return 0
+}
+
+func (x *UserInfo) GetStatus() int32 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+type GetSignalInvitationRecordsResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	Total         int32                  `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
+	SignalRecords []*SignalRecord        `protobuf:"bytes,2,rep,name=signalRecords,proto3" json:"signalRecords,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetSignalInvitationRecordsResp) Reset() {
+	*x = GetSignalInvitationRecordsResp{}
+	mi := &file_rtc_proto_msgTypes[60]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetSignalInvitationRecordsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetSignalInvitationRecordsResp) ProtoMessage() {}
+
+func (x *GetSignalInvitationRecordsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[60]
+	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 GetSignalInvitationRecordsResp.ProtoReflect.Descriptor instead.
+func (*GetSignalInvitationRecordsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{60}
+}
+
+func (x *GetSignalInvitationRecordsResp) GetTotal() int32 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+func (x *GetSignalInvitationRecordsResp) GetSignalRecords() []*SignalRecord {
+	if x != nil {
+		return x.SignalRecords
+	}
+	return nil
+}
+
+type DeleteSignalRecordsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	SIDs          []string               `protobuf:"bytes,1,rep,name=sIDs,proto3" json:"sIDs,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeleteSignalRecordsReq) Reset() {
+	*x = DeleteSignalRecordsReq{}
+	mi := &file_rtc_proto_msgTypes[61]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteSignalRecordsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteSignalRecordsReq) ProtoMessage() {}
+
+func (x *DeleteSignalRecordsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[61]
+	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 DeleteSignalRecordsReq.ProtoReflect.Descriptor instead.
+func (*DeleteSignalRecordsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{61}
+}
+
+func (x *DeleteSignalRecordsReq) GetSIDs() []string {
+	if x != nil {
+		return x.SIDs
+	}
+	return nil
+}
+
+type DeleteSignalRecordsResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeleteSignalRecordsResp) Reset() {
+	*x = DeleteSignalRecordsResp{}
+	mi := &file_rtc_proto_msgTypes[62]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteSignalRecordsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteSignalRecordsResp) ProtoMessage() {}
+
+func (x *DeleteSignalRecordsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[62]
+	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 DeleteSignalRecordsResp.ProtoReflect.Descriptor instead.
+func (*DeleteSignalRecordsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{62}
+}
+
+type GetMeetingRecordsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	HostUserID    string                 `protobuf:"bytes,1,opt,name=hostUserID,proto3" json:"hostUserID,omitempty"`
+	JoinedUserID  string                 `protobuf:"bytes,2,opt,name=joinedUserID,proto3" json:"joinedUserID,omitempty"`
+	StartTime     int64                  `protobuf:"varint,3,opt,name=startTime,proto3" json:"startTime,omitempty"`
+	EndTime       int64                  `protobuf:"varint,4,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	Pagination    *RequestPagination     `protobuf:"bytes,5,opt,name=pagination,proto3" json:"pagination,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *GetMeetingRecordsReq) Reset() {
+	*x = GetMeetingRecordsReq{}
+	mi := &file_rtc_proto_msgTypes[63]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetMeetingRecordsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMeetingRecordsReq) ProtoMessage() {}
+
+func (x *GetMeetingRecordsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[63]
+	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 GetMeetingRecordsReq.ProtoReflect.Descriptor instead.
+func (*GetMeetingRecordsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{63}
+}
+
+func (x *GetMeetingRecordsReq) GetHostUserID() string {
+	if x != nil {
+		return x.HostUserID
+	}
+	return ""
+}
+
+func (x *GetMeetingRecordsReq) GetJoinedUserID() string {
+	if x != nil {
+		return x.JoinedUserID
+	}
+	return ""
+}
+
+func (x *GetMeetingRecordsReq) GetStartTime() int64 {
+	if x != nil {
+		return x.StartTime
+	}
+	return 0
+}
+
+func (x *GetMeetingRecordsReq) GetEndTime() int64 {
+	if x != nil {
+		return x.EndTime
+	}
+	return 0
+}
+
+func (x *GetMeetingRecordsReq) GetPagination() *RequestPagination {
+	if x != nil {
+		return x.Pagination
+	}
+	return nil
+}
+
+type GetMeetingRecordsResp struct {
+	state          protoimpl.MessageState `protogen:"open.v1"`
+	Total          int32                  `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
+	MeetingRecords []*MeetingRecord       `protobuf:"bytes,2,rep,name=meetingRecords,proto3" json:"meetingRecords,omitempty"`
+	unknownFields  protoimpl.UnknownFields
+	sizeCache      protoimpl.SizeCache
+}
+
+func (x *GetMeetingRecordsResp) Reset() {
+	*x = GetMeetingRecordsResp{}
+	mi := &file_rtc_proto_msgTypes[64]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *GetMeetingRecordsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetMeetingRecordsResp) ProtoMessage() {}
+
+func (x *GetMeetingRecordsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[64]
+	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 GetMeetingRecordsResp.ProtoReflect.Descriptor instead.
+func (*GetMeetingRecordsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{64}
+}
+
+func (x *GetMeetingRecordsResp) GetTotal() int32 {
+	if x != nil {
+		return x.Total
+	}
+	return 0
+}
+
+func (x *GetMeetingRecordsResp) GetMeetingRecords() []*MeetingRecord {
+	if x != nil {
+		return x.MeetingRecords
+	}
+	return nil
+}
+
+type DeleteMeetingRecordsReq struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	RoomIDs       []string               `protobuf:"bytes,1,rep,name=roomIDs,proto3" json:"roomIDs,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeleteMeetingRecordsReq) Reset() {
+	*x = DeleteMeetingRecordsReq{}
+	mi := &file_rtc_proto_msgTypes[65]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteMeetingRecordsReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMeetingRecordsReq) ProtoMessage() {}
+
+func (x *DeleteMeetingRecordsReq) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[65]
+	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 DeleteMeetingRecordsReq.ProtoReflect.Descriptor instead.
+func (*DeleteMeetingRecordsReq) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{65}
+}
+
+func (x *DeleteMeetingRecordsReq) GetRoomIDs() []string {
+	if x != nil {
+		return x.RoomIDs
+	}
+	return nil
+}
+
+type DeleteMeetingRecordsResp struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DeleteMeetingRecordsResp) Reset() {
+	*x = DeleteMeetingRecordsResp{}
+	mi := &file_rtc_proto_msgTypes[66]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DeleteMeetingRecordsResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DeleteMeetingRecordsResp) ProtoMessage() {}
+
+func (x *DeleteMeetingRecordsResp) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[66]
+	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 DeleteMeetingRecordsResp.ProtoReflect.Descriptor instead.
+func (*DeleteMeetingRecordsResp) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{66}
+}
+
+// Wrapper message for `double`.
+//
+// The JSON representation for `DoubleValue` is JSON number.
+type DoubleValue struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The double value.
+	Value         float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *DoubleValue) Reset() {
+	*x = DoubleValue{}
+	mi := &file_rtc_proto_msgTypes[67]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *DoubleValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DoubleValue) ProtoMessage() {}
+
+func (x *DoubleValue) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[67]
+	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 DoubleValue.ProtoReflect.Descriptor instead.
+func (*DoubleValue) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{67}
+}
+
+func (x *DoubleValue) GetValue() float64 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `float`.
+//
+// The JSON representation for `FloatValue` is JSON number.
+type FloatValue struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The float value.
+	Value         float32 `protobuf:"fixed32,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *FloatValue) Reset() {
+	*x = FloatValue{}
+	mi := &file_rtc_proto_msgTypes[68]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *FloatValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*FloatValue) ProtoMessage() {}
+
+func (x *FloatValue) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[68]
+	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 FloatValue.ProtoReflect.Descriptor instead.
+func (*FloatValue) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{68}
+}
+
+func (x *FloatValue) GetValue() float32 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `int64`.
+//
+// The JSON representation for `Int64Value` is JSON string.
+type Int64Value struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The int64 value.
+	Value         int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Int64Value) Reset() {
+	*x = Int64Value{}
+	mi := &file_rtc_proto_msgTypes[69]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Int64Value) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Int64Value) ProtoMessage() {}
+
+func (x *Int64Value) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[69]
+	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 Int64Value.ProtoReflect.Descriptor instead.
+func (*Int64Value) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{69}
+}
+
+func (x *Int64Value) GetValue() int64 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `uint64`.
+//
+// The JSON representation for `UInt64Value` is JSON string.
+type UInt64Value struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The uint64 value.
+	Value         uint64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *UInt64Value) Reset() {
+	*x = UInt64Value{}
+	mi := &file_rtc_proto_msgTypes[70]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UInt64Value) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UInt64Value) ProtoMessage() {}
+
+func (x *UInt64Value) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[70]
+	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 UInt64Value.ProtoReflect.Descriptor instead.
+func (*UInt64Value) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{70}
+}
+
+func (x *UInt64Value) GetValue() uint64 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `int32`.
+//
+// The JSON representation for `Int32Value` is JSON number.
+type Int32Value struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The int32 value.
+	Value         int32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *Int32Value) Reset() {
+	*x = Int32Value{}
+	mi := &file_rtc_proto_msgTypes[71]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *Int32Value) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Int32Value) ProtoMessage() {}
+
+func (x *Int32Value) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[71]
+	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 Int32Value.ProtoReflect.Descriptor instead.
+func (*Int32Value) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{71}
+}
+
+func (x *Int32Value) GetValue() int32 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `uint32`.
+//
+// The JSON representation for `UInt32Value` is JSON number.
+type UInt32Value struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The uint32 value.
+	Value         uint32 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *UInt32Value) Reset() {
+	*x = UInt32Value{}
+	mi := &file_rtc_proto_msgTypes[72]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *UInt32Value) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UInt32Value) ProtoMessage() {}
+
+func (x *UInt32Value) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[72]
+	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 UInt32Value.ProtoReflect.Descriptor instead.
+func (*UInt32Value) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{72}
+}
+
+func (x *UInt32Value) GetValue() uint32 {
+	if x != nil {
+		return x.Value
+	}
+	return 0
+}
+
+// Wrapper message for `bool`.
+//
+// The JSON representation for `BoolValue` is JSON `true` and `false`.
+type BoolValue struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The bool value.
+	Value         bool `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *BoolValue) Reset() {
+	*x = BoolValue{}
+	mi := &file_rtc_proto_msgTypes[73]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *BoolValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BoolValue) ProtoMessage() {}
+
+func (x *BoolValue) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[73]
+	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 BoolValue.ProtoReflect.Descriptor instead.
+func (*BoolValue) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{73}
+}
+
+func (x *BoolValue) GetValue() bool {
+	if x != nil {
+		return x.Value
+	}
+	return false
+}
+
+// Wrapper message for `string`.
+//
+// The JSON representation for `StringValue` is JSON string.
+type StringValue struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The string value.
+	Value         string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *StringValue) Reset() {
+	*x = StringValue{}
+	mi := &file_rtc_proto_msgTypes[74]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *StringValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StringValue) ProtoMessage() {}
+
+func (x *StringValue) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[74]
+	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 StringValue.ProtoReflect.Descriptor instead.
+func (*StringValue) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{74}
+}
+
+func (x *StringValue) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+// Wrapper message for `bytes`.
+//
+// The JSON representation for `BytesValue` is JSON string.
+type BytesValue struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// The bytes value.
+	Value         []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *BytesValue) Reset() {
+	*x = BytesValue{}
+	mi := &file_rtc_proto_msgTypes[75]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *BytesValue) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BytesValue) ProtoMessage() {}
+
+func (x *BytesValue) ProtoReflect() protoreflect.Message {
+	mi := &file_rtc_proto_msgTypes[75]
+	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 BytesValue.ProtoReflect.Descriptor instead.
+func (*BytesValue) Descriptor() ([]byte, []int) {
+	return file_rtc_proto_rawDescGZIP(), []int{75}
+}
+
+func (x *BytesValue) GetValue() []byte {
+	if x != nil {
+		return x.Value
+	}
+	return nil
+}
+
+var File_rtc_proto protoreflect.FileDescriptor
+
+var file_rtc_proto_rawDesc = []byte{
+	0x0a, 0x09, 0x72, 0x74, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x72, 0x74, 0x63,
+	0x22, 0xb8, 0x01, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74,
+	0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75,
+	0x70, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x67, 0x72, 0x6f,
+	0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4d,
+	0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d, 0x62, 0x65,
+	0x72, 0x46, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x08, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72,
+	0x74, 0x63, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x85, 0x05, 0x0a, 0x09,
+	0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f,
+	0x75, 0x70, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75,
+	0x70, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d, 0x65,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e, 0x61, 0x6d,
+	0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74,
+	0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63,
+	0x65, 0x55, 0x52, 0x4c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x65,
+	0x55, 0x52, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54,
+	0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x62,
+	0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75,
+	0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12,
+	0x24, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79,
+	0x70, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x54,
+	0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x6e, 0x65, 0x65, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6e,
+	0x65, 0x65, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x26, 0x0a, 0x0e, 0x6c, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x6e, 0x66,
+	0x6f, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6c, 0x6f, 0x6f, 0x6b, 0x4d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x79,
+	0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x11, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x46,
+	0x72, 0x69, 0x65, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18,
+	0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a,
+	0x12, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x6f, 0x74, 0x69, 0x66,
+	0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x24, 0x0a,
+	0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x49, 0x73, 0x52, 0x65, 0x61, 0x64, 0x18, 0x12,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x49, 0x73, 0x52,
+	0x65, 0x61, 0x64, 0x22, 0xff, 0x02, 0x0a, 0x13, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4d, 0x65, 0x6d,
+	0x62, 0x65, 0x72, 0x46, 0x75, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72,
+	0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1c, 0x0a,
+	0x09, 0x72, 0x6f, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
+	0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6a,
+	0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a,
+	0x6f, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e,
+	0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e,
+	0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x26, 0x0a,
+	0x0e, 0x61, 0x70, 0x70, 0x4d, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x4d, 0x61, 0x6e, 0x67, 0x65, 0x72,
+	0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x53, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x53,
+	0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f,
+	0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f,
+	0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x0e, 0x0a,
+	0x02, 0x65, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x12, 0x20, 0x0a,
+	0x0b, 0x6d, 0x75, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0b, 0x6d, 0x75, 0x74, 0x65, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12,
+	0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x6e, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12,
+	0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66,
+	0x61, 0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61,
+	0x63, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x02, 0x65, 0x78, 0x22, 0x77, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e,
+	0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x1a, 0x0a, 0x08,
+	0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
+	0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61,
+	0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61,
+	0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3e,
+	0x0a, 0x10, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x03, 0x6a, 0x77, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x22, 0x99,
+	0x03, 0x0a, 0x09, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2e, 0x0a, 0x06,
+	0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72,
+	0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52,
+	0x65, 0x71, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x0d,
+	0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71,
+	0x48, 0x00, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75,
+	0x70, 0x12, 0x2e, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x61,
+	0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65,
+	0x6c, 0x12, 0x2e, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63,
+	0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70,
+	0x74, 0x12, 0x2e, 0x0a, 0x06, 0x68, 0x75, 0x6e, 0x67, 0x55, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x48, 0x75,
+	0x6e, 0x67, 0x55, 0x70, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x06, 0x68, 0x75, 0x6e, 0x67, 0x55,
+	0x70, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65,
+	0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63,
+	0x74, 0x12, 0x4c, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52,
+	0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
+	0x42, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x52, 0x65, 0x71, 0x48, 0x00, 0x52, 0x10, 0x67,
+	0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x42,
+	0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x53, 0x0a, 0x19, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
+	0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12,
+	0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22,
+	0x1c, 0x0a, 0x1a, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x73,
+	0x74, 0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2e, 0x0a,
+	0x14, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e,
+	0x67, 0x73, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x53, 0x0a,
+	0x15, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e,
+	0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x3a, 0x0a, 0x0f, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e,
+	0x67, 0x49, 0x6e, 0x66, 0x6f, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x10, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x0f, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x4c, 0x69,
+	0x73, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a,
+	0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a,
+	0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72,
+	0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x12, 0x0a,
+	0x04, 0x6d, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6d, 0x75, 0x74,
+	0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x05, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x07, 0x6d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0x19, 0x0a, 0x17, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x22, 0x65, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x4f, 0x6e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65,
+	0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73,
+	0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x75, 0x74,
+	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6d, 0x75, 0x74, 0x65, 0x22, 0xc2, 0x02,
+	0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x28, 0x0a, 0x0f, 0x6d, 0x65, 0x65, 0x74,
+	0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x0f, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x11,
+	0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67,
+	0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x3a, 0x0a, 0x0b, 0x70, 0x61,
+	0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e,
+	0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69,
+	0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x06, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d,
+	0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69,
+	0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+	0x65, 0x78, 0x22, 0x61, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f,
+	0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6c,
+	0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69,
+	0x76, 0x65, 0x55, 0x52, 0x4c, 0x22, 0x82, 0x01, 0x0a, 0x14, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x12, 0x16,
+	0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x3a,
+	0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x5f, 0x0a, 0x15, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f,
+	0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
+	0x44, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x22, 0xa1, 0x03, 0x0a, 0x0a,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x06, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x48, 0x00, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x69,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70,
+	0x48, 0x00, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75,
+	0x70, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x15, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x61,
+	0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61, 0x6e, 0x63,
+	0x65, 0x6c, 0x12, 0x2f, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41,
+	0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x06, 0x61, 0x63, 0x63,
+	0x65, 0x70, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x68, 0x75, 0x6e, 0x67, 0x55, 0x70, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x48, 0x75, 0x6e, 0x67, 0x55, 0x70, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x06, 0x68, 0x75,
+	0x6e, 0x67, 0x55, 0x70, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x06,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61,
+	0x6c, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x48, 0x00, 0x52, 0x06, 0x72,
+	0x65, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65,
+	0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54,
+	0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70,
+	0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f,
+	0x6f, 0x6d, 0x49, 0x44, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22,
+	0x84, 0x03, 0x0a, 0x0e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
+	0x66, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
+	0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74,
+	0x6f, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49,
+	0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44,
+	0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65,
+	0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f,
+	0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x18,
+	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65,
+	0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44,
+	0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18,
+	0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x54, 0x69,
+	0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61,
+	0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x75, 0x73, 0x79, 0x4c, 0x69,
+	0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x12, 0x62, 0x75, 0x73, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x9d, 0x07, 0x0a, 0x0b, 0x4d, 0x65, 0x65, 0x74, 0x69,
+	0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x20,
+	0x0a, 0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65,
+	0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78,
+	0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e,
+	0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c,
+	0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07,
+	0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65,
+	0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x55, 0x6e, 0x6d, 0x75, 0x74, 0x65, 0x53, 0x65,
+	0x6c, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x55, 0x6e, 0x6d, 0x75, 0x74, 0x65, 0x53, 0x65,
+	0x6c, 0x66, 0x12, 0x3c, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e,
+	0x74, 0x43, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61,
+	0x6e, 0x74, 0x43, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f,
+	0x12, 0x2e, 0x0a, 0x12, 0x6f, 0x6e, 0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x6f, 0x6e,
+	0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72,
+	0x12, 0x30, 0x0a, 0x13, 0x6f, 0x6e, 0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72,
+	0x65, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6f,
+	0x6e, 0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x65,
+	0x65, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c,
+	0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28,
+	0x08, 0x52, 0x15, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69,
+	0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x6a, 0x6f, 0x69, 0x6e,
+	0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x0e, 0x20, 0x01,
+	0x28, 0x08, 0x52, 0x10, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56,
+	0x69, 0x64, 0x65, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x73, 0x4d, 0x75, 0x74, 0x65, 0x41, 0x6c,
+	0x6c, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x69, 0x73,
+	0x4d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x12, 0x30, 0x0a, 0x13,
+	0x69, 0x73, 0x4d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68,
+	0x6f, 0x6e, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, 0x4d, 0x75, 0x74,
+	0x65, 0x41, 0x6c, 0x6c, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x30,
+	0x0a, 0x13, 0x63, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x61, 0x6e,
+	0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74,
+	0x12, 0x40, 0x0a, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f,
+	0x70, 0x68, 0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18,
+	0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69,
+	0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x36, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64,
+	0x65, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x13, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x69,
+	0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x14, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65,
+	0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x15, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x13, 0x62, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x61,
+	0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13,
+	0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
+	0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e,
+	0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4f,
+	0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f,
+	0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12,
+	0x3a, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69,
+	0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b,
+	0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x22, 0x8a, 0x01, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65,
+	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16,
+	0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52,
+	0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c,
+	0x12, 0x2e, 0x0a, 0x12, 0x62, 0x75, 0x73, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x62, 0x75,
+	0x73, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74,
+	0x22, 0xe1, 0x01, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a, 0x69,
+	0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x13, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49,
+	0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e,
+	0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x3a, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74,
+	0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52,
+	0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06,
+	0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x44, 0x22, 0x91, 0x01, 0x0a, 0x17, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49,
+	0x6e, 0x76, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x18,
+	0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x75, 0x73, 0x79,
+	0x4c, 0x69, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x04,
+	0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x62, 0x75, 0x73, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a,
+	0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x13, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68,
+	0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66,
+	0x6f, 0x12, 0x3a, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72,
+	0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
+	0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x16, 0x0a,
+	0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x12, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43,
+	0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x22, 0x86, 0x02, 0x0a, 0x0f, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a,
+	0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73,
+	0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66,
+	0x6f, 0x52, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e,
+	0x66, 0x6f, 0x12, 0x3a, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e,
+	0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61,
+	0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
+	0x61, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x2a,
+	0x0a, 0x10, 0x6f, 0x70, 0x55, 0x73, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
+	0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x70, 0x55, 0x73, 0x65, 0x72,
+	0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x22, 0x5a, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x65,
+	0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f,
+	0x6f, 0x6d, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c, 0x22, 0x9e,
+	0x01, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x48, 0x75, 0x6e, 0x67, 0x55, 0x70, 0x52,
+	0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69,
+	0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75,
+	0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50,
+	0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22,
+	0x12, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x48, 0x75, 0x6e, 0x67, 0x55, 0x70, 0x52,
+	0x65, 0x73, 0x70, 0x22, 0x86, 0x02, 0x0a, 0x0f, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65,
+	0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f,
+	0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4f, 0x66, 0x66, 0x6c,
+	0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x6f, 0x66, 0x66,
+	0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3a, 0x0a, 0x0b,
+	0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
+	0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x61, 0x72,
+	0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x70, 0x55, 0x73,
+	0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x10, 0x6f, 0x70, 0x55, 0x73, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
+	0x72, 0x6d, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x12, 0x0a, 0x10,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x22, 0x35, 0x0a, 0x19, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f,
+	0x6d, 0x42, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a,
+	0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x22, 0xa5, 0x01, 0x0a, 0x1a, 0x53, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x42, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70,
+	0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, 0x70,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61,
+	0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74,
+	0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49,
+	0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x22,
+	0xb0, 0x01, 0x0a, 0x23, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x6e, 0x52, 0x6f, 0x6f, 0x6d,
+	0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65,
+	0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0b,
+	0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70,
+	0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x61, 0x72,
+	0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75,
+	0x70, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x49, 0x44, 0x22, 0xb3, 0x01, 0x0a, 0x26, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x6e, 0x52,
+	0x6f, 0x6f, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x44, 0x69,
+	0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a,
+	0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
+	0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e,
+	0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61,
+	0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
+	0x61, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x18,
+	0x0a, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x22, 0x87, 0x01, 0x0a, 0x19, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f,
+	0x6d, 0x49, 0x44, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x3a,
+	0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63,
+	0x69, 0x70, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70,
+	0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73,
+	0x65, 0x72, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72,
+	0x49, 0x44, 0x22, 0x4c, 0x0a, 0x1a, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54,
+	0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52,
+	0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x76, 0x65, 0x55, 0x52, 0x4c,
+	0x22, 0x9c, 0x0d, 0x0a, 0x1a, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12,
+	0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x32, 0x0a, 0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69,
+	0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72,
+	0x74, 0x63, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b,
+	0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x02, 0x65,
+	0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x02, 0x65, 0x78, 0x12, 0x2c, 0x0a,
+	0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69,
+	0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x09, 0x73,
+	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x72, 0x74, 0x63, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52,
+	0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x07, 0x65, 0x6e,
+	0x64, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x65, 0x6e,
+	0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x18, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69,
+	0x70, 0x61, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x55, 0x6e, 0x6d, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6c,
+	0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x42, 0x6f,
+	0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69,
+	0x70, 0x61, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x55, 0x6e, 0x6d, 0x75, 0x74, 0x65, 0x53, 0x65, 0x6c,
+	0x66, 0x12, 0x4c, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74,
+	0x43, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x52, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e,
+	0x74, 0x43, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x12,
+	0x3e, 0x0a, 0x12, 0x6f, 0x6e, 0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6f, 0x6e, 0x6c,
+	0x79, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12,
+	0x40, 0x0a, 0x13, 0x6f, 0x6e, 0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65,
+	0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72,
+	0x74, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x6f, 0x6e,
+	0x6c, 0x79, 0x48, 0x6f, 0x73, 0x74, 0x53, 0x68, 0x61, 0x72, 0x65, 0x53, 0x63, 0x72, 0x65, 0x65,
+	0x6e, 0x12, 0x44, 0x0a, 0x15, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
+	0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x52, 0x15, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63,
+	0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x3a, 0x0a, 0x10, 0x6a, 0x6f, 0x69, 0x6e, 0x44,
+	0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28,
+	0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75,
+	0x65, 0x52, 0x10, 0x6a, 0x6f, 0x69, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69,
+	0x64, 0x65, 0x6f, 0x12, 0x36, 0x0a, 0x0e, 0x69, 0x73, 0x4d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c,
+	0x56, 0x69, 0x64, 0x65, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x69, 0x73, 0x4d,
+	0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x12, 0x40, 0x0a, 0x13, 0x69,
+	0x73, 0x4d, 0x75, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f,
+	0x6e, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x42,
+	0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x69, 0x73, 0x4d, 0x75, 0x74, 0x65,
+	0x41, 0x6c, 0x6c, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x36, 0x0a,
+	0x16, 0x61, 0x64, 0x64, 0x43, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61,
+	0x64, 0x64, 0x43, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x43,
+	0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69,
+	0x73, 0x74, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65,
+	0x43, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c,
+	0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x13, 0x63, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x1e, 0x61, 0x64, 0x64, 0x44, 0x69, 0x73, 0x61,
+	0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x12, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1e, 0x61,
+	0x64, 0x64, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68,
+	0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4c, 0x0a,
+	0x21, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69,
+	0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69,
+	0x73, 0x74, 0x18, 0x13, 0x20, 0x03, 0x28, 0x09, 0x52, 0x21, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65,
+	0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e,
+	0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x1b, 0x64,
+	0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x1b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68,
+	0x6f, 0x6e, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3c, 0x0a,
+	0x19, 0x61, 0x64, 0x64, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09,
+	0x52, 0x19, 0x61, 0x64, 0x64, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65,
+	0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x1c, 0x72,
+	0x65, 0x64, 0x75, 0x63, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65,
+	0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x16, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x1c, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
+	0x56, 0x69, 0x64, 0x65, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x36, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52,
+	0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6f, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x64, 0x64, 0x50, 0x69,
+	0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x18, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x64, 0x64, 0x50, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x64, 0x75, 0x63,
+	0x65, 0x50, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74,
+	0x18, 0x19, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x50, 0x69,
+	0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x28, 0x0a,
+	0x0f, 0x70, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74,
+	0x18, 0x1a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x16, 0x61, 0x64, 0x64, 0x42, 0x65,
+	0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73,
+	0x74, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x61, 0x64, 0x64, 0x42, 0x65, 0x57, 0x61,
+	0x74, 0x63, 0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12,
+	0x3c, 0x0a, 0x19, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x42, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68,
+	0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x1c, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x19, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x42, 0x65, 0x57, 0x61, 0x74, 0x63,
+	0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a,
+	0x13, 0x62, 0x65, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x4c, 0x69, 0x73, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x62, 0x65, 0x57, 0x61,
+	0x74, 0x63, 0x68, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x22,
+	0x1d, 0x0a, 0x1b, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d,
+	0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2c,
+	0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x6f, 0x6f,
+	0x6d, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x22, 0x15, 0x0a, 0x13,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52,
+	0x65, 0x73, 0x70, 0x22, 0x48, 0x0a, 0x18, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x73,
+	0x73, 0x61, 0x67, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12,
+	0x2c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52,
+	0x65, 0x71, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x22, 0x4c, 0x0a,
+	0x19, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x73,
+	0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x0a, 0x73, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f,
+	0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x52,
+	0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x22, 0x2d, 0x0a, 0x11, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x71,
+	0x12, 0x18, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28,
+	0x09, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x73, 0x22, 0x51, 0x0a, 0x12, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x3b, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03,
+	0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47,
+	0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x42, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x52,
+	0x65, 0x73, 0x70, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x34, 0x0a,
+	0x1a, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x72,
+	0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f,
+	0x6d, 0x49, 0x44, 0x22, 0x9a, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61,
+	0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x3b, 0x0a, 0x0e, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
+	0x52, 0x0e, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
+	0x12, 0x3e, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49,
+	0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e,
+	0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x0f, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f,
+	0x22, 0x3c, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74,
+	0x41, 0x70, 0x70, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x9a,
+	0x01, 0x0a, 0x23, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69,
+	0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41,
+	0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x33, 0x0a, 0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61,
+	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
+	0x0a, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0f, 0x6f,
+	0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4f, 0x66, 0x66, 0x6c, 0x69,
+	0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x6f, 0x66, 0x66, 0x6c,
+	0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xb5, 0x01, 0x0a, 0x0f,
+	0x4f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12,
+	0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x4f, 0x53,
+	0x50, 0x75, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0c, 0x69, 0x4f, 0x53, 0x50, 0x75, 0x73, 0x68, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x24, 0x0a,
+	0x0d, 0x69, 0x4f, 0x53, 0x42, 0x61, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05,
+	0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x4f, 0x53, 0x42, 0x61, 0x64, 0x67, 0x65, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66,
+	0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49,
+	0x6e, 0x66, 0x6f, 0x22, 0x58, 0x0a, 0x0a, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65,
+	0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63,
+	0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63,
+	0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc1, 0x03,
+	0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x16,
+	0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x49, 0x44, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79,
+	0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70,
+	0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e,
+	0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x30, 0x0a, 0x13, 0x69, 0x6e,
+	0x76, 0x69, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72,
+	0x55, 0x73, 0x65, 0x72, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07,
+	0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x67,
+	0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4e,
+	0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70,
+	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x72, 0x55,
+	0x73, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x74, 0x63,
+	0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0c, 0x69, 0x6e, 0x76,
+	0x69, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64,
+	0x54, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x55,
+	0x52, 0x4c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x52,
+	0x4c, 0x22, 0x41, 0x0a, 0x0b, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72,
+	0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b,
+	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b,
+	0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x52,
+	0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x52, 0x4c,
+	0x22, 0xfc, 0x02, 0x0a, 0x0d, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02,
+	0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x0a,
+	0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x10,
+	0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72,
+	0x4e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72,
+	0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61,
+	0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d,
+	0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x32, 0x0a, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18,
+	0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4d, 0x65, 0x65, 0x74,
+	0x69, 0x6e, 0x67, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a,
+	0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x0b,
+	0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x52, 0x0b, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x22,
+	0x92, 0x02, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65,
+	0x71, 0x12, 0x36, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70,
+	0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x73,
+	0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b,
+	0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73,
+	0x65, 0x6e, 0x64, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6e,
+	0x64, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x18, 0x04, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x63, 0x76, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x73,
+	0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64,
+	0x54, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54,
+	0x69, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65,
+	0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x55,
+	0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x55,
+	0x73, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x11, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50,
+	0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x67,
+	0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70,
+	0x61, 0x67, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x68, 0x6f,
+	0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73,
+	0x68, 0x6f, 0x77, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xf4, 0x01, 0x0a, 0x08, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1a,
+	0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61,
+	0x63, 0x65, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63,
+	0x65, 0x55, 0x52, 0x4c, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x02, 0x65, 0x78, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69,
+	0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x70, 0x70, 0x4d, 0x61, 0x6e, 0x67, 0x65,
+	0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x61, 0x70,
+	0x70, 0x4d, 0x61, 0x6e, 0x67, 0x65, 0x72, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x10,
+	0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74,
+	0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x52, 0x65,
+	0x63, 0x76, 0x4d, 0x73, 0x67, 0x4f, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x22, 0x6f, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76,
+	0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x37, 0x0a, 0x0d, 0x73, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x11, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
+	0x73, 0x22, 0x2c, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61,
+	0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x73,
+	0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x73, 0x49, 0x44, 0x73, 0x22,
+	0x19, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52,
+	0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x22, 0xca, 0x01, 0x0a, 0x14, 0x47,
+	0x65, 0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73,
+	0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x49,
+	0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x65,
+	0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74,
+	0x54, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72,
+	0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12,
+	0x36, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x70, 0x61, 0x67,
+	0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
+	0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3a, 0x0a, 0x0e, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e,
+	0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12,
+	0x2e, 0x72, 0x74, 0x63, 0x2e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f,
+	0x72, 0x64, 0x52, 0x0e, 0x6d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72,
+	0x64, 0x73, 0x22, 0x33, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74,
+	0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a,
+	0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
+	0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x73, 0x22, 0x1a, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c,
+	0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0a, 0x46, 0x6c, 0x6f, 0x61,
+	0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0a,
+	0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x22, 0x23, 0x0a, 0x0b, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12,
+	0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0a, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61,
+	0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x55, 0x49, 0x6e,
+	0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x21,
+	0x0a, 0x09, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x22, 0x23, 0x0a, 0x0b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65,
+	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x22, 0x0a, 0x0a, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56,
+	0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x32, 0xc6, 0x0b, 0x0a, 0x0a, 0x52,
+	0x74, 0x63, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x56, 0x0a, 0x15, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62,
+	0x6c, 0x65, 0x12, 0x1d, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4d,
+	0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65,
+	0x71, 0x1a, 0x1e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4d, 0x65,
+	0x73, 0x73, 0x61, 0x67, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f,
+	0x6f, 0x6d, 0x42, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x12, 0x1e, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x42,
+	0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x42,
+	0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x59, 0x0a, 0x16,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79,
+	0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x44, 0x12, 0x1e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f,
+	0x6d, 0x49, 0x44, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x79, 0x52, 0x6f, 0x6f,
+	0x6d, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x12, 0x41, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x61,
+	0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x74, 0x63, 0x2e,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65,
+	0x71, 0x1a, 0x17, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65,
+	0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5c, 0x0a, 0x17, 0x47, 0x65,
+	0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65, 0x74,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x74, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x70, 0x70, 0x12, 0x27, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x70,
+	0x70, 0x52, 0x65, 0x71, 0x1a, 0x28, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
+	0x66, 0x6f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x70, 0x70, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50,
+	0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52,
+	0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x4a, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x65,
+	0x65, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71,
+	0x1a, 0x1a, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4a, 0x6f, 0x69,
+	0x6e, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x12, 0x5c, 0x0a, 0x17,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74,
+	0x69, 0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e,
+	0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x20, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69,
+	0x6e, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x69,
+	0x67, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x17, 0x2e,
+	0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52,
+	0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67,
+	0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x4a, 0x0a, 0x11, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65,
+	0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e,
+	0x61, 0x6c, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71,
+	0x1a, 0x1a, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74,
+	0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x50, 0x0a, 0x13,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72,
+	0x65, 0x61, 0x6d, 0x12, 0x1b, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71,
+	0x1a, 0x1c, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x4f, 0x70, 0x65,
+	0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x12, 0x59,
+	0x0a, 0x16, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x73, 0x74,
+	0x6f, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x1e, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53,
+	0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x12, 0x65, 0x0a, 0x1a, 0x47, 0x65, 0x74,
+	0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+	0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x22, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65,
+	0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+	0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x23, 0x2e, 0x72, 0x74,
+	0x63, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x76, 0x69, 0x74,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x50, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c,
+	0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1b, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x44, 0x65,
+	0x6c, 0x65, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
+	0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x4a, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67,
+	0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x19, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65,
+	0x74, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52,
+	0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x65, 0x74,
+	0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x53,
+	0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52,
+	0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x44, 0x65, 0x6c,
+	0x65, 0x74, 0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64,
+	0x73, 0x52, 0x65, 0x71, 0x1a, 0x1d, 0x2e, 0x72, 0x74, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74,
+	0x65, 0x4d, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x52,
+	0x65, 0x73, 0x70, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x72, 0x74, 0x63, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_rtc_proto_rawDescOnce sync.Once
+	file_rtc_proto_rawDescData = file_rtc_proto_rawDesc
+)
+
+func file_rtc_proto_rawDescGZIP() []byte {
+	file_rtc_proto_rawDescOnce.Do(func() {
+		file_rtc_proto_rawDescData = protoimpl.X.CompressGZIP(file_rtc_proto_rawDescData)
+	})
+	return file_rtc_proto_rawDescData
+}
+
+var file_rtc_proto_msgTypes = make([]protoimpl.MessageInfo, 76)
+var file_rtc_proto_goTypes = []any{
+	(*ParticipantMetaData)(nil),                    // 0: rtc.ParticipantMetaData
+	(*GroupInfo)(nil),                              // 1: rtc.GroupInfo
+	(*GroupMemberFullInfo)(nil),                    // 2: rtc.GroupMemberFullInfo
+	(*PublicUserInfo)(nil),                         // 3: rtc.PublicUserInfo
+	(*GetJoinTokenReq)(nil),                        // 4: rtc.GetJoinTokenReq
+	(*GetJoinTokenResp)(nil),                       // 5: rtc.GetJoinTokenResp
+	(*SignalReq)(nil),                              // 6: rtc.SignalReq
+	(*SignalSendCustomSignalReq)(nil),              // 7: rtc.SignalSendCustomSignalReq
+	(*SignalSendCustomSignalResp)(nil),             // 8: rtc.SignalSendCustomSignalResp
+	(*SignalGetMeetingsReq)(nil),                   // 9: rtc.SignalGetMeetingsReq
+	(*SignalGetMeetingsResp)(nil),                  // 10: rtc.SignalGetMeetingsResp
+	(*SignalOperateStreamReq)(nil),                 // 11: rtc.SignalOperateStreamReq
+	(*SignalOperateStreamResp)(nil),                // 12: rtc.SignalOperateStreamResp
+	(*SignalOnStreamChangeReq)(nil),                // 13: rtc.SignalOnStreamChangeReq
+	(*SignalCreateMeetingReq)(nil),                 // 14: rtc.SignalCreateMeetingReq
+	(*SignalCreateMeetingResp)(nil),                // 15: rtc.SignalCreateMeetingResp
+	(*SignalJoinMeetingReq)(nil),                   // 16: rtc.SignalJoinMeetingReq
+	(*SignalJoinMeetingResp)(nil),                  // 17: rtc.SignalJoinMeetingResp
+	(*SignalResp)(nil),                             // 18: rtc.SignalResp
+	(*InvitationInfo)(nil),                         // 19: rtc.InvitationInfo
+	(*MeetingInfo)(nil),                            // 20: rtc.MeetingInfo
+	(*SignalInviteReq)(nil),                        // 21: rtc.SignalInviteReq
+	(*SignalInviteResp)(nil),                       // 22: rtc.SignalInviteResp
+	(*SignalInviteInGroupReq)(nil),                 // 23: rtc.SignalInviteInGroupReq
+	(*SignalInviteInGroupResp)(nil),                // 24: rtc.SignalInviteInGroupResp
+	(*SignalCancelReq)(nil),                        // 25: rtc.SignalCancelReq
+	(*SignalCancelResp)(nil),                       // 26: rtc.SignalCancelResp
+	(*SignalAcceptReq)(nil),                        // 27: rtc.SignalAcceptReq
+	(*SignalAcceptResp)(nil),                       // 28: rtc.SignalAcceptResp
+	(*SignalHungUpReq)(nil),                        // 29: rtc.SignalHungUpReq
+	(*SignalHungUpResp)(nil),                       // 30: rtc.SignalHungUpResp
+	(*SignalRejectReq)(nil),                        // 31: rtc.SignalRejectReq
+	(*SignalRejectResp)(nil),                       // 32: rtc.SignalRejectResp
+	(*SignalGetRoomByGroupIDReq)(nil),              // 33: rtc.SignalGetRoomByGroupIDReq
+	(*SignalGetRoomByGroupIDResp)(nil),             // 34: rtc.SignalGetRoomByGroupIDResp
+	(*SignalOnRoomParticipantConnectedReq)(nil),    // 35: rtc.SignalOnRoomParticipantConnectedReq
+	(*SignalOnRoomParticipantDisconnectedReq)(nil), // 36: rtc.SignalOnRoomParticipantDisconnectedReq
+	(*SignalGetTokenByRoomIDReq)(nil),              // 37: rtc.SignalGetTokenByRoomIDReq
+	(*SignalGetTokenByRoomIDResp)(nil),             // 38: rtc.SignalGetTokenByRoomIDResp
+	(*SignalUpdateMeetingInfoReq)(nil),             // 39: rtc.SignalUpdateMeetingInfoReq
+	(*SignalUpdateMeetingInfoResp)(nil),            // 40: rtc.SignalUpdateMeetingInfoResp
+	(*SignalCloseRoomReq)(nil),                     // 41: rtc.SignalCloseRoomReq
+	(*SignalCloseRoomResp)(nil),                    // 42: rtc.SignalCloseRoomResp
+	(*SignalMessageAssembleReq)(nil),               // 43: rtc.SignalMessageAssembleReq
+	(*SignalMessageAssembleResp)(nil),              // 44: rtc.SignalMessageAssembleResp
+	(*SignalGetRoomsReq)(nil),                      // 45: rtc.SignalGetRoomsReq
+	(*SignalGetRoomsResp)(nil),                     // 46: rtc.SignalGetRoomsResp
+	(*GetSignalInvitationInfoReq)(nil),             // 47: rtc.GetSignalInvitationInfoReq
+	(*GetSignalInvitationInfoResp)(nil),            // 48: rtc.GetSignalInvitationInfoResp
+	(*GetSignalInvitationInfoStartAppReq)(nil),     // 49: rtc.GetSignalInvitationInfoStartAppReq
+	(*GetSignalInvitationInfoStartAppResp)(nil),    // 50: rtc.GetSignalInvitationInfoStartAppResp
+	(*OfflinePushInfo)(nil),                        // 51: rtc.OfflinePushInfo
+	(*SignalUser)(nil),                             // 52: rtc.SignalUser
+	(*SignalRecord)(nil),                           // 53: rtc.SignalRecord
+	(*MeetingUser)(nil),                            // 54: rtc.MeetingUser
+	(*FileRecord)(nil),                             // 55: rtc.FileRecord
+	(*MeetingRecord)(nil),                          // 56: rtc.MeetingRecord
+	(*GetSignalInvitationRecordsReq)(nil),          // 57: rtc.GetSignalInvitationRecordsReq
+	(*RequestPagination)(nil),                      // 58: rtc.RequestPagination
+	(*UserInfo)(nil),                               // 59: rtc.UserInfo
+	(*GetSignalInvitationRecordsResp)(nil),         // 60: rtc.GetSignalInvitationRecordsResp
+	(*DeleteSignalRecordsReq)(nil),                 // 61: rtc.DeleteSignalRecordsReq
+	(*DeleteSignalRecordsResp)(nil),                // 62: rtc.DeleteSignalRecordsResp
+	(*GetMeetingRecordsReq)(nil),                   // 63: rtc.GetMeetingRecordsReq
+	(*GetMeetingRecordsResp)(nil),                  // 64: rtc.GetMeetingRecordsResp
+	(*DeleteMeetingRecordsReq)(nil),                // 65: rtc.DeleteMeetingRecordsReq
+	(*DeleteMeetingRecordsResp)(nil),               // 66: rtc.DeleteMeetingRecordsResp
+	(*DoubleValue)(nil),                            // 67: rtc.DoubleValue
+	(*FloatValue)(nil),                             // 68: rtc.FloatValue
+	(*Int64Value)(nil),                             // 69: rtc.Int64Value
+	(*UInt64Value)(nil),                            // 70: rtc.UInt64Value
+	(*Int32Value)(nil),                             // 71: rtc.Int32Value
+	(*UInt32Value)(nil),                            // 72: rtc.UInt32Value
+	(*BoolValue)(nil),                              // 73: rtc.BoolValue
+	(*StringValue)(nil),                            // 74: rtc.StringValue
+	(*BytesValue)(nil),                             // 75: rtc.BytesValue
+}
+var file_rtc_proto_depIdxs = []int32{
+	1,  // 0: rtc.ParticipantMetaData.groupInfo:type_name -> rtc.GroupInfo
+	2,  // 1: rtc.ParticipantMetaData.groupMemberInfo:type_name -> rtc.GroupMemberFullInfo
+	3,  // 2: rtc.ParticipantMetaData.userInfo:type_name -> rtc.PublicUserInfo
+	0,  // 3: rtc.GetJoinTokenReq.metaData:type_name -> rtc.ParticipantMetaData
+	21, // 4: rtc.SignalReq.invite:type_name -> rtc.SignalInviteReq
+	23, // 5: rtc.SignalReq.inviteInGroup:type_name -> rtc.SignalInviteInGroupReq
+	25, // 6: rtc.SignalReq.cancel:type_name -> rtc.SignalCancelReq
+	27, // 7: rtc.SignalReq.accept:type_name -> rtc.SignalAcceptReq
+	29, // 8: rtc.SignalReq.hungUp:type_name -> rtc.SignalHungUpReq
+	31, // 9: rtc.SignalReq.reject:type_name -> rtc.SignalRejectReq
+	37, // 10: rtc.SignalReq.getTokenByRoomID:type_name -> rtc.SignalGetTokenByRoomIDReq
+	20, // 11: rtc.SignalGetMeetingsResp.meetingInfoList:type_name -> rtc.MeetingInfo
+	0,  // 12: rtc.SignalCreateMeetingReq.participant:type_name -> rtc.ParticipantMetaData
+	0,  // 13: rtc.SignalJoinMeetingReq.participant:type_name -> rtc.ParticipantMetaData
+	22, // 14: rtc.SignalResp.invite:type_name -> rtc.SignalInviteResp
+	24, // 15: rtc.SignalResp.inviteInGroup:type_name -> rtc.SignalInviteInGroupResp
+	26, // 16: rtc.SignalResp.cancel:type_name -> rtc.SignalCancelResp
+	28, // 17: rtc.SignalResp.accept:type_name -> rtc.SignalAcceptResp
+	30, // 18: rtc.SignalResp.hungUp:type_name -> rtc.SignalHungUpResp
+	32, // 19: rtc.SignalResp.reject:type_name -> rtc.SignalRejectResp
+	38, // 20: rtc.SignalResp.getTokenByRoomID:type_name -> rtc.SignalGetTokenByRoomIDResp
+	19, // 21: rtc.SignalInviteReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 22: rtc.SignalInviteReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	0,  // 23: rtc.SignalInviteReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 24: rtc.SignalInviteInGroupReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 25: rtc.SignalInviteInGroupReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	0,  // 26: rtc.SignalInviteInGroupReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 27: rtc.SignalCancelReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 28: rtc.SignalCancelReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	0,  // 29: rtc.SignalCancelReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 30: rtc.SignalAcceptReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 31: rtc.SignalAcceptReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	0,  // 32: rtc.SignalAcceptReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 33: rtc.SignalHungUpReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 34: rtc.SignalHungUpReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	19, // 35: rtc.SignalRejectReq.invitation:type_name -> rtc.InvitationInfo
+	51, // 36: rtc.SignalRejectReq.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	0,  // 37: rtc.SignalRejectReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 38: rtc.SignalGetRoomByGroupIDResp.invitation:type_name -> rtc.InvitationInfo
+	0,  // 39: rtc.SignalGetRoomByGroupIDResp.participant:type_name -> rtc.ParticipantMetaData
+	19, // 40: rtc.SignalOnRoomParticipantConnectedReq.invitation:type_name -> rtc.InvitationInfo
+	0,  // 41: rtc.SignalOnRoomParticipantConnectedReq.participant:type_name -> rtc.ParticipantMetaData
+	19, // 42: rtc.SignalOnRoomParticipantDisconnectedReq.invitation:type_name -> rtc.InvitationInfo
+	0,  // 43: rtc.SignalOnRoomParticipantDisconnectedReq.participant:type_name -> rtc.ParticipantMetaData
+	0,  // 44: rtc.SignalGetTokenByRoomIDReq.participant:type_name -> rtc.ParticipantMetaData
+	74, // 45: rtc.SignalUpdateMeetingInfoReq.meetingName:type_name -> rtc.StringValue
+	74, // 46: rtc.SignalUpdateMeetingInfoReq.ex:type_name -> rtc.StringValue
+	69, // 47: rtc.SignalUpdateMeetingInfoReq.startTime:type_name -> rtc.Int64Value
+	69, // 48: rtc.SignalUpdateMeetingInfoReq.endTime:type_name -> rtc.Int64Value
+	73, // 49: rtc.SignalUpdateMeetingInfoReq.participantCanUnmuteSelf:type_name -> rtc.BoolValue
+	73, // 50: rtc.SignalUpdateMeetingInfoReq.participantCanEnableVideo:type_name -> rtc.BoolValue
+	73, // 51: rtc.SignalUpdateMeetingInfoReq.onlyHostInviteUser:type_name -> rtc.BoolValue
+	73, // 52: rtc.SignalUpdateMeetingInfoReq.onlyHostShareScreen:type_name -> rtc.BoolValue
+	73, // 53: rtc.SignalUpdateMeetingInfoReq.joinDisableMicrophone:type_name -> rtc.BoolValue
+	73, // 54: rtc.SignalUpdateMeetingInfoReq.joinDisableVideo:type_name -> rtc.BoolValue
+	73, // 55: rtc.SignalUpdateMeetingInfoReq.isMuteAllVideo:type_name -> rtc.BoolValue
+	73, // 56: rtc.SignalUpdateMeetingInfoReq.isMuteAllMicrophone:type_name -> rtc.BoolValue
+	6,  // 57: rtc.SignalMessageAssembleReq.signalReq:type_name -> rtc.SignalReq
+	18, // 58: rtc.SignalMessageAssembleResp.signalResp:type_name -> rtc.SignalResp
+	34, // 59: rtc.SignalGetRoomsResp.roomList:type_name -> rtc.SignalGetRoomByGroupIDResp
+	19, // 60: rtc.GetSignalInvitationInfoResp.invitationInfo:type_name -> rtc.InvitationInfo
+	51, // 61: rtc.GetSignalInvitationInfoResp.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	19, // 62: rtc.GetSignalInvitationInfoStartAppResp.invitation:type_name -> rtc.InvitationInfo
+	51, // 63: rtc.GetSignalInvitationInfoStartAppResp.offlinePushInfo:type_name -> rtc.OfflinePushInfo
+	52, // 64: rtc.SignalRecord.inviterUsers:type_name -> rtc.SignalUser
+	54, // 65: rtc.MeetingRecord.joinedUsers:type_name -> rtc.MeetingUser
+	55, // 66: rtc.MeetingRecord.fileRecords:type_name -> rtc.FileRecord
+	58, // 67: rtc.GetSignalInvitationRecordsReq.pagination:type_name -> rtc.RequestPagination
+	59, // 68: rtc.GetSignalInvitationRecordsReq.JoinedUsers:type_name -> rtc.UserInfo
+	53, // 69: rtc.GetSignalInvitationRecordsResp.signalRecords:type_name -> rtc.SignalRecord
+	58, // 70: rtc.GetMeetingRecordsReq.pagination:type_name -> rtc.RequestPagination
+	56, // 71: rtc.GetMeetingRecordsResp.meetingRecords:type_name -> rtc.MeetingRecord
+	43, // 72: rtc.RtcService.SignalMessageAssemble:input_type -> rtc.SignalMessageAssembleReq
+	33, // 73: rtc.RtcService.SignalGetRoomByGroupID:input_type -> rtc.SignalGetRoomByGroupIDReq
+	37, // 74: rtc.RtcService.SignalGetTokenByRoomID:input_type -> rtc.SignalGetTokenByRoomIDReq
+	45, // 75: rtc.RtcService.SignalGetRooms:input_type -> rtc.SignalGetRoomsReq
+	47, // 76: rtc.RtcService.GetSignalInvitationInfo:input_type -> rtc.GetSignalInvitationInfoReq
+	49, // 77: rtc.RtcService.GetSignalInvitationInfoStartApp:input_type -> rtc.GetSignalInvitationInfoStartAppReq
+	14, // 78: rtc.RtcService.SignalCreateMeeting:input_type -> rtc.SignalCreateMeetingReq
+	16, // 79: rtc.RtcService.SignalJoinMeeting:input_type -> rtc.SignalJoinMeetingReq
+	39, // 80: rtc.RtcService.SignalUpdateMeetingInfo:input_type -> rtc.SignalUpdateMeetingInfoReq
+	41, // 81: rtc.RtcService.SignalCloseRoom:input_type -> rtc.SignalCloseRoomReq
+	9,  // 82: rtc.RtcService.SignalGetMeetings:input_type -> rtc.SignalGetMeetingsReq
+	11, // 83: rtc.RtcService.SignalOperateStream:input_type -> rtc.SignalOperateStreamReq
+	7,  // 84: rtc.RtcService.SignalSendCustomSignal:input_type -> rtc.SignalSendCustomSignalReq
+	57, // 85: rtc.RtcService.GetSignalInvitationRecords:input_type -> rtc.GetSignalInvitationRecordsReq
+	61, // 86: rtc.RtcService.DeleteSignalRecords:input_type -> rtc.DeleteSignalRecordsReq
+	63, // 87: rtc.RtcService.GetMeetingRecords:input_type -> rtc.GetMeetingRecordsReq
+	65, // 88: rtc.RtcService.DeleteMeetingRecords:input_type -> rtc.DeleteMeetingRecordsReq
+	44, // 89: rtc.RtcService.SignalMessageAssemble:output_type -> rtc.SignalMessageAssembleResp
+	34, // 90: rtc.RtcService.SignalGetRoomByGroupID:output_type -> rtc.SignalGetRoomByGroupIDResp
+	38, // 91: rtc.RtcService.SignalGetTokenByRoomID:output_type -> rtc.SignalGetTokenByRoomIDResp
+	46, // 92: rtc.RtcService.SignalGetRooms:output_type -> rtc.SignalGetRoomsResp
+	48, // 93: rtc.RtcService.GetSignalInvitationInfo:output_type -> rtc.GetSignalInvitationInfoResp
+	50, // 94: rtc.RtcService.GetSignalInvitationInfoStartApp:output_type -> rtc.GetSignalInvitationInfoStartAppResp
+	15, // 95: rtc.RtcService.SignalCreateMeeting:output_type -> rtc.SignalCreateMeetingResp
+	17, // 96: rtc.RtcService.SignalJoinMeeting:output_type -> rtc.SignalJoinMeetingResp
+	40, // 97: rtc.RtcService.SignalUpdateMeetingInfo:output_type -> rtc.SignalUpdateMeetingInfoResp
+	42, // 98: rtc.RtcService.SignalCloseRoom:output_type -> rtc.SignalCloseRoomResp
+	10, // 99: rtc.RtcService.SignalGetMeetings:output_type -> rtc.SignalGetMeetingsResp
+	12, // 100: rtc.RtcService.SignalOperateStream:output_type -> rtc.SignalOperateStreamResp
+	8,  // 101: rtc.RtcService.SignalSendCustomSignal:output_type -> rtc.SignalSendCustomSignalResp
+	60, // 102: rtc.RtcService.GetSignalInvitationRecords:output_type -> rtc.GetSignalInvitationRecordsResp
+	62, // 103: rtc.RtcService.DeleteSignalRecords:output_type -> rtc.DeleteSignalRecordsResp
+	64, // 104: rtc.RtcService.GetMeetingRecords:output_type -> rtc.GetMeetingRecordsResp
+	66, // 105: rtc.RtcService.DeleteMeetingRecords:output_type -> rtc.DeleteMeetingRecordsResp
+	89, // [89:106] is the sub-list for method output_type
+	72, // [72:89] is the sub-list for method input_type
+	72, // [72:72] is the sub-list for extension type_name
+	72, // [72:72] is the sub-list for extension extendee
+	0,  // [0:72] is the sub-list for field type_name
+}
+
+func init() { file_rtc_proto_init() }
+func file_rtc_proto_init() {
+	if File_rtc_proto != nil {
+		return
+	}
+	file_rtc_proto_msgTypes[6].OneofWrappers = []any{
+		(*SignalReq_Invite)(nil),
+		(*SignalReq_InviteInGroup)(nil),
+		(*SignalReq_Cancel)(nil),
+		(*SignalReq_Accept)(nil),
+		(*SignalReq_HungUp)(nil),
+		(*SignalReq_Reject)(nil),
+		(*SignalReq_GetTokenByRoomID)(nil),
+	}
+	file_rtc_proto_msgTypes[18].OneofWrappers = []any{
+		(*SignalResp_Invite)(nil),
+		(*SignalResp_InviteInGroup)(nil),
+		(*SignalResp_Cancel)(nil),
+		(*SignalResp_Accept)(nil),
+		(*SignalResp_HungUp)(nil),
+		(*SignalResp_Reject)(nil),
+		(*SignalResp_GetTokenByRoomID)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_rtc_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   76,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_rtc_proto_goTypes,
+		DependencyIndexes: file_rtc_proto_depIdxs,
+		MessageInfos:      file_rtc_proto_msgTypes,
+	}.Build()
+	File_rtc_proto = out.File
+	file_rtc_proto_rawDesc = nil
+	file_rtc_proto_goTypes = nil
+	file_rtc_proto_depIdxs = nil
+}

+ 735 - 0
pb/rtc/rtc_grpc.pb.go

@@ -0,0 +1,735 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.5.1
+// - protoc             v5.29.3
+// source: rtc.proto
+
+package rtc
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.64.0 or later.
+const _ = grpc.SupportPackageIsVersion9
+
+const (
+	RtcService_SignalMessageAssemble_FullMethodName           = "/rtc.RtcService/SignalMessageAssemble"
+	RtcService_SignalGetRoomByGroupID_FullMethodName          = "/rtc.RtcService/SignalGetRoomByGroupID"
+	RtcService_SignalGetTokenByRoomID_FullMethodName          = "/rtc.RtcService/SignalGetTokenByRoomID"
+	RtcService_SignalGetRooms_FullMethodName                  = "/rtc.RtcService/SignalGetRooms"
+	RtcService_GetSignalInvitationInfo_FullMethodName         = "/rtc.RtcService/GetSignalInvitationInfo"
+	RtcService_GetSignalInvitationInfoStartApp_FullMethodName = "/rtc.RtcService/GetSignalInvitationInfoStartApp"
+	RtcService_SignalCreateMeeting_FullMethodName             = "/rtc.RtcService/SignalCreateMeeting"
+	RtcService_SignalJoinMeeting_FullMethodName               = "/rtc.RtcService/SignalJoinMeeting"
+	RtcService_SignalUpdateMeetingInfo_FullMethodName         = "/rtc.RtcService/SignalUpdateMeetingInfo"
+	RtcService_SignalCloseRoom_FullMethodName                 = "/rtc.RtcService/SignalCloseRoom"
+	RtcService_SignalGetMeetings_FullMethodName               = "/rtc.RtcService/SignalGetMeetings"
+	RtcService_SignalOperateStream_FullMethodName             = "/rtc.RtcService/SignalOperateStream"
+	RtcService_SignalSendCustomSignal_FullMethodName          = "/rtc.RtcService/SignalSendCustomSignal"
+	RtcService_GetSignalInvitationRecords_FullMethodName      = "/rtc.RtcService/GetSignalInvitationRecords"
+	RtcService_DeleteSignalRecords_FullMethodName             = "/rtc.RtcService/DeleteSignalRecords"
+	RtcService_GetMeetingRecords_FullMethodName               = "/rtc.RtcService/GetMeetingRecords"
+	RtcService_DeleteMeetingRecords_FullMethodName            = "/rtc.RtcService/DeleteMeetingRecords"
+)
+
+// RtcServiceClient is the client API for RtcService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type RtcServiceClient interface {
+	SignalMessageAssemble(ctx context.Context, in *SignalMessageAssembleReq, opts ...grpc.CallOption) (*SignalMessageAssembleResp, error)
+	SignalGetRoomByGroupID(ctx context.Context, in *SignalGetRoomByGroupIDReq, opts ...grpc.CallOption) (*SignalGetRoomByGroupIDResp, error)
+	SignalGetTokenByRoomID(ctx context.Context, in *SignalGetTokenByRoomIDReq, opts ...grpc.CallOption) (*SignalGetTokenByRoomIDResp, error)
+	SignalGetRooms(ctx context.Context, in *SignalGetRoomsReq, opts ...grpc.CallOption) (*SignalGetRoomsResp, error)
+	GetSignalInvitationInfo(ctx context.Context, in *GetSignalInvitationInfoReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoResp, error)
+	GetSignalInvitationInfoStartApp(ctx context.Context, in *GetSignalInvitationInfoStartAppReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoStartAppResp, error)
+	// meeting
+	SignalCreateMeeting(ctx context.Context, in *SignalCreateMeetingReq, opts ...grpc.CallOption) (*SignalCreateMeetingResp, error)
+	SignalJoinMeeting(ctx context.Context, in *SignalJoinMeetingReq, opts ...grpc.CallOption) (*SignalJoinMeetingResp, error)
+	SignalUpdateMeetingInfo(ctx context.Context, in *SignalUpdateMeetingInfoReq, opts ...grpc.CallOption) (*SignalUpdateMeetingInfoResp, error)
+	SignalCloseRoom(ctx context.Context, in *SignalCloseRoomReq, opts ...grpc.CallOption) (*SignalCloseRoomResp, error)
+	SignalGetMeetings(ctx context.Context, in *SignalGetMeetingsReq, opts ...grpc.CallOption) (*SignalGetMeetingsResp, error)
+	SignalOperateStream(ctx context.Context, in *SignalOperateStreamReq, opts ...grpc.CallOption) (*SignalOperateStreamResp, error)
+	// custom signal
+	SignalSendCustomSignal(ctx context.Context, in *SignalSendCustomSignalReq, opts ...grpc.CallOption) (*SignalSendCustomSignalResp, error)
+	// rtc cms
+	GetSignalInvitationRecords(ctx context.Context, in *GetSignalInvitationRecordsReq, opts ...grpc.CallOption) (*GetSignalInvitationRecordsResp, error)
+	DeleteSignalRecords(ctx context.Context, in *DeleteSignalRecordsReq, opts ...grpc.CallOption) (*DeleteSignalRecordsResp, error)
+	GetMeetingRecords(ctx context.Context, in *GetMeetingRecordsReq, opts ...grpc.CallOption) (*GetMeetingRecordsResp, error)
+	DeleteMeetingRecords(ctx context.Context, in *DeleteMeetingRecordsReq, opts ...grpc.CallOption) (*DeleteMeetingRecordsResp, error)
+}
+
+type rtcServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewRtcServiceClient(cc grpc.ClientConnInterface) RtcServiceClient {
+	return &rtcServiceClient{cc}
+}
+
+func (c *rtcServiceClient) SignalMessageAssemble(ctx context.Context, in *SignalMessageAssembleReq, opts ...grpc.CallOption) (*SignalMessageAssembleResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalMessageAssembleResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalMessageAssemble_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalGetRoomByGroupID(ctx context.Context, in *SignalGetRoomByGroupIDReq, opts ...grpc.CallOption) (*SignalGetRoomByGroupIDResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalGetRoomByGroupIDResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalGetRoomByGroupID_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalGetTokenByRoomID(ctx context.Context, in *SignalGetTokenByRoomIDReq, opts ...grpc.CallOption) (*SignalGetTokenByRoomIDResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalGetTokenByRoomIDResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalGetTokenByRoomID_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalGetRooms(ctx context.Context, in *SignalGetRoomsReq, opts ...grpc.CallOption) (*SignalGetRoomsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalGetRoomsResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalGetRooms_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) GetSignalInvitationInfo(ctx context.Context, in *GetSignalInvitationInfoReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetSignalInvitationInfoResp)
+	err := c.cc.Invoke(ctx, RtcService_GetSignalInvitationInfo_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) GetSignalInvitationInfoStartApp(ctx context.Context, in *GetSignalInvitationInfoStartAppReq, opts ...grpc.CallOption) (*GetSignalInvitationInfoStartAppResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetSignalInvitationInfoStartAppResp)
+	err := c.cc.Invoke(ctx, RtcService_GetSignalInvitationInfoStartApp_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalCreateMeeting(ctx context.Context, in *SignalCreateMeetingReq, opts ...grpc.CallOption) (*SignalCreateMeetingResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalCreateMeetingResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalCreateMeeting_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalJoinMeeting(ctx context.Context, in *SignalJoinMeetingReq, opts ...grpc.CallOption) (*SignalJoinMeetingResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalJoinMeetingResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalJoinMeeting_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalUpdateMeetingInfo(ctx context.Context, in *SignalUpdateMeetingInfoReq, opts ...grpc.CallOption) (*SignalUpdateMeetingInfoResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalUpdateMeetingInfoResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalUpdateMeetingInfo_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalCloseRoom(ctx context.Context, in *SignalCloseRoomReq, opts ...grpc.CallOption) (*SignalCloseRoomResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalCloseRoomResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalCloseRoom_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalGetMeetings(ctx context.Context, in *SignalGetMeetingsReq, opts ...grpc.CallOption) (*SignalGetMeetingsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalGetMeetingsResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalGetMeetings_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalOperateStream(ctx context.Context, in *SignalOperateStreamReq, opts ...grpc.CallOption) (*SignalOperateStreamResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalOperateStreamResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalOperateStream_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) SignalSendCustomSignal(ctx context.Context, in *SignalSendCustomSignalReq, opts ...grpc.CallOption) (*SignalSendCustomSignalResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(SignalSendCustomSignalResp)
+	err := c.cc.Invoke(ctx, RtcService_SignalSendCustomSignal_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) GetSignalInvitationRecords(ctx context.Context, in *GetSignalInvitationRecordsReq, opts ...grpc.CallOption) (*GetSignalInvitationRecordsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetSignalInvitationRecordsResp)
+	err := c.cc.Invoke(ctx, RtcService_GetSignalInvitationRecords_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) DeleteSignalRecords(ctx context.Context, in *DeleteSignalRecordsReq, opts ...grpc.CallOption) (*DeleteSignalRecordsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(DeleteSignalRecordsResp)
+	err := c.cc.Invoke(ctx, RtcService_DeleteSignalRecords_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) GetMeetingRecords(ctx context.Context, in *GetMeetingRecordsReq, opts ...grpc.CallOption) (*GetMeetingRecordsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(GetMeetingRecordsResp)
+	err := c.cc.Invoke(ctx, RtcService_GetMeetingRecords_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *rtcServiceClient) DeleteMeetingRecords(ctx context.Context, in *DeleteMeetingRecordsReq, opts ...grpc.CallOption) (*DeleteMeetingRecordsResp, error) {
+	cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+	out := new(DeleteMeetingRecordsResp)
+	err := c.cc.Invoke(ctx, RtcService_DeleteMeetingRecords_FullMethodName, in, out, cOpts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// RtcServiceServer is the server API for RtcService service.
+// All implementations must embed UnimplementedRtcServiceServer
+// for forward compatibility.
+type RtcServiceServer interface {
+	SignalMessageAssemble(context.Context, *SignalMessageAssembleReq) (*SignalMessageAssembleResp, error)
+	SignalGetRoomByGroupID(context.Context, *SignalGetRoomByGroupIDReq) (*SignalGetRoomByGroupIDResp, error)
+	SignalGetTokenByRoomID(context.Context, *SignalGetTokenByRoomIDReq) (*SignalGetTokenByRoomIDResp, error)
+	SignalGetRooms(context.Context, *SignalGetRoomsReq) (*SignalGetRoomsResp, error)
+	GetSignalInvitationInfo(context.Context, *GetSignalInvitationInfoReq) (*GetSignalInvitationInfoResp, error)
+	GetSignalInvitationInfoStartApp(context.Context, *GetSignalInvitationInfoStartAppReq) (*GetSignalInvitationInfoStartAppResp, error)
+	// meeting
+	SignalCreateMeeting(context.Context, *SignalCreateMeetingReq) (*SignalCreateMeetingResp, error)
+	SignalJoinMeeting(context.Context, *SignalJoinMeetingReq) (*SignalJoinMeetingResp, error)
+	SignalUpdateMeetingInfo(context.Context, *SignalUpdateMeetingInfoReq) (*SignalUpdateMeetingInfoResp, error)
+	SignalCloseRoom(context.Context, *SignalCloseRoomReq) (*SignalCloseRoomResp, error)
+	SignalGetMeetings(context.Context, *SignalGetMeetingsReq) (*SignalGetMeetingsResp, error)
+	SignalOperateStream(context.Context, *SignalOperateStreamReq) (*SignalOperateStreamResp, error)
+	// custom signal
+	SignalSendCustomSignal(context.Context, *SignalSendCustomSignalReq) (*SignalSendCustomSignalResp, error)
+	// rtc cms
+	GetSignalInvitationRecords(context.Context, *GetSignalInvitationRecordsReq) (*GetSignalInvitationRecordsResp, error)
+	DeleteSignalRecords(context.Context, *DeleteSignalRecordsReq) (*DeleteSignalRecordsResp, error)
+	GetMeetingRecords(context.Context, *GetMeetingRecordsReq) (*GetMeetingRecordsResp, error)
+	DeleteMeetingRecords(context.Context, *DeleteMeetingRecordsReq) (*DeleteMeetingRecordsResp, error)
+	mustEmbedUnimplementedRtcServiceServer()
+}
+
+// UnimplementedRtcServiceServer must be embedded to have
+// forward compatible implementations.
+//
+// NOTE: this should be embedded by value instead of pointer to avoid a nil
+// pointer dereference when methods are called.
+type UnimplementedRtcServiceServer struct{}
+
+func (UnimplementedRtcServiceServer) SignalMessageAssemble(context.Context, *SignalMessageAssembleReq) (*SignalMessageAssembleResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalMessageAssemble not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalGetRoomByGroupID(context.Context, *SignalGetRoomByGroupIDReq) (*SignalGetRoomByGroupIDResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalGetRoomByGroupID not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalGetTokenByRoomID(context.Context, *SignalGetTokenByRoomIDReq) (*SignalGetTokenByRoomIDResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalGetTokenByRoomID not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalGetRooms(context.Context, *SignalGetRoomsReq) (*SignalGetRoomsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalGetRooms not implemented")
+}
+func (UnimplementedRtcServiceServer) GetSignalInvitationInfo(context.Context, *GetSignalInvitationInfoReq) (*GetSignalInvitationInfoResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSignalInvitationInfo not implemented")
+}
+func (UnimplementedRtcServiceServer) GetSignalInvitationInfoStartApp(context.Context, *GetSignalInvitationInfoStartAppReq) (*GetSignalInvitationInfoStartAppResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSignalInvitationInfoStartApp not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalCreateMeeting(context.Context, *SignalCreateMeetingReq) (*SignalCreateMeetingResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalCreateMeeting not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalJoinMeeting(context.Context, *SignalJoinMeetingReq) (*SignalJoinMeetingResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalJoinMeeting not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalUpdateMeetingInfo(context.Context, *SignalUpdateMeetingInfoReq) (*SignalUpdateMeetingInfoResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalUpdateMeetingInfo not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalCloseRoom(context.Context, *SignalCloseRoomReq) (*SignalCloseRoomResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalCloseRoom not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalGetMeetings(context.Context, *SignalGetMeetingsReq) (*SignalGetMeetingsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalGetMeetings not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalOperateStream(context.Context, *SignalOperateStreamReq) (*SignalOperateStreamResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalOperateStream not implemented")
+}
+func (UnimplementedRtcServiceServer) SignalSendCustomSignal(context.Context, *SignalSendCustomSignalReq) (*SignalSendCustomSignalResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SignalSendCustomSignal not implemented")
+}
+func (UnimplementedRtcServiceServer) GetSignalInvitationRecords(context.Context, *GetSignalInvitationRecordsReq) (*GetSignalInvitationRecordsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetSignalInvitationRecords not implemented")
+}
+func (UnimplementedRtcServiceServer) DeleteSignalRecords(context.Context, *DeleteSignalRecordsReq) (*DeleteSignalRecordsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteSignalRecords not implemented")
+}
+func (UnimplementedRtcServiceServer) GetMeetingRecords(context.Context, *GetMeetingRecordsReq) (*GetMeetingRecordsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetMeetingRecords not implemented")
+}
+func (UnimplementedRtcServiceServer) DeleteMeetingRecords(context.Context, *DeleteMeetingRecordsReq) (*DeleteMeetingRecordsResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DeleteMeetingRecords not implemented")
+}
+func (UnimplementedRtcServiceServer) mustEmbedUnimplementedRtcServiceServer() {}
+func (UnimplementedRtcServiceServer) testEmbeddedByValue()                    {}
+
+// UnsafeRtcServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to RtcServiceServer will
+// result in compilation errors.
+type UnsafeRtcServiceServer interface {
+	mustEmbedUnimplementedRtcServiceServer()
+}
+
+func RegisterRtcServiceServer(s grpc.ServiceRegistrar, srv RtcServiceServer) {
+	// If the following call pancis, it indicates UnimplementedRtcServiceServer was
+	// embedded by pointer and is nil.  This will cause panics if an
+	// unimplemented method is ever invoked, so we test this at initialization
+	// time to prevent it from happening at runtime later due to I/O.
+	if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
+		t.testEmbeddedByValue()
+	}
+	s.RegisterService(&RtcService_ServiceDesc, srv)
+}
+
+func _RtcService_SignalMessageAssemble_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalMessageAssembleReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalMessageAssemble(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalMessageAssemble_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalMessageAssemble(ctx, req.(*SignalMessageAssembleReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalGetRoomByGroupID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalGetRoomByGroupIDReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalGetRoomByGroupID(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalGetRoomByGroupID_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalGetRoomByGroupID(ctx, req.(*SignalGetRoomByGroupIDReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalGetTokenByRoomID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalGetTokenByRoomIDReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalGetTokenByRoomID(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalGetTokenByRoomID_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalGetTokenByRoomID(ctx, req.(*SignalGetTokenByRoomIDReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalGetRooms_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalGetRoomsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalGetRooms(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalGetRooms_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalGetRooms(ctx, req.(*SignalGetRoomsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_GetSignalInvitationInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSignalInvitationInfoReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).GetSignalInvitationInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_GetSignalInvitationInfo_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).GetSignalInvitationInfo(ctx, req.(*GetSignalInvitationInfoReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_GetSignalInvitationInfoStartApp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSignalInvitationInfoStartAppReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).GetSignalInvitationInfoStartApp(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_GetSignalInvitationInfoStartApp_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).GetSignalInvitationInfoStartApp(ctx, req.(*GetSignalInvitationInfoStartAppReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalCreateMeeting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalCreateMeetingReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalCreateMeeting(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalCreateMeeting_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalCreateMeeting(ctx, req.(*SignalCreateMeetingReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalJoinMeeting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalJoinMeetingReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalJoinMeeting(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalJoinMeeting_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalJoinMeeting(ctx, req.(*SignalJoinMeetingReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalUpdateMeetingInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalUpdateMeetingInfoReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalUpdateMeetingInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalUpdateMeetingInfo_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalUpdateMeetingInfo(ctx, req.(*SignalUpdateMeetingInfoReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalCloseRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalCloseRoomReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalCloseRoom(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalCloseRoom_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalCloseRoom(ctx, req.(*SignalCloseRoomReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalGetMeetings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalGetMeetingsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalGetMeetings(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalGetMeetings_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalGetMeetings(ctx, req.(*SignalGetMeetingsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalOperateStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalOperateStreamReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalOperateStream(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalOperateStream_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalOperateStream(ctx, req.(*SignalOperateStreamReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_SignalSendCustomSignal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SignalSendCustomSignalReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).SignalSendCustomSignal(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_SignalSendCustomSignal_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).SignalSendCustomSignal(ctx, req.(*SignalSendCustomSignalReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_GetSignalInvitationRecords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetSignalInvitationRecordsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).GetSignalInvitationRecords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_GetSignalInvitationRecords_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).GetSignalInvitationRecords(ctx, req.(*GetSignalInvitationRecordsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_DeleteSignalRecords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteSignalRecordsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).DeleteSignalRecords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_DeleteSignalRecords_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).DeleteSignalRecords(ctx, req.(*DeleteSignalRecordsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_GetMeetingRecords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMeetingRecordsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).GetMeetingRecords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_GetMeetingRecords_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).GetMeetingRecords(ctx, req.(*GetMeetingRecordsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RtcService_DeleteMeetingRecords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteMeetingRecordsReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RtcServiceServer).DeleteMeetingRecords(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: RtcService_DeleteMeetingRecords_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RtcServiceServer).DeleteMeetingRecords(ctx, req.(*DeleteMeetingRecordsReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// RtcService_ServiceDesc is the grpc.ServiceDesc for RtcService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var RtcService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "rtc.RtcService",
+	HandlerType: (*RtcServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "SignalMessageAssemble",
+			Handler:    _RtcService_SignalMessageAssemble_Handler,
+		},
+		{
+			MethodName: "SignalGetRoomByGroupID",
+			Handler:    _RtcService_SignalGetRoomByGroupID_Handler,
+		},
+		{
+			MethodName: "SignalGetTokenByRoomID",
+			Handler:    _RtcService_SignalGetTokenByRoomID_Handler,
+		},
+		{
+			MethodName: "SignalGetRooms",
+			Handler:    _RtcService_SignalGetRooms_Handler,
+		},
+		{
+			MethodName: "GetSignalInvitationInfo",
+			Handler:    _RtcService_GetSignalInvitationInfo_Handler,
+		},
+		{
+			MethodName: "GetSignalInvitationInfoStartApp",
+			Handler:    _RtcService_GetSignalInvitationInfoStartApp_Handler,
+		},
+		{
+			MethodName: "SignalCreateMeeting",
+			Handler:    _RtcService_SignalCreateMeeting_Handler,
+		},
+		{
+			MethodName: "SignalJoinMeeting",
+			Handler:    _RtcService_SignalJoinMeeting_Handler,
+		},
+		{
+			MethodName: "SignalUpdateMeetingInfo",
+			Handler:    _RtcService_SignalUpdateMeetingInfo_Handler,
+		},
+		{
+			MethodName: "SignalCloseRoom",
+			Handler:    _RtcService_SignalCloseRoom_Handler,
+		},
+		{
+			MethodName: "SignalGetMeetings",
+			Handler:    _RtcService_SignalGetMeetings_Handler,
+		},
+		{
+			MethodName: "SignalOperateStream",
+			Handler:    _RtcService_SignalOperateStream_Handler,
+		},
+		{
+			MethodName: "SignalSendCustomSignal",
+			Handler:    _RtcService_SignalSendCustomSignal_Handler,
+		},
+		{
+			MethodName: "GetSignalInvitationRecords",
+			Handler:    _RtcService_GetSignalInvitationRecords_Handler,
+		},
+		{
+			MethodName: "DeleteSignalRecords",
+			Handler:    _RtcService_DeleteSignalRecords_Handler,
+		},
+		{
+			MethodName: "GetMeetingRecords",
+			Handler:    _RtcService_GetMeetingRecords_Handler,
+		},
+		{
+			MethodName: "DeleteMeetingRecords",
+			Handler:    _RtcService_DeleteMeetingRecords_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "rtc.proto",
+}

+ 39 - 0
rtc.go

@@ -0,0 +1,39 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+
+	"self-im-rtc/internal/config"
+	rtcserviceServer "self-im-rtc/internal/server/rtcservice"
+	"self-im-rtc/internal/svc"
+	"self-im-rtc/pb/rtc"
+
+	"github.com/zeromicro/go-zero/core/conf"
+	"github.com/zeromicro/go-zero/core/service"
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+)
+
+var configFile = flag.String("f", "etc/rtc.yaml", "the config file")
+
+func main() {
+	flag.Parse()
+
+	var c config.Config
+	conf.MustLoad(*configFile, &c)
+	ctx := svc.NewServiceContext(c)
+
+	s := zrpc.MustNewServer(c.RpcServerConf, func(grpcServer *grpc.Server) {
+		rtc.RegisterRtcServiceServer(grpcServer, rtcserviceServer.NewRtcServiceServer(ctx))
+
+		if c.Mode == service.DevMode || c.Mode == service.TestMode {
+			reflection.Register(grpcServer)
+		}
+	})
+	defer s.Stop()
+
+	fmt.Printf("Starting rpc server at %s...\n", c.ListenOn)
+	s.Start()
+}

+ 595 - 0
rtc.proto

@@ -0,0 +1,595 @@
+syntax = "proto3";
+package rtc;
+option go_package = "./rtc";
+
+message ParticipantMetaData{
+  GroupInfo groupInfo = 1;
+  GroupMemberFullInfo groupMemberInfo = 2;
+  PublicUserInfo userInfo = 3;
+}
+
+message GroupInfo {
+  string groupID = 1;
+  string groupName = 2;
+  string notification = 3;
+  string introduction = 4;
+  string faceURL = 5;
+  string ownerUserID = 6;
+  int64 createTime = 7;
+  uint32 memberCount = 8;
+  string ex = 9;
+  int32 status = 10;
+  string creatorUserID = 11;
+  int32 groupType = 12;
+  int32 needVerification = 13;
+  int32 lookMemberInfo = 14;
+  int32 applyMemberFriend = 15;
+  int64 notificationUpdateTime = 16;
+  string notificationUserID = 17;
+  bool displayIsRead = 18;
+}
+
+message GroupMemberFullInfo {
+  string groupID = 1;
+  string userID = 2;
+  int32 roleLevel = 3;
+  int64 joinTime = 4;
+  string nickname = 5;
+  string faceURL = 6;
+  int32 appMangerLevel = 7; //if >0
+  int32 joinSource = 8;
+  string operatorUserID = 9;
+  string ex = 10;
+  int64 muteEndTime = 11;
+  string inviterUserID = 12;
+}
+
+message PublicUserInfo {
+  string userID = 1;
+  string nickname = 2;
+  string faceURL = 3;
+  string ex = 4;
+}
+
+message GetJoinTokenReq{
+  string room = 1;
+  string identity = 2;
+  ParticipantMetaData metaData = 3;
+}
+
+message GetJoinTokenResp{
+  string jwt = 1;
+  string liveURL = 2;
+}
+
+
+message SignalReq {
+  oneof payload {
+    SignalInviteReq invite = 1;
+    SignalInviteInGroupReq inviteInGroup= 2;
+    SignalCancelReq cancel = 3;
+    SignalAcceptReq accept = 4;
+    SignalHungUpReq hungUp = 5;
+    SignalRejectReq reject = 6;
+    SignalGetTokenByRoomIDReq getTokenByRoomID = 7;
+  }
+}
+
+message SignalSendCustomSignalReq {
+  string roomID = 1;
+  string customInfo = 2;
+}
+
+message SignalSendCustomSignalResp {
+}
+
+
+message SignalGetMeetingsReq {
+  string userID = 1;
+}
+
+message SignalGetMeetingsResp {
+  repeated MeetingInfo meetingInfoList = 1;
+}
+
+message SignalOperateStreamReq {
+  string streamType = 1;
+  string roomID = 2;
+  string userID = 3;
+  bool mute = 4;
+  bool muteAll = 5;
+}
+
+
+message SignalOperateStreamResp {
+}
+
+message SignalOnStreamChangeReq {
+  string roomID = 1;
+  string streamType = 2;
+  bool mute = 3;
+}
+
+message  SignalCreateMeetingReq{
+  int64 meetingDuration = 1;
+  string roomID = 2;
+  string meetingName = 3;
+  string meetingHostUserID = 4;
+  ParticipantMetaData participant = 5;
+  repeated string inviteeUserIDList = 6;
+  int64 startTime = 7;
+  string ex = 8;
+}
+
+message  SignalCreateMeetingResp{
+  string token = 1;
+  string roomID = 2;
+  string liveURL = 3;
+}
+
+message  SignalJoinMeetingReq{
+  string roomID = 1;
+  string userID = 2;
+  ParticipantMetaData participant = 3;
+}
+
+message SignalJoinMeetingResp{
+  string token = 1;
+  string roomID = 2;
+  string liveURL = 3;
+}
+
+message SignalResp {
+  oneof payload {
+    SignalInviteResp invite = 1;
+    SignalInviteInGroupResp inviteInGroup= 2;
+    SignalCancelResp cancel = 3;
+    SignalAcceptResp accept = 4;
+    SignalHungUpResp hungUp = 5;
+    SignalRejectResp reject = 6;
+    SignalGetTokenByRoomIDResp getTokenByRoomID = 7;
+  }
+}
+
+message InvitationInfo  {
+  string inviterUserID = 1;
+  repeated string inviteeUserIDList = 2;
+  string customData = 3;
+  string  groupID = 4;
+  string roomID = 5;
+  int32 timeout = 6;
+  string mediaType = 7;
+  int32 platformID = 8;
+  int32 sessionType = 9;
+  int64 initiateTime = 10;
+  repeated string busyLineUserIDList = 11;
+}
+
+message MeetingInfo {
+  string roomID = 1;
+  string meetingName = 2;
+  string ex = 3;
+  string hostUserID = 4;
+  repeated string inviteeUserIDList = 5; //邀请列表
+  int64 createTime = 6;
+  int64 startTime = 7;
+  int64 endTime = 8;
+  bool participantCanUnmuteSelf = 9; //成员是否能自己解除禁言
+  bool participantCanEnableVideo = 10; //成员是否能开启视频
+  bool onlyHostInviteUser = 11; //仅主持人可邀请用户
+  bool onlyHostShareScreen = 12; //仅主持人可共享屏幕
+  bool joinDisableMicrophone = 13; //加入是否默认关麦克风
+  bool joinDisableVideo = 14; //加入是否默认关视频
+  bool isMuteAllVideo = 15; // 是否全员禁用视频
+  bool isMuteAllMicrophone = 16; // 是否全员禁用麦克风
+  repeated string canScreenUserIDList = 17; // 可共享屏幕的ID列表
+  repeated string disableMicrophoneUserIDList = 18; // 当前被禁言麦克风的id列表
+  repeated string disableVideoUserIDList = 19; // 当前禁用视频流的ID列表
+  repeated string pinedUserIDList = 20; // 置顶ID列表
+  repeated string beWatchedUserIDList = 21; // 正在被观看用户列表
+}
+
+message SignalInviteReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  ParticipantMetaData participant = 3;
+  string userID = 4;
+}
+
+message SignalInviteResp {
+  string token = 1;
+  string roomID = 2;
+  string liveURL = 3;
+  repeated string busyLineUserIDList = 4;
+}
+
+message SignalInviteInGroupReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  ParticipantMetaData participant = 3;
+  string userID = 4;
+}
+
+message SignalInviteInGroupResp {
+  string token = 1;
+  string roomID = 2;
+  string liveURL = 3;
+  repeated string busyLineUserIDList = 4;
+}
+
+message SignalCancelReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  ParticipantMetaData participant = 3;
+  string userID = 4;
+}
+
+message SignalCancelResp {
+
+}
+
+message SignalAcceptReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  ParticipantMetaData participant = 3;
+  int32 opUserPlatformID = 4;
+  string userID = 5;
+}
+
+message SignalAcceptResp {
+  string token = 1;
+  string roomID = 2;
+  string liveURL = 3;
+}
+
+message SignalHungUpReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  string userID = 3;
+}
+
+message SignalHungUpResp {
+
+}
+
+
+message SignalRejectReq {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo  = 2;
+  ParticipantMetaData participant = 3;
+  int32 opUserPlatformID = 4;
+  string userID = 5;
+}
+
+message SignalRejectResp {
+
+}
+
+message SignalGetRoomByGroupIDReq {
+  string groupID = 1;
+}
+
+message SignalGetRoomByGroupIDResp {
+  InvitationInfo invitation = 1;
+  repeated ParticipantMetaData participant = 2;
+  string roomID = 3;
+}
+
+message SignalOnRoomParticipantConnectedReq {
+  InvitationInfo invitation = 1;
+  repeated ParticipantMetaData participant = 2;
+  string groupID = 3;
+}
+
+message SignalOnRoomParticipantDisconnectedReq {
+  InvitationInfo invitation = 1;
+  repeated ParticipantMetaData participant = 2;
+  string groupID = 3;
+}
+
+message SignalGetTokenByRoomIDReq {
+  string roomID = 1;
+  ParticipantMetaData participant = 2;
+  string userID = 3;
+}
+
+message SignalGetTokenByRoomIDResp {
+  string token = 1;
+  string liveURL = 2;
+}
+
+message SignalUpdateMeetingInfoReq {
+  string roomID = 1;
+  StringValue meetingName = 2;
+  StringValue ex = 3;
+  repeated string inviteeUserIDList = 4;
+  Int64Value startTime = 5;
+  Int64Value endTime = 6;
+  BoolValue participantCanUnmuteSelf = 7;
+  BoolValue participantCanEnableVideo = 8;
+  BoolValue onlyHostInviteUser = 9;
+  BoolValue onlyHostShareScreen = 10;
+  BoolValue joinDisableMicrophone = 11;
+  BoolValue joinDisableVideo = 12;
+  BoolValue isMuteAllVideo = 13;
+  BoolValue isMuteAllMicrophone = 14;
+
+  repeated string addCanScreenUserIDList = 15;
+  repeated string reduceCanScreenUserIDList = 16;
+  repeated string canScreenUserIDList = 17;
+
+  repeated string addDisableMicrophoneUserIDList = 18;
+  repeated string reduceDisableMicrophoneUserIDList = 19;
+  repeated string disableMicrophoneUserIDList = 20;
+
+  repeated string addDisableVideoUserIDList = 21;
+  repeated string reduceDisableVideoUserIDList = 22;
+  repeated string disableVideoUserIDList = 23;
+
+  repeated string addPinedUserIDList = 24;
+  repeated string reducePinedUserIDList = 25;
+  repeated string pinedUserIDList = 26;
+
+  repeated string addBeWatchedUserIDList = 27;
+  repeated string reduceBeWatchedUserIDList = 28;
+  repeated string beWatchedUserIDList = 29;
+}
+
+message SignalUpdateMeetingInfoResp {
+}
+
+message SignalCloseRoomReq {
+  string roomID = 1;
+}
+
+message SignalCloseRoomResp {
+}
+
+
+message SignalMessageAssembleReq {
+  SignalReq signalReq = 1;
+}
+
+message SignalMessageAssembleResp {
+  SignalResp signalResp = 1;
+}
+
+message SignalGetRoomsReq {
+  repeated string roomIDs = 1;
+}
+
+message SignalGetRoomsResp {
+  repeated SignalGetRoomByGroupIDResp roomList = 1;
+}
+
+
+message GetSignalInvitationInfoReq {
+  string roomID = 1;
+}
+
+message GetSignalInvitationInfoResp {
+  InvitationInfo invitationInfo = 1;
+  OfflinePushInfo offlinePushInfo = 2;
+}
+
+message GetSignalInvitationInfoStartAppReq {
+  string userID = 1;
+}
+
+message GetSignalInvitationInfoStartAppResp {
+  InvitationInfo invitation = 1;
+  OfflinePushInfo offlinePushInfo = 2;
+}
+
+message OfflinePushInfo {
+  string title = 1;
+  string desc = 2;
+  string ex = 3;
+  string iOSPushSound = 4;
+  bool iOSBadgeCount = 5;
+  string signalInfo = 6;
+}
+
+message SignalUser {
+  string userID = 1;
+  string nickname = 2;
+  int32 status = 3;
+}
+
+message SignalRecord {
+  string roomID = 1;
+  string sID = 2;
+  string fileName = 3;
+  string mediaType = 4;
+  int32 sessionType = 5;
+  string inviterUserID = 6;
+  string inviterUserNickname = 7;
+  string groupID = 8;
+  string groupName = 9;
+  repeated SignalUser inviterUsers = 10;
+  int64 createTime = 11;
+  int64 endTime = 12;
+  string size = 13;
+  string fileURL = 14;
+}
+
+message MeetingUser {
+  string userID = 1;
+  string nickname = 2;
+}
+
+message FileRecord {
+  string size = 1;
+  string fileURL = 2;
+}
+
+message MeetingRecord {
+  string roomID = 1;
+  string meetingName = 2;
+  string ex = 3;
+  string hostUserID = 4;
+  string hostUserNickname = 5;
+  int64 createTime = 6;
+  int64 startTime = 7;
+  int64 endTime = 8;
+  repeated MeetingUser joinedUsers = 9;
+  int32 status = 10;
+  repeated FileRecord fileRecords = 11;
+}
+
+message GetSignalInvitationRecordsReq {
+  RequestPagination pagination = 1;
+  int32 sessionType = 2;
+  string sendID = 3;
+  string recvID = 4;
+  int64 startTime = 5;
+  int64 endTime = 6;
+  repeated UserInfo JoinedUsers = 7;
+}
+
+message RequestPagination {
+  int32 pageNumber = 1;
+  int32 showNumber = 2;
+}
+
+message UserInfo {
+  string userID = 1;
+  string nickname = 2;
+  string faceURL = 3;
+  string ex = 4;
+  int64 createTime = 5;
+  int32 appMangerLevel = 6;
+  int32 globalRecvMsgOpt = 7;
+  int32 status = 8;
+}
+
+message GetSignalInvitationRecordsResp {
+  int32 total = 1;
+  repeated SignalRecord signalRecords = 2;
+}
+
+message DeleteSignalRecordsReq {
+  repeated string sIDs = 1;
+}
+
+message DeleteSignalRecordsResp {
+}
+
+message GetMeetingRecordsReq {
+  string hostUserID = 1;
+  string joinedUserID = 2;
+  int64 startTime = 3;
+  int64 endTime = 4;
+  RequestPagination pagination = 5;
+}
+
+message GetMeetingRecordsResp {
+  int32 total = 1;
+  repeated MeetingRecord meetingRecords = 2;
+}
+
+message DeleteMeetingRecordsReq {
+  repeated string roomIDs = 1;
+}
+
+message DeleteMeetingRecordsResp {
+}
+
+service RtcService {
+  rpc SignalMessageAssemble(SignalMessageAssembleReq) returns(SignalMessageAssembleResp);
+  rpc SignalGetRoomByGroupID(SignalGetRoomByGroupIDReq) returns(SignalGetRoomByGroupIDResp);
+  rpc SignalGetTokenByRoomID(SignalGetTokenByRoomIDReq) returns(SignalGetTokenByRoomIDResp);
+  rpc SignalGetRooms(SignalGetRoomsReq) returns(SignalGetRoomsResp);
+
+  rpc GetSignalInvitationInfo(GetSignalInvitationInfoReq) returns(GetSignalInvitationInfoResp);
+  rpc GetSignalInvitationInfoStartApp(GetSignalInvitationInfoStartAppReq) returns(GetSignalInvitationInfoStartAppResp);
+  // meeting
+  rpc SignalCreateMeeting(SignalCreateMeetingReq) returns(SignalCreateMeetingResp);
+  rpc SignalJoinMeeting(SignalJoinMeetingReq) returns(SignalJoinMeetingResp);
+  rpc SignalUpdateMeetingInfo(SignalUpdateMeetingInfoReq) returns(SignalUpdateMeetingInfoResp);
+  rpc SignalCloseRoom(SignalCloseRoomReq) returns(SignalCloseRoomResp);
+  rpc SignalGetMeetings(SignalGetMeetingsReq) returns(SignalGetMeetingsResp);
+  rpc SignalOperateStream(SignalOperateStreamReq) returns(SignalOperateStreamResp);
+
+  // custom signal
+  rpc SignalSendCustomSignal(SignalSendCustomSignalReq) returns(SignalSendCustomSignalResp);
+
+  // rtc cms
+  rpc GetSignalInvitationRecords(GetSignalInvitationRecordsReq) returns(GetSignalInvitationRecordsResp);
+  rpc DeleteSignalRecords(DeleteSignalRecordsReq) returns(DeleteSignalRecordsResp);
+  rpc GetMeetingRecords(GetMeetingRecordsReq) returns(GetMeetingRecordsResp);
+  rpc DeleteMeetingRecords(DeleteMeetingRecordsReq) returns(DeleteMeetingRecordsResp);
+}
+
+
+// Wrapper message for `double`.
+//
+// The JSON representation for `DoubleValue` is JSON number.
+message DoubleValue {
+  // The double value.
+  double value = 1;
+}
+
+// Wrapper message for `float`.
+//
+// The JSON representation for `FloatValue` is JSON number.
+message FloatValue {
+  // The float value.
+  float value = 1;
+}
+
+// Wrapper message for `int64`.
+//
+// The JSON representation for `Int64Value` is JSON string.
+message Int64Value {
+  // The int64 value.
+  int64 value = 1;
+}
+
+// Wrapper message for `uint64`.
+//
+// The JSON representation for `UInt64Value` is JSON string.
+message UInt64Value {
+  // The uint64 value.
+  uint64 value = 1;
+}
+
+// Wrapper message for `int32`.
+//
+// The JSON representation for `Int32Value` is JSON number.
+message Int32Value {
+  // The int32 value.
+  int32 value = 1;
+}
+
+// Wrapper message for `uint32`.
+//
+// The JSON representation for `UInt32Value` is JSON number.
+message UInt32Value {
+  // The uint32 value.
+  uint32 value = 1;
+}
+
+// Wrapper message for `bool`.
+//
+// The JSON representation for `BoolValue` is JSON `true` and `false`.
+message BoolValue {
+  // The bool value.
+  bool value = 1;
+}
+
+// Wrapper message for `string`.
+//
+// The JSON representation for `StringValue` is JSON string.
+message StringValue {
+  // The string value.
+  string value = 1;
+}
+
+// Wrapper message for `bytes`.
+//
+// The JSON representation for `BytesValue` is JSON string.
+message BytesValue {
+  // The bytes value.
+  bytes value = 1;
+}