diff --git a/plugin/gb28181pro/api.go b/plugin/gb28181pro/api.go index dc6fe8b..96a4317 100644 --- a/plugin/gb28181pro/api.go +++ b/plugin/gb28181pro/api.go @@ -9,12 +9,15 @@ import ( "sync" "time" + "net/url" + "github.com/emiago/sipgo" "github.com/emiago/sipgo/sip" "github.com/rs/zerolog" "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" "m7s.live/v5/pkg/config" + "m7s.live/v5/pkg/util" "m7s.live/v5/plugin/gb28181pro/pb" gb28181 "m7s.live/v5/plugin/gb28181pro/pkg" ) @@ -450,6 +453,90 @@ func (gb *GB28181ProPlugin) StartPlay(ctx context.Context, req *pb.PlayRequest) return resp, nil } +// StartPlayback 处理回放请求 +func (gb *GB28181ProPlugin) StartPlayback(ctx context.Context, req *pb.PlaybackRequest) (*pb.PlayResponse, error) { + resp := &pb.PlayResponse{} + gb.Info("StartPlayback request", "deviceId", req.DeviceId, "channelId", req.ChannelId, "start", req.Start, "end", req.End, "range", req.Range) + + // 先从内存中获取设备 + device, ok := gb.devices.Get(req.DeviceId) + if !ok && gb.DB != nil { + // 如果内存中没有且数据库存在,则从数据库查询 + var dbDevice Device + if err := gb.DB.Where("device_id = ?", req.DeviceId).First(&dbDevice).Error; err == nil { + // 恢复设备的必要字段 + dbDevice.Logger = gb.With("id", req.DeviceId) + dbDevice.channels.L = new(sync.RWMutex) + dbDevice.plugin = gb + device = &dbDevice + } else { + gb.Error("StartPlayback failed", "error", "device not found", "deviceId", req.DeviceId) + resp.Code = 404 + resp.Message = "device not found" + return resp, nil + } + } + + // 先从内存中获取通道 + channel, ok := device.channels.Get(req.ChannelId) + if !ok && gb.DB != nil { + // 如果内存中没有且数据库存在,则从数据库查询 + var dbChannel gb28181.DeviceChannel + if err := gb.DB.Where("device_id = ? AND device_db_id = ?", req.ChannelId, device.ID).First(&dbChannel).Error; err == nil { + channel = &Channel{ + Device: device, + Logger: device.Logger.With("channel", req.ChannelId), + DeviceChannel: dbChannel, + } + device.channels.Set(channel) + } else { + gb.Error("StartPlayback failed", "error", "channel not found", "channelId", req.ChannelId) + resp.Code = 404 + resp.Message = "channel not found" + return resp, nil + } + } + + // 处理时间范围 + startTime, endTime, err := util.TimeRangeQueryParse(url.Values{ + "range": []string{req.Range}, + "start": []string{req.Start}, + "end": []string{req.End}, + }) + if err != nil { + gb.Error("StartPlayback failed", "error", "invalid time format", "err", err) + resp.Code = 400 + resp.Message = fmt.Sprintf("invalid time format: %v", err) + return resp, nil + } + + // 构建流路径,加入时间信息以区分不同的回放请求 + streamPath := fmt.Sprintf("%s/%s/playback_%s_%s", req.DeviceId, req.ChannelId, + startTime.Format("20060102150405"), endTime.Format("20060102150405")) + + // 调用 Pull 方法开始拉流 + gb.Pull(streamPath, config.Pull{ + URL: streamPath, + Args: config.HTTPValues{ + "start": []string{startTime.Format(time.RFC3339)}, + "end": []string{endTime.Format(time.RFC3339)}, + }, + }, nil) + + // 设置响应信息 + resp.Code = 0 + resp.Message = "success" + resp.StreamInfo = &pb.StreamInfo{ + Stream: streamPath, + App: "gb28181", + Ip: device.IP, + } + + gb.Info("StartPlayback success", "deviceId", req.DeviceId, "channelId", req.ChannelId, + "start", startTime.Format(time.RFC3339), "end", endTime.Format(time.RFC3339)) + return resp, nil +} + // AddPlatform 实现添加平台信息 func (gb *GB28181ProPlugin) AddPlatform(ctx context.Context, req *pb.Platform) (*pb.BaseResponse, error) { resp := &pb.BaseResponse{} diff --git a/plugin/gb28181pro/device.go b/plugin/gb28181pro/device.go index e39ac6f..12630dc 100644 --- a/plugin/gb28181pro/device.go +++ b/plugin/gb28181pro/device.go @@ -7,7 +7,6 @@ import ( "github.com/emiago/sipgo" "github.com/emiago/sipgo/sip" - "m7s.live/v5" "m7s.live/v5/pkg/task" "m7s.live/v5/pkg/util" gb28181 "m7s.live/v5/plugin/gb28181pro/pkg" @@ -240,7 +239,8 @@ func (d *Device) CreateRequest(Method sip.RequestMethod) *sip.Request { req := sip.NewRequest(Method, d.Recipient) req.AppendHeader(&d.fromHDR) contentType := sip.ContentTypeHeader("Application/MANSCDP+xml") - req.AppendHeader(sip.NewHeader("User-Agent", "M7S/"+m7s.Version)) + //req.AppendHeader(sip.NewHeader("User-Agent", "M7S/"+m7s.Version)) + req.AppendHeader(sip.NewHeader("User-Agent", "asdf")) req.AppendHeader(&contentType) req.AppendHeader(&d.contactHDR) return req diff --git a/plugin/gb28181pro/dialog.go b/plugin/gb28181pro/dialog.go index 01a19d5..ff03b9c 100644 --- a/plugin/gb28181pro/dialog.go +++ b/plugin/gb28181pro/dialog.go @@ -2,19 +2,16 @@ package plugin_gb28181pro import ( "fmt" - "strconv" - "strings" - "sync" - - "os" - "github.com/emiago/sipgo" "github.com/emiago/sipgo/sip" "github.com/rs/zerolog" m7s "m7s.live/v5" "m7s.live/v5/pkg/task" - "m7s.live/v5/pkg/util" gb28181 "m7s.live/v5/plugin/gb28181pro/pkg" + "os" + "strconv" + "strings" + "sync" ) type Dialog struct { @@ -24,6 +21,8 @@ type Dialog struct { gb *GB28181ProPlugin session *sipgo.DialogClientSession pullCtx m7s.PullJob + start string + end string } func (d *Dialog) GetCallID() string { @@ -44,82 +43,84 @@ func (d *Dialog) Start() (err error) { } sss := strings.Split(d.pullCtx.RemoteURL, "/") deviceId, channelId := sss[0], sss[1] - if len(sss) == 2 { - // 先从内存中获取设备 - device, ok := d.gb.devices.Get(deviceId) - if !ok && d.gb.DB != nil { - // 如果内存中没有且数据库存在,则从数据库查询 - var dbDevice Device - if err := d.gb.DB.Where("device_id = ?", deviceId).First(&dbDevice).Error; err == nil { - // 恢复设备的必要字段 - dbDevice.Logger = d.gb.With("id", deviceId) - dbDevice.channels.L = new(sync.RWMutex) - dbDevice.plugin = d.gb - dbDevice.eventChan = make(chan any, 10) + //if len(sss) == 2 { + // 先从内存中获取设备 + device, ok := d.gb.devices.Get(deviceId) + if !ok && d.gb.DB != nil { + // 如果内存中没有且数据库存在,则从数据库查询 + var dbDevice Device + if err := d.gb.DB.Where("device_id = ?", deviceId).First(&dbDevice).Error; err == nil { - // 初始化 SIP 相关字段 - dbDevice.fromHDR = sip.FromHeader{ - Address: sip.Uri{ - User: d.gb.Serial, - Host: d.gb.Realm, - }, - Params: sip.NewParams(), - } - dbDevice.fromHDR.Params.Add("tag", sip.GenerateTagN(16)) - - dbDevice.contactHDR = sip.ContactHeader{ - Address: sip.Uri{ - User: d.gb.Serial, - Host: dbDevice.LocalIP, - Port: dbDevice.Port, - }, - } - - dbDevice.Recipient = sip.Uri{ - Host: dbDevice.IP, - Port: dbDevice.Port, - User: dbDevice.DeviceID, - } - - // 初始化 SIP 客户端 - dbDevice.client, _ = sipgo.NewClient(d.gb.ua, sipgo.WithClientLogger(zerolog.New(os.Stdout)), sipgo.WithClientHostname(dbDevice.LocalIP)) - if dbDevice.client != nil { - dbDevice.dialogClient = sipgo.NewDialogClient(dbDevice.client, dbDevice.contactHDR) - } else { - return fmt.Errorf("failed to create sip client for device %s", deviceId) - } - - device = &dbDevice - } else { - return fmt.Errorf("device %s not found", deviceId) - } - } else if !ok { + device = &dbDevice + } else { return fmt.Errorf("device %s not found", deviceId) } + } else if !ok { + return fmt.Errorf("device %s not found", deviceId) + } - // 先从内存中获取通道 - channel, ok := device.channels.Get(channelId) - if !ok && d.gb.DB != nil { - // 如果内存中没有且数据库存在,则从数据库查询 - var dbChannel gb28181.DeviceChannel - if err := d.gb.DB.Where("device_id = ? AND device_db_id = ?", channelId, device.ID).First(&dbChannel).Error; err == nil { - channel = &Channel{ - Device: device, - Logger: device.Logger.With("channel", channelId), - DeviceChannel: dbChannel, - } - device.channels.Set(channel) - } else { - return fmt.Errorf("channel %s not found", channelId) + // 先从内存中获取通道 + channel, ok := device.channels.Get(channelId) + if !ok && d.gb.DB != nil { + // 如果内存中没有且数据库存在,则从数据库查询 + var dbChannel gb28181.DeviceChannel + if err := d.gb.DB.Where("device_id = ? AND device_db_id = ?", channelId, device.ID).First(&dbChannel).Error; err == nil { + channel = &Channel{ + Device: device, + Logger: device.Logger.With("channel", channelId), + DeviceChannel: dbChannel, } - } else if !ok { + device.channels.Set(channel) + } else { return fmt.Errorf("channel %s not found", channelId) } + } else if !ok { + return fmt.Errorf("channel %s not found", channelId) + } - d.Channel = channel - } else if len(sss) == 3 { - var recordRange util.Range[int] - err = recordRange.Resolve(sss[2]) + d.Channel = channel + //} else if len(sss) == 3 { + // var recordRange util.Range[int] + // err = recordRange.Resolve(sss[2]) + //} + + if device != nil && channel != nil { + // 初始化 SIP 相关字段 + device.fromHDR = sip.FromHeader{ + Address: sip.Uri{ + User: d.gb.Serial, + Host: d.gb.Realm, + }, + Params: sip.NewParams(), + } + device.fromHDR.Params.Add("tag", sip.GenerateTagN(16)) + + device.contactHDR = sip.ContactHeader{ + Address: sip.Uri{ + User: d.gb.Serial, + Host: device.LocalIP, + Port: device.Port, + }, + } + + device.Recipient = sip.Uri{ + Host: device.IP, + Port: device.Port, + User: channelId, // 使用通道的 DeviceID + } + // 恢复设备的必要字段 + device.Logger = d.gb.With("id", deviceId) + device.channels.L = new(sync.RWMutex) + device.plugin = d.gb + device.eventChan = make(chan any, 10) + // 初始化 SIP 客户端 + device.client, _ = sipgo.NewClient(d.gb.ua, sipgo.WithClientLogger(zerolog.New(os.Stdout)), sipgo.WithClientHostname(device.LocalIP)) + if device.client != nil { + device.dialogClient = sipgo.NewDialogClient(device.client, device.contactHDR) + } else { + d.gb.Error("failed to create sip client for device", "error", "deviceId", deviceId) + return + } } d.gb.dialogs.Set(d) @@ -138,7 +139,7 @@ func (d *Dialog) Start() (err error) { } // 调用 PlayStreamCmd - d.session, err = d.gb.PlayStreamCmd(d.Channel.Device, d.Channel, d.MediaPort) + d.session, err = d.gb.PlayStreamCmd(device, channel, d.MediaPort, d.start, d.end) if err != nil { return fmt.Errorf("play stream failed: %v", err) } diff --git a/plugin/gb28181pro/index.go b/plugin/gb28181pro/index.go index 3ff5c16..45d0a92 100644 --- a/plugin/gb28181pro/index.go +++ b/plugin/gb28181pro/index.go @@ -40,7 +40,7 @@ type PositionConfig struct { } // PlayStreamCmd 请求预览视频流 -func (gb *GB28181ProPlugin) PlayStreamCmd(device *Device, channel *Channel, mediaPort uint16) (*sipgo.DialogClientSession, error) { +func (gb *GB28181ProPlugin) PlayStreamCmd(device *Device, channel *Channel, mediaPort uint16, start, end string) (*sipgo.DialogClientSession, error) { if channel == nil { return nil, fmt.Errorf("channel is nil") } @@ -60,11 +60,26 @@ func (gb *GB28181ProPlugin) PlayStreamCmd(device *Device, channel *Channel, medi // 构建 SDP 内容 sdpInfo := []string{ "v=0", - fmt.Sprintf("o=%s 0 0 IN IP4 %s", device.ID, sdpIP), - "s=Play", + fmt.Sprintf("o=%s 0 0 IN IP4 %s", device.DeviceID, sdpIP), + fmt.Sprintf("s=%s", map[bool]string{true: "Playback", false: "Play"}[start != "" && end != ""]), // 根据是否有时间参数决定 //"u=" + device.ID + ":0", + "u=" + channel.DeviceID + ":0", "c=IN IP4 " + sdpIP, - "t=0 0", + } + + // 如果有时间参数,添加时间行 + if start != "" && end != "" { + startTime, err := time.Parse(time.RFC3339, start) + if err != nil { + return nil, fmt.Errorf("parse start time failed: %v", err) + } + endTime, err := time.Parse(time.RFC3339, end) + if err != nil { + return nil, fmt.Errorf("parse end time failed: %v", err) + } + sdpInfo = append(sdpInfo, fmt.Sprintf("t=%d %d", startTime.Unix(), endTime.Unix())) + } else { + sdpInfo = append(sdpInfo, "t=0 0") } // 添加媒体行和相关属性 @@ -127,6 +142,7 @@ func (gb *GB28181ProPlugin) PlayStreamCmd(device *Device, channel *Channel, medi toHeader := sip.ToHeader{ Address: sip.Uri{User: channel.DeviceID, Host: device.HostAddress}, } + userAgentHeader := sip.NewHeader("User-Agent", "M7S/"+m7s.Version) request.AppendHeader(&contentTypeHeader) request.AppendHeader(subjectHeader) @@ -135,7 +151,8 @@ func (gb *GB28181ProPlugin) PlayStreamCmd(device *Device, channel *Channel, medi request.SetBody([]byte(strings.Join(sdpInfo, "\r\n") + "\r\n")) // 创建会话 - return device.dialogClient.Invite(gb, device.Recipient, request.Body(), &contentTypeHeader, subjectHeader, &device.fromHDR, allowHeader, &toHeader) + return device.dialogClient.Invite(gb, device.Recipient, request.Body(), &contentTypeHeader, subjectHeader, &device.fromHDR, &toHeader, userAgentHeader, allowHeader) + //return device.dialogClient.Invite(gb, device.Recipient, request.Body(), &contentTypeHeader, subjectHeader, &device.fromHDR, allowHeader, &toHeader) } type GB28181ProPlugin struct { @@ -680,6 +697,14 @@ func (gb *GB28181ProPlugin) Pull(streamPath string, conf config.Pull, pubConf *c dialog := Dialog{ gb: gb, } + if conf.Args != nil { + if starts, ok := conf.Args["start"]; ok && len(starts) > 0 { + dialog.start = starts[0] + } + if ends, ok := conf.Args["end"]; ok && len(ends) > 0 { + dialog.end = ends[0] + } + } dialog.GetPullJob().Init(&dialog, &gb.Plugin, streamPath, conf, pubConf) } @@ -848,18 +873,4 @@ func (gb *GB28181ProPlugin) OnInvite(req *sip.Request, tx sip.ServerTransaction) gb.Info("OnInvite", "action", "complete", "deviceId", inviteInfo.RequesterId, "channelId", inviteInfo.TargetChannelId, "ip", inviteInfo.IP, "port", inviteInfo.Port, "tcp", inviteInfo.TCP, "tcpActive", inviteInfo.TCPActive) - - // TODO: 实现媒体流处理 - // 1. 创建合适的Publisher - // 2. 创建PS流接收器 - // 3. 配置接收参数: - // - 使用解析出的 inviteInfo.IP 和 inviteInfo.Port 作为目标地址 - // - 使用 inviteInfo.TCP 和 inviteInfo.TCPActive 确定传输模式 - // - 使用本地分配的 mediaPort 作为监听端口 - // 4. 启动接收任务 - // 5. 处理媒体流解复用 - // 6. 根据 inviteInfo.SessionName 判断是实时点播还是历史回放 - // - 如果是回放,使用 inviteInfo.StartTime 和 inviteInfo.StopTime - // 7. 使用 inviteInfo.SSRC 标识流 - // 8. 如果指定了 inviteInfo.DownloadSpeed,控制下载速度 } diff --git a/plugin/gb28181pro/pb/gb28181.pb.go b/plugin/gb28181pro/pb/gb28181.pb.go index dccacf9..07c2bd0 100644 --- a/plugin/gb28181pro/pb/gb28181.pb.go +++ b/plugin/gb28181pro/pb/gb28181.pb.go @@ -2021,6 +2021,82 @@ func (x *PlayRequest) GetChannelId() string { return "" } +type PlaybackRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + DeviceId string `protobuf:"bytes,1,opt,name=deviceId,proto3" json:"deviceId,omitempty"` + ChannelId string `protobuf:"bytes,2,opt,name=channelId,proto3" json:"channelId,omitempty"` + Start string `protobuf:"bytes,3,opt,name=start,proto3" json:"start,omitempty"` // 开始时间 + End string `protobuf:"bytes,4,opt,name=end,proto3" json:"end,omitempty"` // 结束时间 + Range string `protobuf:"bytes,5,opt,name=range,proto3" json:"range,omitempty"` // 时间范围,可选 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PlaybackRequest) Reset() { + *x = PlaybackRequest{} + mi := &file_gb28181_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PlaybackRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlaybackRequest) ProtoMessage() {} + +func (x *PlaybackRequest) ProtoReflect() protoreflect.Message { + mi := &file_gb28181_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 PlaybackRequest.ProtoReflect.Descriptor instead. +func (*PlaybackRequest) Descriptor() ([]byte, []int) { + return file_gb28181_proto_rawDescGZIP(), []int{30} +} + +func (x *PlaybackRequest) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *PlaybackRequest) GetChannelId() string { + if x != nil { + return x.ChannelId + } + return "" +} + +func (x *PlaybackRequest) GetStart() string { + if x != nil { + return x.Start + } + return "" +} + +func (x *PlaybackRequest) GetEnd() string { + if x != nil { + return x.End + } + return "" +} + +func (x *PlaybackRequest) GetRange() string { + if x != nil { + return x.Range + } + return "" +} + type PlayResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` @@ -2032,7 +2108,7 @@ type PlayResponse struct { func (x *PlayResponse) Reset() { *x = PlayResponse{} - mi := &file_gb28181_proto_msgTypes[30] + mi := &file_gb28181_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2044,7 +2120,7 @@ func (x *PlayResponse) String() string { func (*PlayResponse) ProtoMessage() {} func (x *PlayResponse) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[30] + mi := &file_gb28181_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2057,7 +2133,7 @@ func (x *PlayResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlayResponse.ProtoReflect.Descriptor instead. func (*PlayResponse) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{30} + return file_gb28181_proto_rawDescGZIP(), []int{31} } func (x *PlayResponse) GetCode() int32 { @@ -2094,7 +2170,7 @@ type StreamInfo struct { func (x *StreamInfo) Reset() { *x = StreamInfo{} - mi := &file_gb28181_proto_msgTypes[31] + mi := &file_gb28181_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2106,7 +2182,7 @@ func (x *StreamInfo) String() string { func (*StreamInfo) ProtoMessage() {} func (x *StreamInfo) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[31] + mi := &file_gb28181_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2119,7 +2195,7 @@ func (x *StreamInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamInfo.ProtoReflect.Descriptor instead. func (*StreamInfo) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{31} + return file_gb28181_proto_rawDescGZIP(), []int{32} } func (x *StreamInfo) GetStream() string { @@ -2167,7 +2243,7 @@ type ConvertStopRequest struct { func (x *ConvertStopRequest) Reset() { *x = ConvertStopRequest{} - mi := &file_gb28181_proto_msgTypes[32] + mi := &file_gb28181_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2179,7 +2255,7 @@ func (x *ConvertStopRequest) String() string { func (*ConvertStopRequest) ProtoMessage() {} func (x *ConvertStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[32] + mi := &file_gb28181_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2192,7 +2268,7 @@ func (x *ConvertStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConvertStopRequest.ProtoReflect.Descriptor instead. func (*ConvertStopRequest) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{32} + return file_gb28181_proto_rawDescGZIP(), []int{33} } func (x *ConvertStopRequest) GetKey() string { @@ -2221,7 +2297,7 @@ type BroadcastRequest struct { func (x *BroadcastRequest) Reset() { *x = BroadcastRequest{} - mi := &file_gb28181_proto_msgTypes[33] + mi := &file_gb28181_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2233,7 +2309,7 @@ func (x *BroadcastRequest) String() string { func (*BroadcastRequest) ProtoMessage() {} func (x *BroadcastRequest) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[33] + mi := &file_gb28181_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2246,7 +2322,7 @@ func (x *BroadcastRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BroadcastRequest.ProtoReflect.Descriptor instead. func (*BroadcastRequest) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{33} + return file_gb28181_proto_rawDescGZIP(), []int{34} } func (x *BroadcastRequest) GetDeviceId() string { @@ -2289,7 +2365,7 @@ type BroadcastResponse struct { func (x *BroadcastResponse) Reset() { *x = BroadcastResponse{} - mi := &file_gb28181_proto_msgTypes[34] + mi := &file_gb28181_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2301,7 +2377,7 @@ func (x *BroadcastResponse) String() string { func (*BroadcastResponse) ProtoMessage() {} func (x *BroadcastResponse) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[34] + mi := &file_gb28181_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2314,7 +2390,7 @@ func (x *BroadcastResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BroadcastResponse.ProtoReflect.Descriptor instead. func (*BroadcastResponse) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{34} + return file_gb28181_proto_rawDescGZIP(), []int{35} } func (x *BroadcastResponse) GetCode() int32 { @@ -2357,7 +2433,7 @@ type SSRCInfo struct { func (x *SSRCInfo) Reset() { *x = SSRCInfo{} - mi := &file_gb28181_proto_msgTypes[35] + mi := &file_gb28181_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2369,7 +2445,7 @@ func (x *SSRCInfo) String() string { func (*SSRCInfo) ProtoMessage() {} func (x *SSRCInfo) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[35] + mi := &file_gb28181_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2382,7 +2458,7 @@ func (x *SSRCInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SSRCInfo.ProtoReflect.Descriptor instead. func (*SSRCInfo) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{35} + return file_gb28181_proto_rawDescGZIP(), []int{36} } func (x *SSRCInfo) GetDeviceId() string { @@ -2425,7 +2501,7 @@ type SSRCListResponse struct { func (x *SSRCListResponse) Reset() { *x = SSRCListResponse{} - mi := &file_gb28181_proto_msgTypes[36] + mi := &file_gb28181_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2437,7 +2513,7 @@ func (x *SSRCListResponse) String() string { func (*SSRCListResponse) ProtoMessage() {} func (x *SSRCListResponse) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[36] + mi := &file_gb28181_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2450,7 +2526,7 @@ func (x *SSRCListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SSRCListResponse.ProtoReflect.Descriptor instead. func (*SSRCListResponse) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{36} + return file_gb28181_proto_rawDescGZIP(), []int{37} } func (x *SSRCListResponse) GetCode() int32 { @@ -2528,7 +2604,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} - mi := &file_gb28181_proto_msgTypes[37] + mi := &file_gb28181_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2540,7 +2616,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[37] + mi := &file_gb28181_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2553,7 +2629,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{37} + return file_gb28181_proto_rawDescGZIP(), []int{38} } func (x *Platform) GetId() int32 { @@ -2832,7 +2908,7 @@ type GetPlatformRequest struct { func (x *GetPlatformRequest) Reset() { *x = GetPlatformRequest{} - mi := &file_gb28181_proto_msgTypes[38] + mi := &file_gb28181_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2844,7 +2920,7 @@ func (x *GetPlatformRequest) String() string { func (*GetPlatformRequest) ProtoMessage() {} func (x *GetPlatformRequest) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[38] + mi := &file_gb28181_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2857,7 +2933,7 @@ func (x *GetPlatformRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPlatformRequest.ProtoReflect.Descriptor instead. func (*GetPlatformRequest) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{38} + return file_gb28181_proto_rawDescGZIP(), []int{39} } func (x *GetPlatformRequest) GetId() int32 { @@ -2877,7 +2953,7 @@ type DeletePlatformRequest struct { func (x *DeletePlatformRequest) Reset() { *x = DeletePlatformRequest{} - mi := &file_gb28181_proto_msgTypes[39] + mi := &file_gb28181_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2889,7 +2965,7 @@ func (x *DeletePlatformRequest) String() string { func (*DeletePlatformRequest) ProtoMessage() {} func (x *DeletePlatformRequest) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[39] + mi := &file_gb28181_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2902,7 +2978,7 @@ func (x *DeletePlatformRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePlatformRequest.ProtoReflect.Descriptor instead. func (*DeletePlatformRequest) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{39} + return file_gb28181_proto_rawDescGZIP(), []int{40} } func (x *DeletePlatformRequest) GetId() int32 { @@ -2925,7 +3001,7 @@ type ListPlatformsRequest struct { func (x *ListPlatformsRequest) Reset() { *x = ListPlatformsRequest{} - mi := &file_gb28181_proto_msgTypes[40] + mi := &file_gb28181_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +3013,7 @@ func (x *ListPlatformsRequest) String() string { func (*ListPlatformsRequest) ProtoMessage() {} func (x *ListPlatformsRequest) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[40] + mi := &file_gb28181_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2950,7 +3026,7 @@ func (x *ListPlatformsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPlatformsRequest.ProtoReflect.Descriptor instead. func (*ListPlatformsRequest) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{40} + return file_gb28181_proto_rawDescGZIP(), []int{41} } func (x *ListPlatformsRequest) GetPage() int32 { @@ -2993,7 +3069,7 @@ type PlatformResponse struct { func (x *PlatformResponse) Reset() { *x = PlatformResponse{} - mi := &file_gb28181_proto_msgTypes[41] + mi := &file_gb28181_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3005,7 +3081,7 @@ func (x *PlatformResponse) String() string { func (*PlatformResponse) ProtoMessage() {} func (x *PlatformResponse) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[41] + mi := &file_gb28181_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3018,7 +3094,7 @@ func (x *PlatformResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PlatformResponse.ProtoReflect.Descriptor instead. func (*PlatformResponse) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{41} + return file_gb28181_proto_rawDescGZIP(), []int{42} } func (x *PlatformResponse) GetCode() int32 { @@ -3055,7 +3131,7 @@ type PlatformsPageInfo struct { func (x *PlatformsPageInfo) Reset() { *x = PlatformsPageInfo{} - mi := &file_gb28181_proto_msgTypes[42] + mi := &file_gb28181_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3067,7 +3143,7 @@ func (x *PlatformsPageInfo) String() string { func (*PlatformsPageInfo) ProtoMessage() {} func (x *PlatformsPageInfo) ProtoReflect() protoreflect.Message { - mi := &file_gb28181_proto_msgTypes[42] + mi := &file_gb28181_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3080,7 +3156,7 @@ func (x *PlatformsPageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PlatformsPageInfo.ProtoReflect.Descriptor instead. func (*PlatformsPageInfo) Descriptor() ([]byte, []int) { - return file_gb28181_proto_rawDescGZIP(), []int{42} + return file_gb28181_proto_rawDescGZIP(), []int{43} } func (x *PlatformsPageInfo) GetCode() int32 { @@ -3368,382 +3444,399 @@ var file_gb28181_proto_rawDesc = string([]byte{ 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x64, 0x22, 0x75, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, - 0x72, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6e, 0x0a, 0x0a, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x70, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, - 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x70, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x73, 0x72, 0x63, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x73, 0x72, 0x63, 0x22, 0x4c, 0x0a, 0x12, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x42, 0x72, 0x6f, 0x61, - 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x11, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x74, 0x0a, 0x08, 0x53, 0x53, 0x52, 0x43, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x73, 0x72, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x73, 0x72, - 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x80, 0x01, - 0x0a, 0x10, 0x53, 0x53, 0x52, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x53, 0x52, 0x43, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0xe4, 0x09, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x47, 0x42, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x47, 0x42, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x47, 0x42, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x47, 0x42, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x12, 0x1e, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x42, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x42, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x63, - 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x70, 0x74, 0x7a, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x74, - 0x7a, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x74, 0x63, 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x72, 0x74, 0x63, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x74, - 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x26, 0x0a, - 0x0e, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x61, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, - 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, - 0x22, 0x0a, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x70, 0x18, - 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x49, 0x70, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x50, 0x75, 0x73, 0x68, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, - 0x74, 0x6f, 0x50, 0x75, 0x73, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, - 0x13, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x61, 0x74, 0x61, - 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, - 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x11, 0x63, - 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, - 0x69, 0x74, 0x68, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x76, - 0x69, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, - 0x76, 0x69, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, - 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, - 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x79, 0x18, 0x25, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x79, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x63, 0x79, 0x18, 0x26, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, - 0x73, 0x65, 0x63, 0x72, 0x65, 0x63, 0x79, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x27, 0x0a, - 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6e, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6a, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, - 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x22, 0x81, 0x01, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, - 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x28, 0x0a, 0x04, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x32, 0xfc, 0x1a, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x53, - 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, - 0x12, 0x11, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, - 0x69, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x7d, 0x12, 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, - 0x12, 0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x53, 0x79, - 0x6e, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, - 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x81, 0x01, - 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, - 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, - 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x75, 0x62, 0x5f, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, - 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x2f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x90, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, - 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, - 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x22, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x30, 0x22, 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, - 0x64, 0x65, 0x7d, 0x12, 0x5b, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x12, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x61, 0x64, 0x64, - 0x12, 0x61, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x12, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x87, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62, - 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, + 0x49, 0x64, 0x22, 0x89, 0x01, 0x0a, 0x0f, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x75, + 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x0b, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6e, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x70, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x73, 0x72, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x73, 0x73, 0x72, 0x63, 0x22, 0x4c, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x24, 0x0a, + 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x49, 0x64, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0x6f, 0x0a, 0x11, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x74, 0x0a, 0x08, 0x53, 0x53, 0x52, 0x43, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x73, 0x72, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x73, 0x72, 0x63, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x53, 0x53, + 0x52, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x53, 0x52, 0x43, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe4, 0x09, 0x0a, + 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x47, + 0x42, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x47, 0x42, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x47, + 0x42, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x47, 0x42, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x47, 0x42, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x47, 0x42, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6b, 0x65, 0x65, 0x70, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, 0x72, 0x61, + 0x63, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x74, 0x7a, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x70, 0x74, 0x7a, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x74, 0x63, 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x72, 0x74, 0x63, + 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, + 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x61, + 0x72, 0x6d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x12, 0x38, 0x0a, 0x17, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, + 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, + 0x1e, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x61, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x73, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x73, + 0x65, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x70, 0x18, 0x1c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x70, 0x12, + 0x28, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x50, 0x75, 0x73, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x50, 0x75, + 0x73, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x61, 0x74, + 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, + 0x69, 0x74, 0x68, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, + 0x74, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x61, 0x74, 0x61, 0x6c, + 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x57, 0x69, 0x74, 0x68, 0x52, + 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x69, 0x76, 0x69, 0x6c, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, + 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x57, 0x61, 0x79, 0x18, 0x25, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x63, 0x79, 0x18, 0x26, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x63, 0x79, 0x22, 0x24, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x27, 0x0a, 0x15, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x6e, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x6a, 0x0a, 0x10, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x81, + 0x01, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x61, 0x67, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x04, 0x6c, 0x69, + 0x73, 0x74, 0x32, 0x84, 0x1c, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x53, 0x0a, 0x04, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x6e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, + 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, + 0x66, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1d, 0x2e, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x16, 0x12, 0x14, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x7d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x61, 0x67, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x71, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, + 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x81, 0x01, 0x0a, 0x0c, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7b, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x12, - 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x67, 0x62, - 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x2f, - 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x62, - 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, - 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x8a, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, - 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, - 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, - 0x71, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, - 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, - 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x12, - 0x17, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, - 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x08, 0x53, 0x74, - 0x6f, 0x70, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, - 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2f, 0x12, 0x2d, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, - 0x12, 0x74, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, - 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x94, 0x01, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, + 0x74, 0x53, 0x75, 0x62, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x67, 0x62, 0x32, 0x38, + 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, + 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x6e, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75, + 0x64, 0x69, 0x6f, 0x12, 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, + 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x61, + 0x75, 0x64, 0x69, 0x6f, 0x12, 0x90, 0x01, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x13, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x25, 0x22, 0x23, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, - 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, - 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x22, 0x32, - 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, - 0x79, 0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x64, 0x7d, 0x12, 0x88, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x42, 0x72, 0x6f, 0x61, 0x64, - 0x63, 0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, - 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x36, 0x3a, 0x01, 0x2a, 0x22, 0x31, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x22, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x22, + 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x7d, 0x12, + 0x5b, 0x0a, 0x09, 0x41, 0x64, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, + 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x61, 0x64, 0x64, 0x12, 0x61, 0x0a, 0x0c, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, + 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x87, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, + 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x7b, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x12, 0x21, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, + 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6c, 0x61, 0x72, 0x6d, 0x2f, 0x7b, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0x76, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, + 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x62, 0x32, 0x38, + 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x67, 0x62, 0x32, 0x38, + 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x2f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x8a, + 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, + 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x28, 0x12, 0x26, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x71, 0x0a, 0x07, 0x47, + 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, - 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x39, 0x22, 0x37, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, - 0x74, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x62, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x53, 0x52, 0x43, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, - 0x2e, 0x53, 0x53, 0x52, 0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x73, 0x72, - 0x63, 0x12, 0x68, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, - 0x6f, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1a, 0x12, 0x18, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x2f, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0b, 0x41, - 0x64, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, - 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, - 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x61, 0x64, 0x64, - 0x12, 0x6f, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, - 0x1e, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, + 0x53, 0x6e, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x76, + 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, + 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, + 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x08, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6c, + 0x61, 0x79, 0x12, 0x17, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, + 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, + 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, + 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x0b, + 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x23, 0x2f, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, + 0x2f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x6b, 0x65, + 0x79, 0x7d, 0x12, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x72, 0x6f, 0x61, + 0x64, 0x63, 0x61, 0x73, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, + 0x72, 0x6f, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x22, 0x32, 0x2f, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x88, + 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, + 0x12, 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x72, + 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, + 0x22, 0x37, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x6c, 0x61, 0x79, 0x2f, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x2f, 0x73, 0x74, + 0x6f, 0x70, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x12, 0x62, 0x0a, 0x0a, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x53, 0x53, 0x52, 0x43, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1c, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x53, 0x53, 0x52, + 0x43, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x2f, 0x73, 0x73, 0x72, 0x63, 0x12, 0x68, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x20, + 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x61, 0x77, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x2f, 0x72, 0x61, 0x77, 0x12, 0x63, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, + 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, + 0x2a, 0x22, 0x19, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x61, 0x64, 0x64, 0x12, 0x6f, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1e, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x62, + 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x69, 0x0a, + 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, + 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, + 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x71, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x21, 0x2e, 0x67, 0x62, 0x32, + 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x2a, + 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x0d, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x20, 0x2e, 0x67, + 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x12, 0x69, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x14, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, - 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x71, 0x0a, 0x0e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x21, - 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x42, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x1c, 0x2a, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, - 0x74, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, - 0x12, 0x20, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x22, 0x5a, 0x20, 0x6d, 0x37, 0x73, 0x2e, 0x6c, 0x69, 0x76, - 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x67, 0x62, 0x32, 0x38, - 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x85, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x62, + 0x61, 0x63, 0x6b, 0x12, 0x1b, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, + 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2e, 0x50, 0x6c, + 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x6c, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x7d, 0x42, 0x22, 0x5a, 0x20, 0x6d, 0x37, 0x73, + 0x2e, 0x6c, 0x69, 0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, + 0x67, 0x62, 0x32, 0x38, 0x31, 0x38, 0x31, 0x70, 0x72, 0x6f, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -3758,7 +3851,7 @@ func file_gb28181_proto_rawDescGZIP() []byte { return file_gb28181_proto_rawDescData } -var file_gb28181_proto_msgTypes = make([]protoimpl.MessageInfo, 44) +var file_gb28181_proto_msgTypes = make([]protoimpl.MessageInfo, 45) var file_gb28181_proto_goTypes = []any{ (*BaseResponse)(nil), // 0: gb28181pro.BaseResponse (*GetDeviceRequest)(nil), // 1: gb28181pro.GetDeviceRequest @@ -3790,41 +3883,42 @@ var file_gb28181_proto_goTypes = []any{ (*DeviceResponse)(nil), // 27: gb28181pro.DeviceResponse (*ChannelResponse)(nil), // 28: gb28181pro.ChannelResponse (*PlayRequest)(nil), // 29: gb28181pro.PlayRequest - (*PlayResponse)(nil), // 30: gb28181pro.PlayResponse - (*StreamInfo)(nil), // 31: gb28181pro.StreamInfo - (*ConvertStopRequest)(nil), // 32: gb28181pro.ConvertStopRequest - (*BroadcastRequest)(nil), // 33: gb28181pro.BroadcastRequest - (*BroadcastResponse)(nil), // 34: gb28181pro.BroadcastResponse - (*SSRCInfo)(nil), // 35: gb28181pro.SSRCInfo - (*SSRCListResponse)(nil), // 36: gb28181pro.SSRCListResponse - (*Platform)(nil), // 37: gb28181pro.Platform - (*GetPlatformRequest)(nil), // 38: gb28181pro.GetPlatformRequest - (*DeletePlatformRequest)(nil), // 39: gb28181pro.DeletePlatformRequest - (*ListPlatformsRequest)(nil), // 40: gb28181pro.ListPlatformsRequest - (*PlatformResponse)(nil), // 41: gb28181pro.PlatformResponse - (*PlatformsPageInfo)(nil), // 42: gb28181pro.PlatformsPageInfo - nil, // 43: gb28181pro.SubscribeInfoResponse.DialogStateEntry - (*timestamppb.Timestamp)(nil), // 44: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 45: google.protobuf.Empty + (*PlaybackRequest)(nil), // 30: gb28181pro.PlaybackRequest + (*PlayResponse)(nil), // 31: gb28181pro.PlayResponse + (*StreamInfo)(nil), // 32: gb28181pro.StreamInfo + (*ConvertStopRequest)(nil), // 33: gb28181pro.ConvertStopRequest + (*BroadcastRequest)(nil), // 34: gb28181pro.BroadcastRequest + (*BroadcastResponse)(nil), // 35: gb28181pro.BroadcastResponse + (*SSRCInfo)(nil), // 36: gb28181pro.SSRCInfo + (*SSRCListResponse)(nil), // 37: gb28181pro.SSRCListResponse + (*Platform)(nil), // 38: gb28181pro.Platform + (*GetPlatformRequest)(nil), // 39: gb28181pro.GetPlatformRequest + (*DeletePlatformRequest)(nil), // 40: gb28181pro.DeletePlatformRequest + (*ListPlatformsRequest)(nil), // 41: gb28181pro.ListPlatformsRequest + (*PlatformResponse)(nil), // 42: gb28181pro.PlatformResponse + (*PlatformsPageInfo)(nil), // 43: gb28181pro.PlatformsPageInfo + nil, // 44: gb28181pro.SubscribeInfoResponse.DialogStateEntry + (*timestamppb.Timestamp)(nil), // 45: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 46: google.protobuf.Empty } var file_gb28181_proto_depIdxs = []int32{ 12, // 0: gb28181pro.DevicesPageInfo.list:type_name -> gb28181pro.Device 11, // 1: gb28181pro.ChannelsPageInfo.list:type_name -> gb28181pro.Channel - 44, // 2: gb28181pro.Channel.gpsTime:type_name -> google.protobuf.Timestamp - 44, // 3: gb28181pro.Device.gpsTime:type_name -> google.protobuf.Timestamp - 44, // 4: gb28181pro.Device.registerTime:type_name -> google.protobuf.Timestamp - 44, // 5: gb28181pro.Device.updateTime:type_name -> google.protobuf.Timestamp + 45, // 2: gb28181pro.Channel.gpsTime:type_name -> google.protobuf.Timestamp + 45, // 3: gb28181pro.Device.gpsTime:type_name -> google.protobuf.Timestamp + 45, // 4: gb28181pro.Device.registerTime:type_name -> google.protobuf.Timestamp + 45, // 5: gb28181pro.Device.updateTime:type_name -> google.protobuf.Timestamp 11, // 6: gb28181pro.Device.channels:type_name -> gb28181pro.Channel 12, // 7: gb28181pro.ResponseList.data:type_name -> gb28181pro.Device 20, // 8: gb28181pro.DeviceAlarmResponse.alarms:type_name -> gb28181pro.AlarmInfo - 43, // 9: gb28181pro.SubscribeInfoResponse.dialogState:type_name -> gb28181pro.SubscribeInfoResponse.DialogStateEntry + 44, // 9: gb28181pro.SubscribeInfoResponse.dialogState:type_name -> gb28181pro.SubscribeInfoResponse.DialogStateEntry 12, // 10: gb28181pro.DeviceResponse.data:type_name -> gb28181pro.Device 11, // 11: gb28181pro.ChannelResponse.data:type_name -> gb28181pro.Channel - 31, // 12: gb28181pro.PlayResponse.stream_info:type_name -> gb28181pro.StreamInfo - 35, // 13: gb28181pro.SSRCListResponse.data:type_name -> gb28181pro.SSRCInfo - 37, // 14: gb28181pro.PlatformResponse.data:type_name -> gb28181pro.Platform - 37, // 15: gb28181pro.PlatformsPageInfo.list:type_name -> gb28181pro.Platform - 45, // 16: gb28181pro.api.List:input_type -> google.protobuf.Empty + 32, // 12: gb28181pro.PlayResponse.stream_info:type_name -> gb28181pro.StreamInfo + 36, // 13: gb28181pro.SSRCListResponse.data:type_name -> gb28181pro.SSRCInfo + 38, // 14: gb28181pro.PlatformResponse.data:type_name -> gb28181pro.Platform + 38, // 15: gb28181pro.PlatformsPageInfo.list:type_name -> gb28181pro.Platform + 46, // 16: gb28181pro.api.List:input_type -> google.protobuf.Empty 1, // 17: gb28181pro.api.GetDevice:input_type -> gb28181pro.GetDeviceRequest 2, // 18: gb28181pro.api.GetDevices:input_type -> gb28181pro.GetDevicesRequest 4, // 19: gb28181pro.api.GetChannels:input_type -> gb28181pro.GetChannelsRequest @@ -3843,47 +3937,49 @@ var file_gb28181_proto_depIdxs = []int32{ 24, // 32: gb28181pro.api.GetSnap:input_type -> gb28181pro.GetSnapRequest 29, // 33: gb28181pro.api.StartPlay:input_type -> gb28181pro.PlayRequest 29, // 34: gb28181pro.api.StopPlay:input_type -> gb28181pro.PlayRequest - 32, // 35: gb28181pro.api.StopConvert:input_type -> gb28181pro.ConvertStopRequest - 33, // 36: gb28181pro.api.StartBroadcast:input_type -> gb28181pro.BroadcastRequest - 33, // 37: gb28181pro.api.StopBroadcast:input_type -> gb28181pro.BroadcastRequest - 45, // 38: gb28181pro.api.GetAllSSRC:input_type -> google.protobuf.Empty + 33, // 35: gb28181pro.api.StopConvert:input_type -> gb28181pro.ConvertStopRequest + 34, // 36: gb28181pro.api.StartBroadcast:input_type -> gb28181pro.BroadcastRequest + 34, // 37: gb28181pro.api.StopBroadcast:input_type -> gb28181pro.BroadcastRequest + 46, // 38: gb28181pro.api.GetAllSSRC:input_type -> google.protobuf.Empty 26, // 39: gb28181pro.api.GetRawChannel:input_type -> gb28181pro.GetRawChannelRequest - 37, // 40: gb28181pro.api.AddPlatform:input_type -> gb28181pro.Platform - 38, // 41: gb28181pro.api.GetPlatform:input_type -> gb28181pro.GetPlatformRequest - 37, // 42: gb28181pro.api.UpdatePlatform:input_type -> gb28181pro.Platform - 39, // 43: gb28181pro.api.DeletePlatform:input_type -> gb28181pro.DeletePlatformRequest - 40, // 44: gb28181pro.api.ListPlatforms:input_type -> gb28181pro.ListPlatformsRequest - 13, // 45: gb28181pro.api.List:output_type -> gb28181pro.ResponseList - 27, // 46: gb28181pro.api.GetDevice:output_type -> gb28181pro.DeviceResponse - 3, // 47: gb28181pro.api.GetDevices:output_type -> gb28181pro.DevicesPageInfo - 5, // 48: gb28181pro.api.GetChannels:output_type -> gb28181pro.ChannelsPageInfo - 7, // 49: gb28181pro.api.SyncDevice:output_type -> gb28181pro.SyncStatus - 9, // 50: gb28181pro.api.DeleteDevice:output_type -> gb28181pro.DeleteDeviceResponse - 5, // 51: gb28181pro.api.GetSubChannels:output_type -> gb28181pro.ChannelsPageInfo - 0, // 52: gb28181pro.api.ChangeAudio:output_type -> gb28181pro.BaseResponse - 0, // 53: gb28181pro.api.UpdateChannelStreamIdentification:output_type -> gb28181pro.BaseResponse - 45, // 54: gb28181pro.api.UpdateTransport:output_type -> google.protobuf.Empty - 45, // 55: gb28181pro.api.AddDevice:output_type -> google.protobuf.Empty - 45, // 56: gb28181pro.api.UpdateDevice:output_type -> google.protobuf.Empty - 17, // 57: gb28181pro.api.GetDeviceStatus:output_type -> gb28181pro.DeviceStatusResponse - 19, // 58: gb28181pro.api.GetDeviceAlarm:output_type -> gb28181pro.DeviceAlarmResponse - 7, // 59: gb28181pro.api.GetSyncStatus:output_type -> gb28181pro.SyncStatus - 23, // 60: gb28181pro.api.GetSubscribeInfo:output_type -> gb28181pro.SubscribeInfoResponse - 25, // 61: gb28181pro.api.GetSnap:output_type -> gb28181pro.SnapResponse - 30, // 62: gb28181pro.api.StartPlay:output_type -> gb28181pro.PlayResponse - 30, // 63: gb28181pro.api.StopPlay:output_type -> gb28181pro.PlayResponse - 0, // 64: gb28181pro.api.StopConvert:output_type -> gb28181pro.BaseResponse - 34, // 65: gb28181pro.api.StartBroadcast:output_type -> gb28181pro.BroadcastResponse - 0, // 66: gb28181pro.api.StopBroadcast:output_type -> gb28181pro.BaseResponse - 36, // 67: gb28181pro.api.GetAllSSRC:output_type -> gb28181pro.SSRCListResponse - 11, // 68: gb28181pro.api.GetRawChannel:output_type -> gb28181pro.Channel - 0, // 69: gb28181pro.api.AddPlatform:output_type -> gb28181pro.BaseResponse - 41, // 70: gb28181pro.api.GetPlatform:output_type -> gb28181pro.PlatformResponse - 0, // 71: gb28181pro.api.UpdatePlatform:output_type -> gb28181pro.BaseResponse - 0, // 72: gb28181pro.api.DeletePlatform:output_type -> gb28181pro.BaseResponse - 42, // 73: gb28181pro.api.ListPlatforms:output_type -> gb28181pro.PlatformsPageInfo - 45, // [45:74] is the sub-list for method output_type - 16, // [16:45] is the sub-list for method input_type + 38, // 40: gb28181pro.api.AddPlatform:input_type -> gb28181pro.Platform + 39, // 41: gb28181pro.api.GetPlatform:input_type -> gb28181pro.GetPlatformRequest + 38, // 42: gb28181pro.api.UpdatePlatform:input_type -> gb28181pro.Platform + 40, // 43: gb28181pro.api.DeletePlatform:input_type -> gb28181pro.DeletePlatformRequest + 41, // 44: gb28181pro.api.ListPlatforms:input_type -> gb28181pro.ListPlatformsRequest + 30, // 45: gb28181pro.api.StartPlayback:input_type -> gb28181pro.PlaybackRequest + 13, // 46: gb28181pro.api.List:output_type -> gb28181pro.ResponseList + 27, // 47: gb28181pro.api.GetDevice:output_type -> gb28181pro.DeviceResponse + 3, // 48: gb28181pro.api.GetDevices:output_type -> gb28181pro.DevicesPageInfo + 5, // 49: gb28181pro.api.GetChannels:output_type -> gb28181pro.ChannelsPageInfo + 7, // 50: gb28181pro.api.SyncDevice:output_type -> gb28181pro.SyncStatus + 9, // 51: gb28181pro.api.DeleteDevice:output_type -> gb28181pro.DeleteDeviceResponse + 5, // 52: gb28181pro.api.GetSubChannels:output_type -> gb28181pro.ChannelsPageInfo + 0, // 53: gb28181pro.api.ChangeAudio:output_type -> gb28181pro.BaseResponse + 0, // 54: gb28181pro.api.UpdateChannelStreamIdentification:output_type -> gb28181pro.BaseResponse + 46, // 55: gb28181pro.api.UpdateTransport:output_type -> google.protobuf.Empty + 46, // 56: gb28181pro.api.AddDevice:output_type -> google.protobuf.Empty + 46, // 57: gb28181pro.api.UpdateDevice:output_type -> google.protobuf.Empty + 17, // 58: gb28181pro.api.GetDeviceStatus:output_type -> gb28181pro.DeviceStatusResponse + 19, // 59: gb28181pro.api.GetDeviceAlarm:output_type -> gb28181pro.DeviceAlarmResponse + 7, // 60: gb28181pro.api.GetSyncStatus:output_type -> gb28181pro.SyncStatus + 23, // 61: gb28181pro.api.GetSubscribeInfo:output_type -> gb28181pro.SubscribeInfoResponse + 25, // 62: gb28181pro.api.GetSnap:output_type -> gb28181pro.SnapResponse + 31, // 63: gb28181pro.api.StartPlay:output_type -> gb28181pro.PlayResponse + 31, // 64: gb28181pro.api.StopPlay:output_type -> gb28181pro.PlayResponse + 0, // 65: gb28181pro.api.StopConvert:output_type -> gb28181pro.BaseResponse + 35, // 66: gb28181pro.api.StartBroadcast:output_type -> gb28181pro.BroadcastResponse + 0, // 67: gb28181pro.api.StopBroadcast:output_type -> gb28181pro.BaseResponse + 37, // 68: gb28181pro.api.GetAllSSRC:output_type -> gb28181pro.SSRCListResponse + 11, // 69: gb28181pro.api.GetRawChannel:output_type -> gb28181pro.Channel + 0, // 70: gb28181pro.api.AddPlatform:output_type -> gb28181pro.BaseResponse + 42, // 71: gb28181pro.api.GetPlatform:output_type -> gb28181pro.PlatformResponse + 0, // 72: gb28181pro.api.UpdatePlatform:output_type -> gb28181pro.BaseResponse + 0, // 73: gb28181pro.api.DeletePlatform:output_type -> gb28181pro.BaseResponse + 43, // 74: gb28181pro.api.ListPlatforms:output_type -> gb28181pro.PlatformsPageInfo + 31, // 75: gb28181pro.api.StartPlayback:output_type -> gb28181pro.PlayResponse + 46, // [46:76] is the sub-list for method output_type + 16, // [16:46] is the sub-list for method input_type 16, // [16:16] is the sub-list for extension type_name 16, // [16:16] is the sub-list for extension extendee 0, // [0:16] is the sub-list for field type_name @@ -3900,7 +3996,7 @@ func file_gb28181_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_gb28181_proto_rawDesc), len(file_gb28181_proto_rawDesc)), NumEnums: 0, - NumMessages: 44, + NumMessages: 45, NumExtensions: 0, NumServices: 1, }, diff --git a/plugin/gb28181pro/pb/gb28181.pb.gw.go b/plugin/gb28181pro/pb/gb28181.pb.gw.go index 4ed6efe..ab39c07 100644 --- a/plugin/gb28181pro/pb/gb28181.pb.gw.go +++ b/plugin/gb28181pro/pb/gb28181.pb.gw.go @@ -1534,6 +1534,86 @@ func local_request_Api_ListPlatforms_0(ctx context.Context, marshaler runtime.Ma } +func request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PlaybackRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["deviceId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId") + } + + protoReq.DeviceId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err) + } + + val, ok = pathParams["channelId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channelId") + } + + protoReq.ChannelId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err) + } + + msg, err := client.StartPlayback(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Api_StartPlayback_0(ctx context.Context, marshaler runtime.Marshaler, server ApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PlaybackRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["deviceId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "deviceId") + } + + protoReq.DeviceId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "deviceId", err) + } + + val, ok = pathParams["channelId"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channelId") + } + + protoReq.ChannelId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channelId", err) + } + + msg, err := server.StartPlayback(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterApiHandlerServer registers the http handlers for service Api to "mux". // UnaryRPC :call ApiServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2266,6 +2346,31 @@ func RegisterApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) + mux.Handle("POST", pattern_Api_StartPlayback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/gb28181pro.Api/StartPlayback", runtime.WithHTTPPathPattern("/gb28181/api/playback/start/{deviceId}/{channelId}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Api_StartPlayback_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_StartPlayback_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -2945,6 +3050,28 @@ func RegisterApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_Api_StartPlayback_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/gb28181pro.Api/StartPlayback", runtime.WithHTTPPathPattern("/gb28181/api/playback/start/{deviceId}/{channelId}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Api_StartPlayback_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_StartPlayback_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -3006,6 +3133,8 @@ var ( pattern_Api_DeletePlatform_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"gb28181", "api", "platform", "id"}, "")) pattern_Api_ListPlatforms_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"gb28181", "api", "platform", "list"}, "")) + + pattern_Api_StartPlayback_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5}, []string{"gb28181", "api", "playback", "start", "deviceId", "channelId"}, "")) ) var ( @@ -3066,4 +3195,6 @@ var ( forward_Api_DeletePlatform_0 = runtime.ForwardResponseMessage forward_Api_ListPlatforms_0 = runtime.ForwardResponseMessage + + forward_Api_StartPlayback_0 = runtime.ForwardResponseMessage ) diff --git a/plugin/gb28181pro/pb/gb28181.proto b/plugin/gb28181pro/pb/gb28181.proto index 6e8151d..da423a8 100644 --- a/plugin/gb28181pro/pb/gb28181.proto +++ b/plugin/gb28181pro/pb/gb28181.proto @@ -221,6 +221,13 @@ service api { get: "/gb28181/api/platform/list" }; } + + // 开始回放 + rpc StartPlayback (PlaybackRequest) returns (PlayResponse) { + option (google.api.http) = { + post: "/gb28181/api/playback/start/{deviceId}/{channelId}" + }; + } } // 请求和响应消息定义 @@ -424,6 +431,14 @@ message PlayRequest { string channelId = 2; } +message PlaybackRequest { + string deviceId = 1; + string channelId = 2; + string start = 3; // 开始时间 + string end = 4; // 结束时间 + string range = 5; // 时间范围,可选 +} + message PlayResponse { int32 code = 1; string message = 2; diff --git a/plugin/gb28181pro/pb/gb28181_grpc.pb.go b/plugin/gb28181pro/pb/gb28181_grpc.pb.go index 8d74f26..f5eab69 100644 --- a/plugin/gb28181pro/pb/gb28181_grpc.pb.go +++ b/plugin/gb28181pro/pb/gb28181_grpc.pb.go @@ -51,6 +51,7 @@ const ( Api_UpdatePlatform_FullMethodName = "/gb28181pro.api/UpdatePlatform" Api_DeletePlatform_FullMethodName = "/gb28181pro.api/DeletePlatform" Api_ListPlatforms_FullMethodName = "/gb28181pro.api/ListPlatforms" + Api_StartPlayback_FullMethodName = "/gb28181pro.api/StartPlayback" ) // ApiClient is the client API for Api service. @@ -115,6 +116,8 @@ type ApiClient interface { DeletePlatform(ctx context.Context, in *DeletePlatformRequest, opts ...grpc.CallOption) (*BaseResponse, error) // 获取平台列表 ListPlatforms(ctx context.Context, in *ListPlatformsRequest, opts ...grpc.CallOption) (*PlatformsPageInfo, error) + // 开始回放 + StartPlayback(ctx context.Context, in *PlaybackRequest, opts ...grpc.CallOption) (*PlayResponse, error) } type apiClient struct { @@ -415,6 +418,16 @@ func (c *apiClient) ListPlatforms(ctx context.Context, in *ListPlatformsRequest, return out, nil } +func (c *apiClient) StartPlayback(ctx context.Context, in *PlaybackRequest, opts ...grpc.CallOption) (*PlayResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PlayResponse) + err := c.cc.Invoke(ctx, Api_StartPlayback_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApiServer is the server API for Api service. // All implementations must embed UnimplementedApiServer // for forward compatibility. @@ -477,6 +490,8 @@ type ApiServer interface { DeletePlatform(context.Context, *DeletePlatformRequest) (*BaseResponse, error) // 获取平台列表 ListPlatforms(context.Context, *ListPlatformsRequest) (*PlatformsPageInfo, error) + // 开始回放 + StartPlayback(context.Context, *PlaybackRequest) (*PlayResponse, error) mustEmbedUnimplementedApiServer() } @@ -574,6 +589,9 @@ func (UnimplementedApiServer) DeletePlatform(context.Context, *DeletePlatformReq func (UnimplementedApiServer) ListPlatforms(context.Context, *ListPlatformsRequest) (*PlatformsPageInfo, error) { return nil, status.Errorf(codes.Unimplemented, "method ListPlatforms not implemented") } +func (UnimplementedApiServer) StartPlayback(context.Context, *PlaybackRequest) (*PlayResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartPlayback not implemented") +} func (UnimplementedApiServer) mustEmbedUnimplementedApiServer() {} func (UnimplementedApiServer) testEmbeddedByValue() {} @@ -1117,6 +1135,24 @@ func _Api_ListPlatforms_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Api_StartPlayback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PlaybackRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApiServer).StartPlayback(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Api_StartPlayback_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApiServer).StartPlayback(ctx, req.(*PlaybackRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Api_ServiceDesc is the grpc.ServiceDesc for Api service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1240,6 +1276,10 @@ var Api_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListPlatforms", Handler: _Api_ListPlatforms_Handler, }, + { + MethodName: "StartPlayback", + Handler: _Api_StartPlayback_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "gb28181.proto",