From 683902cf1101e9207623349cf8c97534c6f8a08c Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Mon, 26 Feb 2024 01:17:34 +0100 Subject: [PATCH] no ios notifications (#313) * removed all reminents of the ios notifications * removed the ios methods from the protofile --- server/api/tumdev/campus_backend.pb.go | 2193 ++++++++--------- server/api/tumdev/campus_backend.pb.gw.go | 77 - server/api/tumdev/campus_backend.proto | 16 - server/api/tumdev/campus_backend.swagger.json | 53 - server/api/tumdev/campus_backend_grpc.pb.go | 39 - server/backend/campus_api/campus_api.go | 58 - server/backend/cron/cronjobs.go | 35 +- server/backend/cron/ios_notifications.go | 30 - server/backend/cron/new_exam_results_hook.go | 15 - server/backend/device.go | 6 +- server/backend/ios_notifications.go | 40 - .../ios_notifications/apns/jwt_token.go | 139 -- .../ios_notifications/apns/repository.go | 117 - .../backend/ios_notifications/apns/service.go | 69 - .../crypto/encrypted_string.go | 122 - .../ios_notifications/device/repository.go | 108 - .../ios_notifications/device/service.go | 57 - .../devices_activity_reset/repository.go | 116 - .../devices_activity_reset/service.go | 86 - .../request_response/repository.go | 59 - .../request_response/service.go | 206 -- .../scheduled_update_log/repository.go | 28 - .../ios_notifications/scheduling/service.go | 145 -- server/backend/migration/20240207000000.go | 138 ++ server/backend/migration/migration.go | 9 +- .../scheduling/repository.go | 40 - .../scheduling/service.go | 91 - .../subscriber/repository.go | 55 - .../subscriber/service.go | 32 - server/backend/rpcserver.go | 36 +- server/go.mod | 1 - server/go.sum | 1 - server/model/ios_device.go | 23 - server/model/ios_device_last_updated.go | 24 - server/model/ios_device_request_log.go | 20 - server/model/ios_devices_activity_reset.go | 15 - server/model/ios_grade.go | 100 - server/model/ios_remote_notification.go | 159 -- server/model/ios_scheduled_update_log.go | 28 - server/model/published_exam_result.go | 58 - 40 files changed, 1177 insertions(+), 3467 deletions(-) delete mode 100644 server/backend/campus_api/campus_api.go delete mode 100644 server/backend/cron/ios_notifications.go delete mode 100644 server/backend/cron/new_exam_results_hook.go delete mode 100644 server/backend/ios_notifications.go delete mode 100644 server/backend/ios_notifications/apns/jwt_token.go delete mode 100644 server/backend/ios_notifications/apns/repository.go delete mode 100644 server/backend/ios_notifications/apns/service.go delete mode 100644 server/backend/ios_notifications/crypto/encrypted_string.go delete mode 100644 server/backend/ios_notifications/device/repository.go delete mode 100644 server/backend/ios_notifications/device/service.go delete mode 100644 server/backend/ios_notifications/devices_activity_reset/repository.go delete mode 100644 server/backend/ios_notifications/devices_activity_reset/service.go delete mode 100644 server/backend/ios_notifications/request_response/repository.go delete mode 100644 server/backend/ios_notifications/request_response/service.go delete mode 100644 server/backend/ios_notifications/scheduled_update_log/repository.go delete mode 100644 server/backend/ios_notifications/scheduling/service.go create mode 100644 server/backend/migration/20240207000000.go delete mode 100644 server/backend/new_exam_results_hook/scheduling/repository.go delete mode 100644 server/backend/new_exam_results_hook/scheduling/service.go delete mode 100644 server/backend/new_exam_results_hook/subscriber/repository.go delete mode 100644 server/backend/new_exam_results_hook/subscriber/service.go delete mode 100644 server/model/ios_device.go delete mode 100644 server/model/ios_device_last_updated.go delete mode 100644 server/model/ios_device_request_log.go delete mode 100644 server/model/ios_devices_activity_reset.go delete mode 100644 server/model/ios_grade.go delete mode 100644 server/model/ios_remote_notification.go delete mode 100644 server/model/ios_scheduled_update_log.go delete mode 100644 server/model/published_exam_result.go diff --git a/server/api/tumdev/campus_backend.pb.go b/server/api/tumdev/campus_backend.pb.go index 466b672d..290c2a8a 100644 --- a/server/api/tumdev/campus_backend.pb.go +++ b/server/api/tumdev/campus_backend.pb.go @@ -117,7 +117,7 @@ func (x CreateFeedbackRequest_Recipient) Number() protoreflect.EnumNumber { // Deprecated: Use CreateFeedbackRequest_Recipient.Descriptor instead. func (CreateFeedbackRequest_Recipient) EnumDescriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53, 0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51, 0} } type CreateDeviceRequest struct { @@ -332,108 +332,6 @@ func (x *DeleteDeviceReply) GetDeviceId() string { return "" } -type IOSDeviceRequestResponseRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` - Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` -} - -func (x *IOSDeviceRequestResponseRequest) Reset() { - *x = IOSDeviceRequestResponseRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IOSDeviceRequestResponseRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IOSDeviceRequestResponseRequest) ProtoMessage() {} - -func (x *IOSDeviceRequestResponseRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IOSDeviceRequestResponseRequest.ProtoReflect.Descriptor instead. -func (*IOSDeviceRequestResponseRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{4} -} - -func (x *IOSDeviceRequestResponseRequest) GetRequestId() string { - if x != nil { - return x.RequestId - } - return "" -} - -func (x *IOSDeviceRequestResponseRequest) GetPayload() string { - if x != nil { - return x.Payload - } - return "" -} - -type IOSDeviceRequestResponseReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *IOSDeviceRequestResponseReply) Reset() { - *x = IOSDeviceRequestResponseReply{} - if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IOSDeviceRequestResponseReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IOSDeviceRequestResponseReply) ProtoMessage() {} - -func (x *IOSDeviceRequestResponseReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IOSDeviceRequestResponseReply.ProtoReflect.Descriptor instead. -func (*IOSDeviceRequestResponseReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{5} -} - -func (x *IOSDeviceRequestResponseReply) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - type News struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -460,7 +358,7 @@ type News struct { func (x *News) Reset() { *x = News{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[6] + mi := &file_tumdev_campus_backend_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -473,7 +371,7 @@ func (x *News) String() string { func (*News) ProtoMessage() {} func (x *News) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[6] + mi := &file_tumdev_campus_backend_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -486,7 +384,7 @@ func (x *News) ProtoReflect() protoreflect.Message { // Deprecated: Use News.ProtoReflect.Descriptor instead. func (*News) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{6} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{4} } func (x *News) GetId() int64 { @@ -570,7 +468,7 @@ type ListNewsReply struct { func (x *ListNewsReply) Reset() { *x = ListNewsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[7] + mi := &file_tumdev_campus_backend_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -583,7 +481,7 @@ func (x *ListNewsReply) String() string { func (*ListNewsReply) ProtoMessage() {} func (x *ListNewsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[7] + mi := &file_tumdev_campus_backend_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -596,7 +494,7 @@ func (x *ListNewsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsReply.ProtoReflect.Descriptor instead. func (*ListNewsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{5} } func (x *ListNewsReply) GetNews() []*News { @@ -622,7 +520,7 @@ type ListNewsRequest struct { func (x *ListNewsRequest) Reset() { *x = ListNewsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[8] + mi := &file_tumdev_campus_backend_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -635,7 +533,7 @@ func (x *ListNewsRequest) String() string { func (*ListNewsRequest) ProtoMessage() {} func (x *ListNewsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[8] + mi := &file_tumdev_campus_backend_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -648,7 +546,7 @@ func (x *ListNewsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsRequest.ProtoReflect.Descriptor instead. func (*ListNewsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{8} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{6} } func (x *ListNewsRequest) GetLastNewsId() int32 { @@ -681,7 +579,7 @@ type ListNewsSourcesRequest struct { func (x *ListNewsSourcesRequest) Reset() { *x = ListNewsSourcesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[9] + mi := &file_tumdev_campus_backend_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -694,7 +592,7 @@ func (x *ListNewsSourcesRequest) String() string { func (*ListNewsSourcesRequest) ProtoMessage() {} func (x *ListNewsSourcesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[9] + mi := &file_tumdev_campus_backend_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -707,7 +605,7 @@ func (x *ListNewsSourcesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsSourcesRequest.ProtoReflect.Descriptor instead. func (*ListNewsSourcesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{9} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7} } type ListNewsSourcesReply struct { @@ -721,7 +619,7 @@ type ListNewsSourcesReply struct { func (x *ListNewsSourcesReply) Reset() { *x = ListNewsSourcesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[10] + mi := &file_tumdev_campus_backend_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -734,7 +632,7 @@ func (x *ListNewsSourcesReply) String() string { func (*ListNewsSourcesReply) ProtoMessage() {} func (x *ListNewsSourcesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[10] + mi := &file_tumdev_campus_backend_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -747,7 +645,7 @@ func (x *ListNewsSourcesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsSourcesReply.ProtoReflect.Descriptor instead. func (*ListNewsSourcesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{10} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{8} } func (x *ListNewsSourcesReply) GetSources() []*NewsSource { @@ -771,7 +669,7 @@ type NewsSource struct { func (x *NewsSource) Reset() { *x = NewsSource{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[11] + mi := &file_tumdev_campus_backend_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -784,7 +682,7 @@ func (x *NewsSource) String() string { func (*NewsSource) ProtoMessage() {} func (x *NewsSource) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[11] + mi := &file_tumdev_campus_backend_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -797,7 +695,7 @@ func (x *NewsSource) ProtoReflect() protoreflect.Message { // Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. func (*NewsSource) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{9} } func (x *NewsSource) GetSource() string { @@ -833,7 +731,7 @@ type ListNewsAlertsRequest struct { func (x *ListNewsAlertsRequest) Reset() { *x = ListNewsAlertsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[12] + mi := &file_tumdev_campus_backend_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -846,7 +744,7 @@ func (x *ListNewsAlertsRequest) String() string { func (*ListNewsAlertsRequest) ProtoMessage() {} func (x *ListNewsAlertsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[12] + mi := &file_tumdev_campus_backend_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -859,7 +757,7 @@ func (x *ListNewsAlertsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsAlertsRequest.ProtoReflect.Descriptor instead. func (*ListNewsAlertsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{12} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{10} } func (x *ListNewsAlertsRequest) GetLastNewsAlertId() int32 { @@ -880,7 +778,7 @@ type ListNewsAlertsReply struct { func (x *ListNewsAlertsReply) Reset() { *x = ListNewsAlertsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[13] + mi := &file_tumdev_campus_backend_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -893,7 +791,7 @@ func (x *ListNewsAlertsReply) String() string { func (*ListNewsAlertsReply) ProtoMessage() {} func (x *ListNewsAlertsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[13] + mi := &file_tumdev_campus_backend_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -906,7 +804,7 @@ func (x *ListNewsAlertsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNewsAlertsReply.ProtoReflect.Descriptor instead. func (*ListNewsAlertsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11} } func (x *ListNewsAlertsReply) GetAlerts() []*NewsAlert { @@ -931,7 +829,7 @@ type NewsAlert struct { func (x *NewsAlert) Reset() { *x = NewsAlert{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[14] + mi := &file_tumdev_campus_backend_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -944,7 +842,7 @@ func (x *NewsAlert) String() string { func (*NewsAlert) ProtoMessage() {} func (x *NewsAlert) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[14] + mi := &file_tumdev_campus_backend_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -957,7 +855,7 @@ func (x *NewsAlert) ProtoReflect() protoreflect.Message { // Deprecated: Use NewsAlert.ProtoReflect.Descriptor instead. func (*NewsAlert) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{14} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{12} } func (x *NewsAlert) GetImageUrl() string { @@ -1013,7 +911,7 @@ type ListCanteenRatingsRequest struct { func (x *ListCanteenRatingsRequest) Reset() { *x = ListCanteenRatingsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[15] + mi := &file_tumdev_campus_backend_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1026,7 +924,7 @@ func (x *ListCanteenRatingsRequest) String() string { func (*ListCanteenRatingsRequest) ProtoMessage() {} func (x *ListCanteenRatingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[15] + mi := &file_tumdev_campus_backend_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1039,7 +937,7 @@ func (x *ListCanteenRatingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCanteenRatingsRequest.ProtoReflect.Descriptor instead. func (*ListCanteenRatingsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{15} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13} } func (x *ListCanteenRatingsRequest) GetCanteenId() string { @@ -1086,7 +984,7 @@ type ListCanteenRatingsReply struct { func (x *ListCanteenRatingsReply) Reset() { *x = ListCanteenRatingsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[16] + mi := &file_tumdev_campus_backend_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1099,7 +997,7 @@ func (x *ListCanteenRatingsReply) String() string { func (*ListCanteenRatingsReply) ProtoMessage() {} func (x *ListCanteenRatingsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[16] + mi := &file_tumdev_campus_backend_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1112,7 +1010,7 @@ func (x *ListCanteenRatingsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCanteenRatingsReply.ProtoReflect.Descriptor instead. func (*ListCanteenRatingsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{16} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{14} } func (x *ListCanteenRatingsReply) GetRating() []*SingleRatingReply { @@ -1177,7 +1075,7 @@ type GetDishRatingsRequest struct { func (x *GetDishRatingsRequest) Reset() { *x = GetDishRatingsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[17] + mi := &file_tumdev_campus_backend_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1088,7 @@ func (x *GetDishRatingsRequest) String() string { func (*GetDishRatingsRequest) ProtoMessage() {} func (x *GetDishRatingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[17] + mi := &file_tumdev_campus_backend_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1101,7 @@ func (x *GetDishRatingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDishRatingsRequest.ProtoReflect.Descriptor instead. func (*GetDishRatingsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{17} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{15} } func (x *GetDishRatingsRequest) GetCanteenId() string { @@ -1263,7 +1161,7 @@ type GetDishRatingsReply struct { func (x *GetDishRatingsReply) Reset() { *x = GetDishRatingsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[18] + mi := &file_tumdev_campus_backend_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1276,7 +1174,7 @@ func (x *GetDishRatingsReply) String() string { func (*GetDishRatingsReply) ProtoMessage() {} func (x *GetDishRatingsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[18] + mi := &file_tumdev_campus_backend_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1289,7 +1187,7 @@ func (x *GetDishRatingsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDishRatingsReply.ProtoReflect.Descriptor instead. func (*GetDishRatingsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{18} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{16} } func (x *GetDishRatingsReply) GetRating() []*SingleRatingReply { @@ -1359,7 +1257,7 @@ type SingleRatingReply struct { func (x *SingleRatingReply) Reset() { *x = SingleRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[19] + mi := &file_tumdev_campus_backend_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1372,7 +1270,7 @@ func (x *SingleRatingReply) String() string { func (*SingleRatingReply) ProtoMessage() {} func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[19] + mi := &file_tumdev_campus_backend_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1385,7 +1283,7 @@ func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. func (*SingleRatingReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{19} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{17} } func (x *SingleRatingReply) GetPoints() int32 { @@ -1432,7 +1330,7 @@ type CreateCanteenRatingReply struct { func (x *CreateCanteenRatingReply) Reset() { *x = CreateCanteenRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[20] + mi := &file_tumdev_campus_backend_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1445,7 +1343,7 @@ func (x *CreateCanteenRatingReply) String() string { func (*CreateCanteenRatingReply) ProtoMessage() {} func (x *CreateCanteenRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[20] + mi := &file_tumdev_campus_backend_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1458,7 +1356,7 @@ func (x *CreateCanteenRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCanteenRatingReply.ProtoReflect.Descriptor instead. func (*CreateCanteenRatingReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{20} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{18} } type CreateCanteenRatingRequest struct { @@ -1479,7 +1377,7 @@ type CreateCanteenRatingRequest struct { func (x *CreateCanteenRatingRequest) Reset() { *x = CreateCanteenRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[21] + mi := &file_tumdev_campus_backend_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1492,7 +1390,7 @@ func (x *CreateCanteenRatingRequest) String() string { func (*CreateCanteenRatingRequest) ProtoMessage() {} func (x *CreateCanteenRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[21] + mi := &file_tumdev_campus_backend_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1505,7 +1403,7 @@ func (x *CreateCanteenRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateCanteenRatingRequest.ProtoReflect.Descriptor instead. func (*CreateCanteenRatingRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{21} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{19} } func (x *CreateCanteenRatingRequest) GetPoints() int32 { @@ -1552,7 +1450,7 @@ type CreateDishRatingReply struct { func (x *CreateDishRatingReply) Reset() { *x = CreateDishRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[22] + mi := &file_tumdev_campus_backend_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1565,7 +1463,7 @@ func (x *CreateDishRatingReply) String() string { func (*CreateDishRatingReply) ProtoMessage() {} func (x *CreateDishRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[22] + mi := &file_tumdev_campus_backend_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1578,7 +1476,7 @@ func (x *CreateDishRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDishRatingReply.ProtoReflect.Descriptor instead. func (*CreateDishRatingReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{22} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{20} } type CreateDishRatingRequest struct { @@ -1603,7 +1501,7 @@ type CreateDishRatingRequest struct { func (x *CreateDishRatingRequest) Reset() { *x = CreateDishRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[23] + mi := &file_tumdev_campus_backend_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1616,7 +1514,7 @@ func (x *CreateDishRatingRequest) String() string { func (*CreateDishRatingRequest) ProtoMessage() {} func (x *CreateDishRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[23] + mi := &file_tumdev_campus_backend_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1629,7 +1527,7 @@ func (x *CreateDishRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateDishRatingRequest.ProtoReflect.Descriptor instead. func (*CreateDishRatingRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{23} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{21} } func (x *CreateDishRatingRequest) GetPoints() int32 { @@ -1683,7 +1581,7 @@ type ListAvailableDishTagsRequest struct { func (x *ListAvailableDishTagsRequest) Reset() { *x = ListAvailableDishTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[24] + mi := &file_tumdev_campus_backend_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1696,7 +1594,7 @@ func (x *ListAvailableDishTagsRequest) String() string { func (*ListAvailableDishTagsRequest) ProtoMessage() {} func (x *ListAvailableDishTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[24] + mi := &file_tumdev_campus_backend_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1709,7 +1607,7 @@ func (x *ListAvailableDishTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAvailableDishTagsRequest.ProtoReflect.Descriptor instead. func (*ListAvailableDishTagsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{24} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{22} } type ListAvailableDishTagsReply struct { @@ -1723,7 +1621,7 @@ type ListAvailableDishTagsReply struct { func (x *ListAvailableDishTagsReply) Reset() { *x = ListAvailableDishTagsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[25] + mi := &file_tumdev_campus_backend_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1736,7 +1634,7 @@ func (x *ListAvailableDishTagsReply) String() string { func (*ListAvailableDishTagsReply) ProtoMessage() {} func (x *ListAvailableDishTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[25] + mi := &file_tumdev_campus_backend_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1749,7 +1647,7 @@ func (x *ListAvailableDishTagsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAvailableDishTagsReply.ProtoReflect.Descriptor instead. func (*ListAvailableDishTagsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{25} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{23} } func (x *ListAvailableDishTagsReply) GetRatingTags() []*TagsOverview { @@ -1768,7 +1666,7 @@ type ListNameTagsRequest struct { func (x *ListNameTagsRequest) Reset() { *x = ListNameTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[26] + mi := &file_tumdev_campus_backend_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1781,7 +1679,7 @@ func (x *ListNameTagsRequest) String() string { func (*ListNameTagsRequest) ProtoMessage() {} func (x *ListNameTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[26] + mi := &file_tumdev_campus_backend_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1794,7 +1692,7 @@ func (x *ListNameTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNameTagsRequest.ProtoReflect.Descriptor instead. func (*ListNameTagsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{26} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{24} } type ListNameTagsReply struct { @@ -1808,7 +1706,7 @@ type ListNameTagsReply struct { func (x *ListNameTagsReply) Reset() { *x = ListNameTagsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[27] + mi := &file_tumdev_campus_backend_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1821,7 +1719,7 @@ func (x *ListNameTagsReply) String() string { func (*ListNameTagsReply) ProtoMessage() {} func (x *ListNameTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[27] + mi := &file_tumdev_campus_backend_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1834,7 +1732,7 @@ func (x *ListNameTagsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNameTagsReply.ProtoReflect.Descriptor instead. func (*ListNameTagsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{25} } func (x *ListNameTagsReply) GetRatingTags() []*TagsOverview { @@ -1853,7 +1751,7 @@ type ListAvailableCanteenTagsRequest struct { func (x *ListAvailableCanteenTagsRequest) Reset() { *x = ListAvailableCanteenTagsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1866,7 +1764,7 @@ func (x *ListAvailableCanteenTagsRequest) String() string { func (*ListAvailableCanteenTagsRequest) ProtoMessage() {} func (x *ListAvailableCanteenTagsRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1879,7 +1777,7 @@ func (x *ListAvailableCanteenTagsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAvailableCanteenTagsRequest.ProtoReflect.Descriptor instead. func (*ListAvailableCanteenTagsRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{26} } type ListAvailableCanteenTagsReply struct { @@ -1893,7 +1791,7 @@ type ListAvailableCanteenTagsReply struct { func (x *ListAvailableCanteenTagsReply) Reset() { *x = ListAvailableCanteenTagsReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1906,7 +1804,7 @@ func (x *ListAvailableCanteenTagsReply) String() string { func (*ListAvailableCanteenTagsReply) ProtoMessage() {} func (x *ListAvailableCanteenTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1919,7 +1817,7 @@ func (x *ListAvailableCanteenTagsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAvailableCanteenTagsReply.ProtoReflect.Descriptor instead. func (*ListAvailableCanteenTagsReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} } func (x *ListAvailableCanteenTagsReply) GetRatingTags() []*TagsOverview { @@ -1942,7 +1840,7 @@ type TagsOverview struct { func (x *TagsOverview) Reset() { *x = TagsOverview{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1955,7 +1853,7 @@ func (x *TagsOverview) String() string { func (*TagsOverview) ProtoMessage() {} func (x *TagsOverview) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1968,7 +1866,7 @@ func (x *TagsOverview) ProtoReflect() protoreflect.Message { // Deprecated: Use TagsOverview.ProtoReflect.Descriptor instead. func (*TagsOverview) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} } func (x *TagsOverview) GetTagId() int32 { @@ -2004,7 +1902,7 @@ type RatingTag struct { func (x *RatingTag) Reset() { *x = RatingTag{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2017,7 +1915,7 @@ func (x *RatingTag) String() string { func (*RatingTag) ProtoMessage() {} func (x *RatingTag) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2030,7 +1928,7 @@ func (x *RatingTag) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTag.ProtoReflect.Descriptor instead. func (*RatingTag) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} } func (x *RatingTag) GetTagId() int64 { @@ -2059,7 +1957,7 @@ type RatingTagNewRequest struct { func (x *RatingTagNewRequest) Reset() { *x = RatingTagNewRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[32] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2072,7 +1970,7 @@ func (x *RatingTagNewRequest) String() string { func (*RatingTagNewRequest) ProtoMessage() {} func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[32] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2085,7 +1983,7 @@ func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagNewRequest.ProtoReflect.Descriptor instead. func (*RatingTagNewRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} } func (x *RatingTagNewRequest) GetTagId() int32 { @@ -2117,7 +2015,7 @@ type RatingTagResult struct { func (x *RatingTagResult) Reset() { *x = RatingTagResult{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[33] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2130,7 +2028,7 @@ func (x *RatingTagResult) String() string { func (*RatingTagResult) ProtoMessage() {} func (x *RatingTagResult) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[33] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2143,7 +2041,7 @@ func (x *RatingTagResult) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagResult.ProtoReflect.Descriptor instead. func (*RatingTagResult) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} } func (x *RatingTagResult) GetTagId() int32 { @@ -2190,7 +2088,7 @@ type ListCanteensRequest struct { func (x *ListCanteensRequest) Reset() { *x = ListCanteensRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[34] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2203,7 +2101,7 @@ func (x *ListCanteensRequest) String() string { func (*ListCanteensRequest) ProtoMessage() {} func (x *ListCanteensRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[34] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2216,7 +2114,7 @@ func (x *ListCanteensRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCanteensRequest.ProtoReflect.Descriptor instead. func (*ListCanteensRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} } type ListCanteensReply struct { @@ -2230,7 +2128,7 @@ type ListCanteensReply struct { func (x *ListCanteensReply) Reset() { *x = ListCanteensReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[35] + mi := &file_tumdev_campus_backend_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2243,7 +2141,7 @@ func (x *ListCanteensReply) String() string { func (*ListCanteensReply) ProtoMessage() {} func (x *ListCanteensReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[35] + mi := &file_tumdev_campus_backend_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2256,7 +2154,7 @@ func (x *ListCanteensReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCanteensReply.ProtoReflect.Descriptor instead. func (*ListCanteensReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} } func (x *ListCanteensReply) GetCanteen() []*Canteen { @@ -2280,7 +2178,7 @@ type Canteen struct { func (x *Canteen) Reset() { *x = Canteen{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[36] + mi := &file_tumdev_campus_backend_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2293,7 +2191,7 @@ func (x *Canteen) String() string { func (*Canteen) ProtoMessage() {} func (x *Canteen) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[36] + mi := &file_tumdev_campus_backend_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2306,7 +2204,7 @@ func (x *Canteen) ProtoReflect() protoreflect.Message { // Deprecated: Use Canteen.ProtoReflect.Descriptor instead. func (*Canteen) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} } func (x *Canteen) GetId() string { @@ -2354,7 +2252,7 @@ type ListDishesRequest struct { func (x *ListDishesRequest) Reset() { *x = ListDishesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[37] + mi := &file_tumdev_campus_backend_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2367,7 +2265,7 @@ func (x *ListDishesRequest) String() string { func (*ListDishesRequest) ProtoMessage() {} func (x *ListDishesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[37] + mi := &file_tumdev_campus_backend_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2380,7 +2278,7 @@ func (x *ListDishesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDishesRequest.ProtoReflect.Descriptor instead. func (*ListDishesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} } func (x *ListDishesRequest) GetCanteenId() string { @@ -2422,7 +2320,7 @@ type ListDishesReply struct { func (x *ListDishesReply) Reset() { *x = ListDishesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[38] + mi := &file_tumdev_campus_backend_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2435,7 +2333,7 @@ func (x *ListDishesReply) String() string { func (*ListDishesReply) ProtoMessage() {} func (x *ListDishesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[38] + mi := &file_tumdev_campus_backend_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2448,7 +2346,7 @@ func (x *ListDishesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDishesReply.ProtoReflect.Descriptor instead. func (*ListDishesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} } func (x *ListDishesReply) GetDish() []string { @@ -2467,7 +2365,7 @@ type ListResponsiblePersonRequest struct { func (x *ListResponsiblePersonRequest) Reset() { *x = ListResponsiblePersonRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[39] + mi := &file_tumdev_campus_backend_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2480,7 +2378,7 @@ func (x *ListResponsiblePersonRequest) String() string { func (*ListResponsiblePersonRequest) ProtoMessage() {} func (x *ListResponsiblePersonRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[39] + mi := &file_tumdev_campus_backend_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2493,7 +2391,7 @@ func (x *ListResponsiblePersonRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListResponsiblePersonRequest.ProtoReflect.Descriptor instead. func (*ListResponsiblePersonRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} } type ListResponsiblePersonReply struct { @@ -2507,7 +2405,7 @@ type ListResponsiblePersonReply struct { func (x *ListResponsiblePersonReply) Reset() { *x = ListResponsiblePersonReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[40] + mi := &file_tumdev_campus_backend_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2520,7 +2418,7 @@ func (x *ListResponsiblePersonReply) String() string { func (*ListResponsiblePersonReply) ProtoMessage() {} func (x *ListResponsiblePersonReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[40] + mi := &file_tumdev_campus_backend_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2533,7 +2431,7 @@ func (x *ListResponsiblePersonReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListResponsiblePersonReply.ProtoReflect.Descriptor instead. func (*ListResponsiblePersonReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} } func (x *ListResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePerson { @@ -2558,7 +2456,7 @@ type ResponsiblePerson struct { func (x *ResponsiblePerson) Reset() { *x = ResponsiblePerson{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[41] + mi := &file_tumdev_campus_backend_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2571,7 +2469,7 @@ func (x *ResponsiblePerson) String() string { func (*ResponsiblePerson) ProtoMessage() {} func (x *ResponsiblePerson) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[41] + mi := &file_tumdev_campus_backend_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2584,7 +2482,7 @@ func (x *ResponsiblePerson) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponsiblePerson.ProtoReflect.Descriptor instead. func (*ResponsiblePerson) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} } func (x *ResponsiblePerson) GetName() string { @@ -2641,7 +2539,7 @@ type RoomInformationElement struct { func (x *RoomInformationElement) Reset() { *x = RoomInformationElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[42] + mi := &file_tumdev_campus_backend_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2654,7 +2552,7 @@ func (x *RoomInformationElement) String() string { func (*RoomInformationElement) ProtoMessage() {} func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[42] + mi := &file_tumdev_campus_backend_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2667,7 +2565,7 @@ func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomInformationElement.ProtoReflect.Descriptor instead. func (*RoomInformationElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} } func (x *RoomInformationElement) GetRoomId() int32 { @@ -2742,7 +2640,7 @@ type ListMoreInformationRequest struct { func (x *ListMoreInformationRequest) Reset() { *x = ListMoreInformationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2653,7 @@ func (x *ListMoreInformationRequest) String() string { func (*ListMoreInformationRequest) ProtoMessage() {} func (x *ListMoreInformationRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2666,7 @@ func (x *ListMoreInformationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMoreInformationRequest.ProtoReflect.Descriptor instead. func (*ListMoreInformationRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} } type ListMoreInformationReply struct { @@ -2782,7 +2680,7 @@ type ListMoreInformationReply struct { func (x *ListMoreInformationReply) Reset() { *x = ListMoreInformationReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[44] + mi := &file_tumdev_campus_backend_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2795,7 +2693,7 @@ func (x *ListMoreInformationReply) String() string { func (*ListMoreInformationReply) ProtoMessage() {} func (x *ListMoreInformationReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[44] + mi := &file_tumdev_campus_backend_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2808,7 +2706,7 @@ func (x *ListMoreInformationReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMoreInformationReply.ProtoReflect.Descriptor instead. func (*ListMoreInformationReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} } func (x *ListMoreInformationReply) GetInfos() []*ListMoreInformationReply_MoreInformation { @@ -2829,7 +2727,7 @@ type ListOpeningTimesRequest struct { func (x *ListOpeningTimesRequest) Reset() { *x = ListOpeningTimesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[45] + mi := &file_tumdev_campus_backend_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2842,7 +2740,7 @@ func (x *ListOpeningTimesRequest) String() string { func (*ListOpeningTimesRequest) ProtoMessage() {} func (x *ListOpeningTimesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[45] + mi := &file_tumdev_campus_backend_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2855,7 +2753,7 @@ func (x *ListOpeningTimesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOpeningTimesRequest.ProtoReflect.Descriptor instead. func (*ListOpeningTimesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} } func (x *ListOpeningTimesRequest) GetLanguage() string { @@ -2876,7 +2774,7 @@ type ListOpeningTimesReply struct { func (x *ListOpeningTimesReply) Reset() { *x = ListOpeningTimesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[46] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2889,7 +2787,7 @@ func (x *ListOpeningTimesReply) String() string { func (*ListOpeningTimesReply) ProtoMessage() {} func (x *ListOpeningTimesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[46] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2902,7 +2800,7 @@ func (x *ListOpeningTimesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOpeningTimesReply.ProtoReflect.Descriptor instead. func (*ListOpeningTimesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} } func (x *ListOpeningTimesReply) GetFacilities() []*OpeningTimesMsgElement { @@ -2933,7 +2831,7 @@ type OpeningTimesMsgElement struct { func (x *OpeningTimesMsgElement) Reset() { *x = OpeningTimesMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2946,7 +2844,7 @@ func (x *OpeningTimesMsgElement) String() string { func (*OpeningTimesMsgElement) ProtoMessage() {} func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2959,7 +2857,7 @@ func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use OpeningTimesMsgElement.ProtoReflect.Descriptor instead. func (*OpeningTimesMsgElement) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} } func (x *OpeningTimesMsgElement) GetId() int32 { @@ -3050,7 +2948,7 @@ type GetUpdateNoteRequest struct { func (x *GetUpdateNoteRequest) Reset() { *x = GetUpdateNoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3063,7 +2961,7 @@ func (x *GetUpdateNoteRequest) String() string { func (*GetUpdateNoteRequest) ProtoMessage() {} func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3076,7 +2974,7 @@ func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteRequest.ProtoReflect.Descriptor instead. func (*GetUpdateNoteRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} } func (x *GetUpdateNoteRequest) GetVersion() int64 { @@ -3098,7 +2996,7 @@ type GetUpdateNoteReply struct { func (x *GetUpdateNoteReply) Reset() { *x = GetUpdateNoteReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3111,7 +3009,7 @@ func (x *GetUpdateNoteReply) String() string { func (*GetUpdateNoteReply) ProtoMessage() {} func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3124,7 +3022,7 @@ func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteReply.ProtoReflect.Descriptor instead. func (*GetUpdateNoteReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} } func (x *GetUpdateNoteReply) GetMessage() string { @@ -3155,7 +3053,7 @@ type ListMoviesRequest struct { func (x *ListMoviesRequest) Reset() { *x = ListMoviesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3168,7 +3066,7 @@ func (x *ListMoviesRequest) String() string { func (*ListMoviesRequest) ProtoMessage() {} func (x *ListMoviesRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3181,7 +3079,7 @@ func (x *ListMoviesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMoviesRequest.ProtoReflect.Descriptor instead. func (*ListMoviesRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} } func (x *ListMoviesRequest) GetLastId() int32 { @@ -3209,7 +3107,7 @@ type ListMoviesReply struct { func (x *ListMoviesReply) Reset() { *x = ListMoviesReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3222,7 +3120,7 @@ func (x *ListMoviesReply) String() string { func (*ListMoviesReply) ProtoMessage() {} func (x *ListMoviesReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3235,7 +3133,7 @@ func (x *ListMoviesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMoviesReply.ProtoReflect.Descriptor instead. func (*ListMoviesReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} } func (x *ListMoviesReply) GetMovies() []*Movie { @@ -3287,7 +3185,7 @@ type Movie struct { func (x *Movie) Reset() { *x = Movie{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3198,7 @@ func (x *Movie) String() string { func (*Movie) ProtoMessage() {} func (x *Movie) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3211,7 @@ func (x *Movie) ProtoReflect() protoreflect.Message { // Deprecated: Use Movie.ProtoReflect.Descriptor instead. func (*Movie) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} } func (x *Movie) GetMovieId() int64 { @@ -3454,7 +3352,7 @@ type CreateFeedbackRequest struct { func (x *CreateFeedbackRequest) Reset() { *x = CreateFeedbackRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3467,7 +3365,7 @@ func (x *CreateFeedbackRequest) String() string { func (*CreateFeedbackRequest) ProtoMessage() {} func (x *CreateFeedbackRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3480,7 +3378,7 @@ func (x *CreateFeedbackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateFeedbackRequest.ProtoReflect.Descriptor instead. func (*CreateFeedbackRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} } func (x *CreateFeedbackRequest) GetRecipient() CreateFeedbackRequest_Recipient { @@ -3544,7 +3442,7 @@ type Coordinate struct { func (x *Coordinate) Reset() { *x = Coordinate{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3557,7 +3455,7 @@ func (x *Coordinate) String() string { func (*Coordinate) ProtoMessage() {} func (x *Coordinate) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3570,7 +3468,7 @@ func (x *Coordinate) ProtoReflect() protoreflect.Message { // Deprecated: Use Coordinate.ProtoReflect.Descriptor instead. func (*Coordinate) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} } func (x *Coordinate) GetLatitude() float64 { @@ -3596,7 +3494,7 @@ type CreateFeedbackReply struct { func (x *CreateFeedbackReply) Reset() { *x = CreateFeedbackReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3609,7 +3507,7 @@ func (x *CreateFeedbackReply) String() string { func (*CreateFeedbackReply) ProtoMessage() {} func (x *CreateFeedbackReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3622,7 +3520,7 @@ func (x *CreateFeedbackReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateFeedbackReply.ProtoReflect.Descriptor instead. func (*CreateFeedbackReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} } type CreateFeedbackImageReply struct { @@ -3636,7 +3534,7 @@ type CreateFeedbackImageReply struct { func (x *CreateFeedbackImageReply) Reset() { *x = CreateFeedbackImageReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3649,7 +3547,7 @@ func (x *CreateFeedbackImageReply) String() string { func (*CreateFeedbackImageReply) ProtoMessage() {} func (x *CreateFeedbackImageReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3662,7 +3560,7 @@ func (x *CreateFeedbackImageReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateFeedbackImageReply.ProtoReflect.Descriptor instead. func (*CreateFeedbackImageReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} } func (x *CreateFeedbackImageReply) GetStatus() string { @@ -3684,7 +3582,7 @@ type CreateFeedbackImageRequest struct { func (x *CreateFeedbackImageRequest) Reset() { *x = CreateFeedbackImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3697,7 +3595,7 @@ func (x *CreateFeedbackImageRequest) String() string { func (*CreateFeedbackImageRequest) ProtoMessage() {} func (x *CreateFeedbackImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3710,7 +3608,7 @@ func (x *CreateFeedbackImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateFeedbackImageRequest.ProtoReflect.Descriptor instead. func (*CreateFeedbackImageRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} } func (x *CreateFeedbackImageRequest) GetId() int32 { @@ -3738,7 +3636,7 @@ type GetMemberRequest struct { func (x *GetMemberRequest) Reset() { *x = GetMemberRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3751,7 +3649,7 @@ func (x *GetMemberRequest) String() string { func (*GetMemberRequest) ProtoMessage() {} func (x *GetMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3764,7 +3662,7 @@ func (x *GetMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMemberRequest.ProtoReflect.Descriptor instead. func (*GetMemberRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} } func (x *GetMemberRequest) GetLrzId() string { @@ -3787,7 +3685,7 @@ type GetMemberReply struct { func (x *GetMemberReply) Reset() { *x = GetMemberReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3800,7 +3698,7 @@ func (x *GetMemberReply) String() string { func (*GetMemberReply) ProtoMessage() {} func (x *GetMemberReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3813,7 +3711,7 @@ func (x *GetMemberReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMemberReply.ProtoReflect.Descriptor instead. func (*GetMemberReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} } func (x *GetMemberReply) GetLrzId() string { @@ -3848,7 +3746,7 @@ type GetUploadStatusRequest struct { func (x *GetUploadStatusRequest) Reset() { *x = GetUploadStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3861,7 +3759,7 @@ func (x *GetUploadStatusRequest) String() string { func (*GetUploadStatusRequest) ProtoMessage() {} func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3874,7 +3772,7 @@ func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusRequest.ProtoReflect.Descriptor instead. func (*GetUploadStatusRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} } func (x *GetUploadStatusRequest) GetLrzId() string { @@ -3899,7 +3797,7 @@ type GetUploadStatusReply struct { func (x *GetUploadStatusReply) Reset() { *x = GetUploadStatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3912,7 +3810,7 @@ func (x *GetUploadStatusReply) String() string { func (*GetUploadStatusReply) ProtoMessage() {} func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3925,7 +3823,7 @@ func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusReply.ProtoReflect.Descriptor instead. func (*GetUploadStatusReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} } func (x *GetUploadStatusReply) GetFcmToken() string { @@ -3974,7 +3872,7 @@ type GetNotificationRequest struct { func (x *GetNotificationRequest) Reset() { *x = GetNotificationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3987,7 +3885,7 @@ func (x *GetNotificationRequest) String() string { func (*GetNotificationRequest) ProtoMessage() {} func (x *GetNotificationRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4000,7 +3898,7 @@ func (x *GetNotificationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationRequest.ProtoReflect.Descriptor instead. func (*GetNotificationRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} } func (x *GetNotificationRequest) GetNotificationId() int32 { @@ -4025,7 +3923,7 @@ type GetNotificationReply struct { func (x *GetNotificationReply) Reset() { *x = GetNotificationReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4038,7 +3936,7 @@ func (x *GetNotificationReply) String() string { func (*GetNotificationReply) ProtoMessage() {} func (x *GetNotificationReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4051,7 +3949,7 @@ func (x *GetNotificationReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationReply.ProtoReflect.Descriptor instead. func (*GetNotificationReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} } func (x *GetNotificationReply) GetNotificationId() int32 { @@ -4100,7 +3998,7 @@ type GetNotificationConfirmRequest struct { func (x *GetNotificationConfirmRequest) Reset() { *x = GetNotificationConfirmRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4113,7 +4011,7 @@ func (x *GetNotificationConfirmRequest) String() string { func (*GetNotificationConfirmRequest) ProtoMessage() {} func (x *GetNotificationConfirmRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4126,7 +4024,7 @@ func (x *GetNotificationConfirmRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationConfirmRequest.ProtoReflect.Descriptor instead. func (*GetNotificationConfirmRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} } func (x *GetNotificationConfirmRequest) GetNotificationId() int32 { @@ -4147,7 +4045,7 @@ type GetNotificationConfirmReply struct { func (x *GetNotificationConfirmReply) Reset() { *x = GetNotificationConfirmReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[65] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4160,7 +4058,7 @@ func (x *GetNotificationConfirmReply) String() string { func (*GetNotificationConfirmReply) ProtoMessage() {} func (x *GetNotificationConfirmReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[65] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4173,7 +4071,7 @@ func (x *GetNotificationConfirmReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationConfirmReply.ProtoReflect.Descriptor instead. func (*GetNotificationConfirmReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{65} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} } func (x *GetNotificationConfirmReply) GetStatus() string { @@ -4195,7 +4093,7 @@ type GetCanteenHeadCountRequest struct { func (x *GetCanteenHeadCountRequest) Reset() { *x = GetCanteenHeadCountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[66] + mi := &file_tumdev_campus_backend_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4208,7 +4106,7 @@ func (x *GetCanteenHeadCountRequest) String() string { func (*GetCanteenHeadCountRequest) ProtoMessage() {} func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[66] + mi := &file_tumdev_campus_backend_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4221,7 +4119,7 @@ func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCanteenHeadCountRequest.ProtoReflect.Descriptor instead. func (*GetCanteenHeadCountRequest) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{66} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} } func (x *GetCanteenHeadCountRequest) GetCanteenId() string { @@ -4249,7 +4147,7 @@ type GetCanteenHeadCountReply struct { func (x *GetCanteenHeadCountReply) Reset() { *x = GetCanteenHeadCountReply{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[67] + mi := &file_tumdev_campus_backend_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4262,7 +4160,7 @@ func (x *GetCanteenHeadCountReply) String() string { func (*GetCanteenHeadCountReply) ProtoMessage() {} func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[67] + mi := &file_tumdev_campus_backend_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4275,7 +4173,7 @@ func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCanteenHeadCountReply.ProtoReflect.Descriptor instead. func (*GetCanteenHeadCountReply) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{67} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{65} } func (x *GetCanteenHeadCountReply) GetCount() uint32 { @@ -4319,7 +4217,7 @@ type ListMoreInformationReply_MoreInformation struct { func (x *ListMoreInformationReply_MoreInformation) Reset() { *x = ListMoreInformationReply_MoreInformation{} if protoimpl.UnsafeEnabled { - mi := &file_tumdev_campus_backend_proto_msgTypes[68] + mi := &file_tumdev_campus_backend_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4332,7 +4230,7 @@ func (x *ListMoreInformationReply_MoreInformation) String() string { func (*ListMoreInformationReply_MoreInformation) ProtoMessage() {} func (x *ListMoreInformationReply_MoreInformation) ProtoReflect() protoreflect.Message { - mi := &file_tumdev_campus_backend_proto_msgTypes[68] + mi := &file_tumdev_campus_backend_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4345,7 +4243,7 @@ func (x *ListMoreInformationReply_MoreInformation) ProtoReflect() protoreflect.M // Deprecated: Use ListMoreInformationReply_MoreInformation.ProtoReflect.Descriptor instead. func (*ListMoreInformationReply_MoreInformation) Descriptor() ([]byte, []int) { - return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44, 0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42, 0} } func (x *ListMoreInformationReply_MoreInformation) GetTitle() string { @@ -4399,650 +4297,631 @@ var file_tumdev_campus_backend_proto_rawDesc = []byte{ 0x30, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x22, 0x5a, 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x39, 0x0a, - 0x1d, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbf, 0x02, 0x0a, 0x04, 0x4e, 0x65, 0x77, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, - 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x63, 0x6f, 0x6e, 0x55, 0x72, - 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x04, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x69, 0x63, 0x6f, + 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x34, 0x0a, + 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x65, 0x22, 0x2e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x65, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x04, 0x6e, + 0x65, 0x77, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, + 0x61, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, + 0x73, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x6e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x6f, 0x6c, + 0x64, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, + 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x65, 0x41, 0x74, 0x22, 0x18, 0x0a, 0x16, + 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, + 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x0a, 0x4e, 0x65, 0x77, + 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, + 0x22, 0x44, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, + 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, + 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x06, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0xce, 0x01, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, + 0x65, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, + 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2e, 0x0a, 0x0d, 0x4c, 0x69, - 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x04, 0x6e, - 0x65, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4e, 0x65, 0x77, 0x73, 0x52, 0x04, 0x6e, 0x65, 0x77, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x0f, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x49, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, - 0x65, 0x41, 0x74, 0x22, 0x18, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, - 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, - 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x22, 0x55, 0x0a, 0x0a, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, - 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x22, 0x44, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6c, 0x61, - 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x49, 0x64, 0x22, 0x3d, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x22, 0xce, 0x01, 0x0a, - 0x09, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, - 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, - 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, - 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, + 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xc8, 0x01, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, - 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, - 0x12, 0x35, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, - 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, - 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x69, - 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, - 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, - 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, - 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x35, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x31, 0x0a, - 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, - 0x22, 0xcc, 0x01, 0x0a, 0x11, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x39, - 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, - 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, - 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xb4, 0x01, 0x0a, 0x1a, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xc5, 0x01, 0x0a, 0x17, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, - 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x50, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x11, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, - 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x53, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, - 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, - 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x45, 0x0a, - 0x0c, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x15, 0x0a, - 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, - 0x61, 0x67, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x65, 0x6e, 0x22, 0x3a, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x22, 0x44, 0x0a, 0x13, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x70, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, - 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x6e, 0x52, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x22, 0x6d, 0x0a, 0x07, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6c, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, - 0x65, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x25, 0x0a, 0x0f, 0x4c, 0x69, 0x73, - 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x69, 0x73, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, - 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x63, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, - 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, - 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x15, 0x0a, - 0x06, 0x74, 0x75, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x75, 0x6d, 0x49, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, - 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, - 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4d, 0x6f, 0x72, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x69, 0x6e, - 0x66, 0x6f, 0x73, 0x1a, 0x55, 0x0a, 0x0f, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x35, 0x0a, 0x17, 0x4c, 0x69, + 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, + 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x35, 0x0a, 0x0b, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, + 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, 0x0a, + 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, + 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0xf7, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, + 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, + 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, + 0x35, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x11, 0x53, 0x69, + 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0x1a, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0xb4, 0x01, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0xc5, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, + 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, + 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x1e, 0x0a, 0x1c, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x50, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x15, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, + 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x21, + 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x53, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, + 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x45, 0x0a, 0x0c, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, + 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x6e, 0x22, 0x3a, 0x0a, + 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, + 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x44, 0x0a, 0x13, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, + 0x70, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x61, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, + 0x78, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, + 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x07, 0x63, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x22, 0x6d, 0x0a, 0x07, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, + 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, + 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x22, 0x6c, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, + 0x61, 0x79, 0x22, 0x25, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x63, 0x0a, 0x1a, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x11, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x8c, + 0x01, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, + 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x75, 0x6d, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x64, 0x22, 0xfc, 0x01, + 0x0a, 0x16, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x6f, 0x6f, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, + 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, + 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, + 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x1c, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x1a, 0x55, 0x0a, 0x0f, + 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x35, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x54, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x22, 0x54, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, - 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, - 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, - 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, - 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6e, - 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0e, - 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x02, + 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x22, 0xbf, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x65, 0x73, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x41, 0x74, 0x22, 0x35, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x06, 0x6d, 0x6f, + 0x76, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x52, 0x06, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x22, 0xa7, + 0x04, 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x69, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x69, + 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x44, 0x61, 0x74, 0x65, 0x41, 0x74, 0x22, 0x35, - 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x22, 0x0a, 0x06, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x52, 0x06, 0x6d, - 0x6f, 0x76, 0x69, 0x65, 0x73, 0x22, 0xa7, 0x04, 0x0a, 0x05, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x12, - 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x79, 0x65, - 0x61, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x59, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x64, - 0x62, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x69, 0x6d, 0x64, 0x62, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x3c, 0x0a, - 0x1a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x18, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x55, 0x72, 0x6c, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, - 0xcc, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, - 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x63, - 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, - 0x6e, 0x74, 0x52, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x09, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x55, 0x4d, 0x5f, 0x44, 0x45, 0x56, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x54, 0x55, 0x4d, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0x01, 0x22, 0x46, - 0x0a, 0x0a, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, - 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, - 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, - 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, - 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x47, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, - 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, - 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, - 0x2f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, - 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, - 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, - 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x48, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0x35, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x6e, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, - 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, 0x02, 0x32, 0xe6, 0x16, 0x0a, 0x06, 0x43, 0x61, 0x6d, - 0x70, 0x75, 0x73, 0x12, 0x64, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x16, 0x62, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x0c, 0x2f, 0x6e, 0x65, - 0x77, 0x73, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x69, 0x0a, 0x0f, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, - 0x12, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0d, 0x62, 0x04, 0x6e, 0x65, 0x77, 0x73, 0x12, 0x05, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x12, - 0x72, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, - 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, - 0x67, 0x65, 0x74, 0x12, 0x63, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, - 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x75, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x63, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, - 0x69, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, - 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, - 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, - 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, - 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, - 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6f, 0x0a, 0x0c, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x27, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, - 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x18, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x59, 0x65, 0x61, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x64, 0x62, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6d, 0x64, 0x62, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x69, + 0x6c, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1b, 0x0a, 0x09, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x72, 0x6c, 0x4a, 0x04, 0x08, 0x01, + 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xcc, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, + 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x2b, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x09, + 0x52, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x55, 0x4d, + 0x5f, 0x44, 0x45, 0x56, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x55, 0x4d, 0x5f, 0x43, 0x4f, + 0x4e, 0x54, 0x41, 0x43, 0x54, 0x10, 0x01, 0x22, 0x46, 0x0a, 0x0a, 0x43, 0x6f, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, + 0x15, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, + 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x47, 0x0a, 0x1a, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0x58, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2f, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, + 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, + 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x48, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x27, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x35, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x3b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, + 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, + 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, + 0x02, 0x32, 0xca, 0x15, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x64, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, + 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x62, 0x06, 0x61, 0x6c, + 0x65, 0x72, 0x74, 0x73, 0x12, 0x0c, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x61, 0x6c, 0x65, 0x72, + 0x74, 0x73, 0x12, 0x69, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, + 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, + 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, + 0x08, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x62, 0x04, 0x6e, 0x65, 0x77, + 0x73, 0x12, 0x05, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x12, 0x72, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x63, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, + 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, + 0x74, 0x12, 0x75, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, + 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x69, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, + 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, + 0x6e, 0x65, 0x77, 0x12, 0x8c, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, - 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x67, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x62, - 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x12, 0x14, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x6e, 0x2f, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x12, 0x59, - 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, - 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, - 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x15, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, - 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x7b, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, - 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, - 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, - 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, - 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x55, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, - 0x76, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x6d, 0x6f, 0x76, - 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x67, 0x0a, - 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, - 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x0a, 0x61, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, - 0x62, 0x61, 0x63, 0x6b, 0x28, 0x01, 0x12, 0x6c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, - 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x73, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x52, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, - 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, - 0x1f, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, - 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, - 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0c, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x7d, 0x42, 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, 0x6d, - 0x70, 0x75, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, - 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, 0x61, - 0x6d, 0x70, 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, - 0xaa, 0x02, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x6f, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x62, 0x0b, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, + 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x98, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, + 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x62, 0x0b, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x12, + 0x1d, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x67, + 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x12, 0x18, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x62, 0x07, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x12, 0x14, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x61, 0x6c, 0x6c, 0x43, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, + 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x7b, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, + 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6e, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, + 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, + 0x55, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x19, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x6d, 0x6f, 0x76, 0x69, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x67, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x0a, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x01, 0x12, + 0x6c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x73, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, + 0x12, 0x20, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x7d, 0x12, 0x90, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x52, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x19, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x12, 0x11, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x7e, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, + 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0c, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x5d, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x2a, 0x13, 0x2f, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0x5e, + 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x75, + 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, + 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5058,7 +4937,7 @@ func file_tumdev_campus_backend_proto_rawDescGZIP() []byte { } var file_tumdev_campus_backend_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 69) +var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_tumdev_campus_backend_proto_goTypes = []interface{}{ (DeviceType)(0), // 0: api.DeviceType (CreateFeedbackRequest_Recipient)(0), // 1: api.CreateFeedbackRequest.Recipient @@ -5066,166 +4945,162 @@ var file_tumdev_campus_backend_proto_goTypes = []interface{}{ (*CreateDeviceReply)(nil), // 3: api.CreateDeviceReply (*DeleteDeviceRequest)(nil), // 4: api.DeleteDeviceRequest (*DeleteDeviceReply)(nil), // 5: api.DeleteDeviceReply - (*IOSDeviceRequestResponseRequest)(nil), // 6: api.IOSDeviceRequestResponseRequest - (*IOSDeviceRequestResponseReply)(nil), // 7: api.IOSDeviceRequestResponseReply - (*News)(nil), // 8: api.News - (*ListNewsReply)(nil), // 9: api.ListNewsReply - (*ListNewsRequest)(nil), // 10: api.ListNewsRequest - (*ListNewsSourcesRequest)(nil), // 11: api.ListNewsSourcesRequest - (*ListNewsSourcesReply)(nil), // 12: api.ListNewsSourcesReply - (*NewsSource)(nil), // 13: api.NewsSource - (*ListNewsAlertsRequest)(nil), // 14: api.ListNewsAlertsRequest - (*ListNewsAlertsReply)(nil), // 15: api.ListNewsAlertsReply - (*NewsAlert)(nil), // 16: api.NewsAlert - (*ListCanteenRatingsRequest)(nil), // 17: api.ListCanteenRatingsRequest - (*ListCanteenRatingsReply)(nil), // 18: api.ListCanteenRatingsReply - (*GetDishRatingsRequest)(nil), // 19: api.GetDishRatingsRequest - (*GetDishRatingsReply)(nil), // 20: api.GetDishRatingsReply - (*SingleRatingReply)(nil), // 21: api.SingleRatingReply - (*CreateCanteenRatingReply)(nil), // 22: api.CreateCanteenRatingReply - (*CreateCanteenRatingRequest)(nil), // 23: api.CreateCanteenRatingRequest - (*CreateDishRatingReply)(nil), // 24: api.CreateDishRatingReply - (*CreateDishRatingRequest)(nil), // 25: api.CreateDishRatingRequest - (*ListAvailableDishTagsRequest)(nil), // 26: api.ListAvailableDishTagsRequest - (*ListAvailableDishTagsReply)(nil), // 27: api.ListAvailableDishTagsReply - (*ListNameTagsRequest)(nil), // 28: api.ListNameTagsRequest - (*ListNameTagsReply)(nil), // 29: api.ListNameTagsReply - (*ListAvailableCanteenTagsRequest)(nil), // 30: api.ListAvailableCanteenTagsRequest - (*ListAvailableCanteenTagsReply)(nil), // 31: api.ListAvailableCanteenTagsReply - (*TagsOverview)(nil), // 32: api.TagsOverview - (*RatingTag)(nil), // 33: api.RatingTag - (*RatingTagNewRequest)(nil), // 34: api.RatingTagNewRequest - (*RatingTagResult)(nil), // 35: api.RatingTagResult - (*ListCanteensRequest)(nil), // 36: api.ListCanteensRequest - (*ListCanteensReply)(nil), // 37: api.ListCanteensReply - (*Canteen)(nil), // 38: api.Canteen - (*ListDishesRequest)(nil), // 39: api.ListDishesRequest - (*ListDishesReply)(nil), // 40: api.ListDishesReply - (*ListResponsiblePersonRequest)(nil), // 41: api.ListResponsiblePersonRequest - (*ListResponsiblePersonReply)(nil), // 42: api.ListResponsiblePersonReply - (*ResponsiblePerson)(nil), // 43: api.ResponsiblePerson - (*RoomInformationElement)(nil), // 44: api.RoomInformationElement - (*ListMoreInformationRequest)(nil), // 45: api.ListMoreInformationRequest - (*ListMoreInformationReply)(nil), // 46: api.ListMoreInformationReply - (*ListOpeningTimesRequest)(nil), // 47: api.ListOpeningTimesRequest - (*ListOpeningTimesReply)(nil), // 48: api.ListOpeningTimesReply - (*OpeningTimesMsgElement)(nil), // 49: api.OpeningTimesMsgElement - (*GetUpdateNoteRequest)(nil), // 50: api.GetUpdateNoteRequest - (*GetUpdateNoteReply)(nil), // 51: api.GetUpdateNoteReply - (*ListMoviesRequest)(nil), // 52: api.ListMoviesRequest - (*ListMoviesReply)(nil), // 53: api.ListMoviesReply - (*Movie)(nil), // 54: api.Movie - (*CreateFeedbackRequest)(nil), // 55: api.CreateFeedbackRequest - (*Coordinate)(nil), // 56: api.Coordinate - (*CreateFeedbackReply)(nil), // 57: api.CreateFeedbackReply - (*CreateFeedbackImageReply)(nil), // 58: api.CreateFeedbackImageReply - (*CreateFeedbackImageRequest)(nil), // 59: api.CreateFeedbackImageRequest - (*GetMemberRequest)(nil), // 60: api.GetMemberRequest - (*GetMemberReply)(nil), // 61: api.GetMemberReply - (*GetUploadStatusRequest)(nil), // 62: api.GetUploadStatusRequest - (*GetUploadStatusReply)(nil), // 63: api.GetUploadStatusReply - (*GetNotificationRequest)(nil), // 64: api.GetNotificationRequest - (*GetNotificationReply)(nil), // 65: api.GetNotificationReply - (*GetNotificationConfirmRequest)(nil), // 66: api.GetNotificationConfirmRequest - (*GetNotificationConfirmReply)(nil), // 67: api.GetNotificationConfirmReply - (*GetCanteenHeadCountRequest)(nil), // 68: api.GetCanteenHeadCountRequest - (*GetCanteenHeadCountReply)(nil), // 69: api.GetCanteenHeadCountReply - (*ListMoreInformationReply_MoreInformation)(nil), // 70: api.ListMoreInformationReply.MoreInformation - (*timestamppb.Timestamp)(nil), // 71: google.protobuf.Timestamp + (*News)(nil), // 6: api.News + (*ListNewsReply)(nil), // 7: api.ListNewsReply + (*ListNewsRequest)(nil), // 8: api.ListNewsRequest + (*ListNewsSourcesRequest)(nil), // 9: api.ListNewsSourcesRequest + (*ListNewsSourcesReply)(nil), // 10: api.ListNewsSourcesReply + (*NewsSource)(nil), // 11: api.NewsSource + (*ListNewsAlertsRequest)(nil), // 12: api.ListNewsAlertsRequest + (*ListNewsAlertsReply)(nil), // 13: api.ListNewsAlertsReply + (*NewsAlert)(nil), // 14: api.NewsAlert + (*ListCanteenRatingsRequest)(nil), // 15: api.ListCanteenRatingsRequest + (*ListCanteenRatingsReply)(nil), // 16: api.ListCanteenRatingsReply + (*GetDishRatingsRequest)(nil), // 17: api.GetDishRatingsRequest + (*GetDishRatingsReply)(nil), // 18: api.GetDishRatingsReply + (*SingleRatingReply)(nil), // 19: api.SingleRatingReply + (*CreateCanteenRatingReply)(nil), // 20: api.CreateCanteenRatingReply + (*CreateCanteenRatingRequest)(nil), // 21: api.CreateCanteenRatingRequest + (*CreateDishRatingReply)(nil), // 22: api.CreateDishRatingReply + (*CreateDishRatingRequest)(nil), // 23: api.CreateDishRatingRequest + (*ListAvailableDishTagsRequest)(nil), // 24: api.ListAvailableDishTagsRequest + (*ListAvailableDishTagsReply)(nil), // 25: api.ListAvailableDishTagsReply + (*ListNameTagsRequest)(nil), // 26: api.ListNameTagsRequest + (*ListNameTagsReply)(nil), // 27: api.ListNameTagsReply + (*ListAvailableCanteenTagsRequest)(nil), // 28: api.ListAvailableCanteenTagsRequest + (*ListAvailableCanteenTagsReply)(nil), // 29: api.ListAvailableCanteenTagsReply + (*TagsOverview)(nil), // 30: api.TagsOverview + (*RatingTag)(nil), // 31: api.RatingTag + (*RatingTagNewRequest)(nil), // 32: api.RatingTagNewRequest + (*RatingTagResult)(nil), // 33: api.RatingTagResult + (*ListCanteensRequest)(nil), // 34: api.ListCanteensRequest + (*ListCanteensReply)(nil), // 35: api.ListCanteensReply + (*Canteen)(nil), // 36: api.Canteen + (*ListDishesRequest)(nil), // 37: api.ListDishesRequest + (*ListDishesReply)(nil), // 38: api.ListDishesReply + (*ListResponsiblePersonRequest)(nil), // 39: api.ListResponsiblePersonRequest + (*ListResponsiblePersonReply)(nil), // 40: api.ListResponsiblePersonReply + (*ResponsiblePerson)(nil), // 41: api.ResponsiblePerson + (*RoomInformationElement)(nil), // 42: api.RoomInformationElement + (*ListMoreInformationRequest)(nil), // 43: api.ListMoreInformationRequest + (*ListMoreInformationReply)(nil), // 44: api.ListMoreInformationReply + (*ListOpeningTimesRequest)(nil), // 45: api.ListOpeningTimesRequest + (*ListOpeningTimesReply)(nil), // 46: api.ListOpeningTimesReply + (*OpeningTimesMsgElement)(nil), // 47: api.OpeningTimesMsgElement + (*GetUpdateNoteRequest)(nil), // 48: api.GetUpdateNoteRequest + (*GetUpdateNoteReply)(nil), // 49: api.GetUpdateNoteReply + (*ListMoviesRequest)(nil), // 50: api.ListMoviesRequest + (*ListMoviesReply)(nil), // 51: api.ListMoviesReply + (*Movie)(nil), // 52: api.Movie + (*CreateFeedbackRequest)(nil), // 53: api.CreateFeedbackRequest + (*Coordinate)(nil), // 54: api.Coordinate + (*CreateFeedbackReply)(nil), // 55: api.CreateFeedbackReply + (*CreateFeedbackImageReply)(nil), // 56: api.CreateFeedbackImageReply + (*CreateFeedbackImageRequest)(nil), // 57: api.CreateFeedbackImageRequest + (*GetMemberRequest)(nil), // 58: api.GetMemberRequest + (*GetMemberReply)(nil), // 59: api.GetMemberReply + (*GetUploadStatusRequest)(nil), // 60: api.GetUploadStatusRequest + (*GetUploadStatusReply)(nil), // 61: api.GetUploadStatusReply + (*GetNotificationRequest)(nil), // 62: api.GetNotificationRequest + (*GetNotificationReply)(nil), // 63: api.GetNotificationReply + (*GetNotificationConfirmRequest)(nil), // 64: api.GetNotificationConfirmRequest + (*GetNotificationConfirmReply)(nil), // 65: api.GetNotificationConfirmReply + (*GetCanteenHeadCountRequest)(nil), // 66: api.GetCanteenHeadCountRequest + (*GetCanteenHeadCountReply)(nil), // 67: api.GetCanteenHeadCountReply + (*ListMoreInformationReply_MoreInformation)(nil), // 68: api.ListMoreInformationReply.MoreInformation + (*timestamppb.Timestamp)(nil), // 69: google.protobuf.Timestamp } var file_tumdev_campus_backend_proto_depIdxs = []int32{ 0, // 0: api.CreateDeviceRequest.device_type:type_name -> api.DeviceType 0, // 1: api.DeleteDeviceRequest.device_type:type_name -> api.DeviceType - 71, // 2: api.News.created:type_name -> google.protobuf.Timestamp - 71, // 3: api.News.date:type_name -> google.protobuf.Timestamp - 8, // 4: api.ListNewsReply.news:type_name -> api.News - 71, // 5: api.ListNewsRequest.oldest_date_at:type_name -> google.protobuf.Timestamp - 13, // 6: api.ListNewsSourcesReply.sources:type_name -> api.NewsSource - 16, // 7: api.ListNewsAlertsReply.alerts:type_name -> api.NewsAlert - 71, // 8: api.NewsAlert.created:type_name -> google.protobuf.Timestamp - 71, // 9: api.NewsAlert.from:type_name -> google.protobuf.Timestamp - 71, // 10: api.NewsAlert.to:type_name -> google.protobuf.Timestamp - 71, // 11: api.ListCanteenRatingsRequest.from:type_name -> google.protobuf.Timestamp - 71, // 12: api.ListCanteenRatingsRequest.to:type_name -> google.protobuf.Timestamp - 21, // 13: api.ListCanteenRatingsReply.rating:type_name -> api.SingleRatingReply - 35, // 14: api.ListCanteenRatingsReply.rating_tags:type_name -> api.RatingTagResult - 71, // 15: api.GetDishRatingsRequest.from:type_name -> google.protobuf.Timestamp - 71, // 16: api.GetDishRatingsRequest.to:type_name -> google.protobuf.Timestamp - 21, // 17: api.GetDishRatingsReply.rating:type_name -> api.SingleRatingReply - 35, // 18: api.GetDishRatingsReply.rating_tags:type_name -> api.RatingTagResult - 35, // 19: api.GetDishRatingsReply.name_tags:type_name -> api.RatingTagResult - 34, // 20: api.SingleRatingReply.rating_tags:type_name -> api.RatingTagNewRequest - 71, // 21: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp - 33, // 22: api.CreateCanteenRatingRequest.rating_tags:type_name -> api.RatingTag - 33, // 23: api.CreateDishRatingRequest.rating_tags:type_name -> api.RatingTag - 32, // 24: api.ListAvailableDishTagsReply.rating_tags:type_name -> api.TagsOverview - 32, // 25: api.ListNameTagsReply.rating_tags:type_name -> api.TagsOverview - 32, // 26: api.ListAvailableCanteenTagsReply.rating_tags:type_name -> api.TagsOverview - 38, // 27: api.ListCanteensReply.canteen:type_name -> api.Canteen - 43, // 28: api.ListResponsiblePersonReply.responsible_person:type_name -> api.ResponsiblePerson - 70, // 29: api.ListMoreInformationReply.infos:type_name -> api.ListMoreInformationReply.MoreInformation - 49, // 30: api.ListOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement - 71, // 31: api.ListMoviesRequest.oldest_date_at:type_name -> google.protobuf.Timestamp - 54, // 32: api.ListMoviesReply.movies:type_name -> api.Movie - 71, // 33: api.Movie.date:type_name -> google.protobuf.Timestamp - 71, // 34: api.Movie.created:type_name -> google.protobuf.Timestamp + 69, // 2: api.News.created:type_name -> google.protobuf.Timestamp + 69, // 3: api.News.date:type_name -> google.protobuf.Timestamp + 6, // 4: api.ListNewsReply.news:type_name -> api.News + 69, // 5: api.ListNewsRequest.oldest_date_at:type_name -> google.protobuf.Timestamp + 11, // 6: api.ListNewsSourcesReply.sources:type_name -> api.NewsSource + 14, // 7: api.ListNewsAlertsReply.alerts:type_name -> api.NewsAlert + 69, // 8: api.NewsAlert.created:type_name -> google.protobuf.Timestamp + 69, // 9: api.NewsAlert.from:type_name -> google.protobuf.Timestamp + 69, // 10: api.NewsAlert.to:type_name -> google.protobuf.Timestamp + 69, // 11: api.ListCanteenRatingsRequest.from:type_name -> google.protobuf.Timestamp + 69, // 12: api.ListCanteenRatingsRequest.to:type_name -> google.protobuf.Timestamp + 19, // 13: api.ListCanteenRatingsReply.rating:type_name -> api.SingleRatingReply + 33, // 14: api.ListCanteenRatingsReply.rating_tags:type_name -> api.RatingTagResult + 69, // 15: api.GetDishRatingsRequest.from:type_name -> google.protobuf.Timestamp + 69, // 16: api.GetDishRatingsRequest.to:type_name -> google.protobuf.Timestamp + 19, // 17: api.GetDishRatingsReply.rating:type_name -> api.SingleRatingReply + 33, // 18: api.GetDishRatingsReply.rating_tags:type_name -> api.RatingTagResult + 33, // 19: api.GetDishRatingsReply.name_tags:type_name -> api.RatingTagResult + 32, // 20: api.SingleRatingReply.rating_tags:type_name -> api.RatingTagNewRequest + 69, // 21: api.SingleRatingReply.visited:type_name -> google.protobuf.Timestamp + 31, // 22: api.CreateCanteenRatingRequest.rating_tags:type_name -> api.RatingTag + 31, // 23: api.CreateDishRatingRequest.rating_tags:type_name -> api.RatingTag + 30, // 24: api.ListAvailableDishTagsReply.rating_tags:type_name -> api.TagsOverview + 30, // 25: api.ListNameTagsReply.rating_tags:type_name -> api.TagsOverview + 30, // 26: api.ListAvailableCanteenTagsReply.rating_tags:type_name -> api.TagsOverview + 36, // 27: api.ListCanteensReply.canteen:type_name -> api.Canteen + 41, // 28: api.ListResponsiblePersonReply.responsible_person:type_name -> api.ResponsiblePerson + 68, // 29: api.ListMoreInformationReply.infos:type_name -> api.ListMoreInformationReply.MoreInformation + 47, // 30: api.ListOpeningTimesReply.facilities:type_name -> api.OpeningTimesMsgElement + 69, // 31: api.ListMoviesRequest.oldest_date_at:type_name -> google.protobuf.Timestamp + 52, // 32: api.ListMoviesReply.movies:type_name -> api.Movie + 69, // 33: api.Movie.date:type_name -> google.protobuf.Timestamp + 69, // 34: api.Movie.created:type_name -> google.protobuf.Timestamp 1, // 35: api.CreateFeedbackRequest.recipient:type_name -> api.CreateFeedbackRequest.Recipient - 56, // 36: api.CreateFeedbackRequest.location:type_name -> api.Coordinate - 71, // 37: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp - 14, // 38: api.Campus.ListNewsAlerts:input_type -> api.ListNewsAlertsRequest - 11, // 39: api.Campus.ListNewsSources:input_type -> api.ListNewsSourcesRequest - 10, // 40: api.Campus.ListNews:input_type -> api.ListNewsRequest - 17, // 41: api.Campus.ListCanteenRatings:input_type -> api.ListCanteenRatingsRequest - 19, // 42: api.Campus.GetDishRatings:input_type -> api.GetDishRatingsRequest - 23, // 43: api.Campus.CreateCanteenRating:input_type -> api.CreateCanteenRatingRequest - 25, // 44: api.Campus.CreateDishRating:input_type -> api.CreateDishRatingRequest - 26, // 45: api.Campus.ListAvailableDishTags:input_type -> api.ListAvailableDishTagsRequest - 28, // 46: api.Campus.ListNameTags:input_type -> api.ListNameTagsRequest - 30, // 47: api.Campus.ListAvailableCanteenTags:input_type -> api.ListAvailableCanteenTagsRequest - 36, // 48: api.Campus.ListCanteens:input_type -> api.ListCanteensRequest - 39, // 49: api.Campus.ListDishes:input_type -> api.ListDishesRequest - 41, // 50: api.Campus.ListResponsiblePerson:input_type -> api.ListResponsiblePersonRequest - 45, // 51: api.Campus.ListMoreInformation:input_type -> api.ListMoreInformationRequest - 47, // 52: api.Campus.ListOpeningTimes:input_type -> api.ListOpeningTimesRequest - 50, // 53: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest - 52, // 54: api.Campus.ListMovies:input_type -> api.ListMoviesRequest - 55, // 55: api.Campus.CreateFeedback:input_type -> api.CreateFeedbackRequest - 62, // 56: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest - 64, // 57: api.Campus.GetNotification:input_type -> api.GetNotificationRequest - 66, // 58: api.Campus.GetNotificationConfirm:input_type -> api.GetNotificationConfirmRequest - 60, // 59: api.Campus.GetMember:input_type -> api.GetMemberRequest - 68, // 60: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest - 6, // 61: api.Campus.IOSDeviceRequestResponse:input_type -> api.IOSDeviceRequestResponseRequest - 2, // 62: api.Campus.CreateDevice:input_type -> api.CreateDeviceRequest - 4, // 63: api.Campus.DeleteDevice:input_type -> api.DeleteDeviceRequest - 15, // 64: api.Campus.ListNewsAlerts:output_type -> api.ListNewsAlertsReply - 12, // 65: api.Campus.ListNewsSources:output_type -> api.ListNewsSourcesReply - 9, // 66: api.Campus.ListNews:output_type -> api.ListNewsReply - 18, // 67: api.Campus.ListCanteenRatings:output_type -> api.ListCanteenRatingsReply - 20, // 68: api.Campus.GetDishRatings:output_type -> api.GetDishRatingsReply - 22, // 69: api.Campus.CreateCanteenRating:output_type -> api.CreateCanteenRatingReply - 24, // 70: api.Campus.CreateDishRating:output_type -> api.CreateDishRatingReply - 27, // 71: api.Campus.ListAvailableDishTags:output_type -> api.ListAvailableDishTagsReply - 29, // 72: api.Campus.ListNameTags:output_type -> api.ListNameTagsReply - 31, // 73: api.Campus.ListAvailableCanteenTags:output_type -> api.ListAvailableCanteenTagsReply - 37, // 74: api.Campus.ListCanteens:output_type -> api.ListCanteensReply - 40, // 75: api.Campus.ListDishes:output_type -> api.ListDishesReply - 42, // 76: api.Campus.ListResponsiblePerson:output_type -> api.ListResponsiblePersonReply - 46, // 77: api.Campus.ListMoreInformation:output_type -> api.ListMoreInformationReply - 48, // 78: api.Campus.ListOpeningTimes:output_type -> api.ListOpeningTimesReply - 51, // 79: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply - 53, // 80: api.Campus.ListMovies:output_type -> api.ListMoviesReply - 57, // 81: api.Campus.CreateFeedback:output_type -> api.CreateFeedbackReply - 63, // 82: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply - 65, // 83: api.Campus.GetNotification:output_type -> api.GetNotificationReply - 67, // 84: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationConfirmReply - 61, // 85: api.Campus.GetMember:output_type -> api.GetMemberReply - 69, // 86: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply - 7, // 87: api.Campus.IOSDeviceRequestResponse:output_type -> api.IOSDeviceRequestResponseReply - 3, // 88: api.Campus.CreateDevice:output_type -> api.CreateDeviceReply - 5, // 89: api.Campus.DeleteDevice:output_type -> api.DeleteDeviceReply - 64, // [64:90] is the sub-list for method output_type - 38, // [38:64] is the sub-list for method input_type + 54, // 36: api.CreateFeedbackRequest.location:type_name -> api.Coordinate + 69, // 37: api.GetCanteenHeadCountReply.timestamp:type_name -> google.protobuf.Timestamp + 12, // 38: api.Campus.ListNewsAlerts:input_type -> api.ListNewsAlertsRequest + 9, // 39: api.Campus.ListNewsSources:input_type -> api.ListNewsSourcesRequest + 8, // 40: api.Campus.ListNews:input_type -> api.ListNewsRequest + 15, // 41: api.Campus.ListCanteenRatings:input_type -> api.ListCanteenRatingsRequest + 17, // 42: api.Campus.GetDishRatings:input_type -> api.GetDishRatingsRequest + 21, // 43: api.Campus.CreateCanteenRating:input_type -> api.CreateCanteenRatingRequest + 23, // 44: api.Campus.CreateDishRating:input_type -> api.CreateDishRatingRequest + 24, // 45: api.Campus.ListAvailableDishTags:input_type -> api.ListAvailableDishTagsRequest + 26, // 46: api.Campus.ListNameTags:input_type -> api.ListNameTagsRequest + 28, // 47: api.Campus.ListAvailableCanteenTags:input_type -> api.ListAvailableCanteenTagsRequest + 34, // 48: api.Campus.ListCanteens:input_type -> api.ListCanteensRequest + 37, // 49: api.Campus.ListDishes:input_type -> api.ListDishesRequest + 39, // 50: api.Campus.ListResponsiblePerson:input_type -> api.ListResponsiblePersonRequest + 43, // 51: api.Campus.ListMoreInformation:input_type -> api.ListMoreInformationRequest + 45, // 52: api.Campus.ListOpeningTimes:input_type -> api.ListOpeningTimesRequest + 48, // 53: api.Campus.GetUpdateNote:input_type -> api.GetUpdateNoteRequest + 50, // 54: api.Campus.ListMovies:input_type -> api.ListMoviesRequest + 53, // 55: api.Campus.CreateFeedback:input_type -> api.CreateFeedbackRequest + 60, // 56: api.Campus.GetUploadStatus:input_type -> api.GetUploadStatusRequest + 62, // 57: api.Campus.GetNotification:input_type -> api.GetNotificationRequest + 64, // 58: api.Campus.GetNotificationConfirm:input_type -> api.GetNotificationConfirmRequest + 58, // 59: api.Campus.GetMember:input_type -> api.GetMemberRequest + 66, // 60: api.Campus.GetCanteenHeadCount:input_type -> api.GetCanteenHeadCountRequest + 2, // 61: api.Campus.CreateDevice:input_type -> api.CreateDeviceRequest + 4, // 62: api.Campus.DeleteDevice:input_type -> api.DeleteDeviceRequest + 13, // 63: api.Campus.ListNewsAlerts:output_type -> api.ListNewsAlertsReply + 10, // 64: api.Campus.ListNewsSources:output_type -> api.ListNewsSourcesReply + 7, // 65: api.Campus.ListNews:output_type -> api.ListNewsReply + 16, // 66: api.Campus.ListCanteenRatings:output_type -> api.ListCanteenRatingsReply + 18, // 67: api.Campus.GetDishRatings:output_type -> api.GetDishRatingsReply + 20, // 68: api.Campus.CreateCanteenRating:output_type -> api.CreateCanteenRatingReply + 22, // 69: api.Campus.CreateDishRating:output_type -> api.CreateDishRatingReply + 25, // 70: api.Campus.ListAvailableDishTags:output_type -> api.ListAvailableDishTagsReply + 27, // 71: api.Campus.ListNameTags:output_type -> api.ListNameTagsReply + 29, // 72: api.Campus.ListAvailableCanteenTags:output_type -> api.ListAvailableCanteenTagsReply + 35, // 73: api.Campus.ListCanteens:output_type -> api.ListCanteensReply + 38, // 74: api.Campus.ListDishes:output_type -> api.ListDishesReply + 40, // 75: api.Campus.ListResponsiblePerson:output_type -> api.ListResponsiblePersonReply + 44, // 76: api.Campus.ListMoreInformation:output_type -> api.ListMoreInformationReply + 46, // 77: api.Campus.ListOpeningTimes:output_type -> api.ListOpeningTimesReply + 49, // 78: api.Campus.GetUpdateNote:output_type -> api.GetUpdateNoteReply + 51, // 79: api.Campus.ListMovies:output_type -> api.ListMoviesReply + 55, // 80: api.Campus.CreateFeedback:output_type -> api.CreateFeedbackReply + 61, // 81: api.Campus.GetUploadStatus:output_type -> api.GetUploadStatusReply + 63, // 82: api.Campus.GetNotification:output_type -> api.GetNotificationReply + 65, // 83: api.Campus.GetNotificationConfirm:output_type -> api.GetNotificationConfirmReply + 59, // 84: api.Campus.GetMember:output_type -> api.GetMemberReply + 67, // 85: api.Campus.GetCanteenHeadCount:output_type -> api.GetCanteenHeadCountReply + 3, // 86: api.Campus.CreateDevice:output_type -> api.CreateDeviceReply + 5, // 87: api.Campus.DeleteDevice:output_type -> api.DeleteDeviceReply + 63, // [63:88] is the sub-list for method output_type + 38, // [38:63] is the sub-list for method input_type 38, // [38:38] is the sub-list for extension type_name 38, // [38:38] is the sub-list for extension extendee 0, // [0:38] is the sub-list for field type_name @@ -5286,30 +5161,6 @@ func file_tumdev_campus_backend_proto_init() { } } file_tumdev_campus_backend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOSDeviceRequestResponseRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_tumdev_campus_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOSDeviceRequestResponseReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_tumdev_campus_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*News); i { case 0: return &v.state @@ -5321,7 +5172,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsReply); i { case 0: return &v.state @@ -5333,7 +5184,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsRequest); i { case 0: return &v.state @@ -5345,7 +5196,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsSourcesRequest); i { case 0: return &v.state @@ -5357,7 +5208,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsSourcesReply); i { case 0: return &v.state @@ -5369,7 +5220,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewsSource); i { case 0: return &v.state @@ -5381,7 +5232,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsAlertsRequest); i { case 0: return &v.state @@ -5393,7 +5244,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNewsAlertsReply); i { case 0: return &v.state @@ -5405,7 +5256,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewsAlert); i { case 0: return &v.state @@ -5417,7 +5268,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCanteenRatingsRequest); i { case 0: return &v.state @@ -5429,7 +5280,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCanteenRatingsReply); i { case 0: return &v.state @@ -5441,7 +5292,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetDishRatingsRequest); i { case 0: return &v.state @@ -5453,7 +5304,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetDishRatingsReply); i { case 0: return &v.state @@ -5465,7 +5316,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SingleRatingReply); i { case 0: return &v.state @@ -5477,7 +5328,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateCanteenRatingReply); i { case 0: return &v.state @@ -5489,7 +5340,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateCanteenRatingRequest); i { case 0: return &v.state @@ -5501,7 +5352,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDishRatingReply); i { case 0: return &v.state @@ -5513,7 +5364,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateDishRatingRequest); i { case 0: return &v.state @@ -5525,7 +5376,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAvailableDishTagsRequest); i { case 0: return &v.state @@ -5537,7 +5388,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAvailableDishTagsReply); i { case 0: return &v.state @@ -5549,7 +5400,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNameTagsRequest); i { case 0: return &v.state @@ -5561,7 +5412,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNameTagsReply); i { case 0: return &v.state @@ -5573,7 +5424,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAvailableCanteenTagsRequest); i { case 0: return &v.state @@ -5585,7 +5436,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAvailableCanteenTagsReply); i { case 0: return &v.state @@ -5597,7 +5448,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TagsOverview); i { case 0: return &v.state @@ -5609,7 +5460,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTag); i { case 0: return &v.state @@ -5621,7 +5472,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTagNewRequest); i { case 0: return &v.state @@ -5633,7 +5484,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTagResult); i { case 0: return &v.state @@ -5645,7 +5496,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCanteensRequest); i { case 0: return &v.state @@ -5657,7 +5508,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCanteensReply); i { case 0: return &v.state @@ -5669,7 +5520,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Canteen); i { case 0: return &v.state @@ -5681,7 +5532,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListDishesRequest); i { case 0: return &v.state @@ -5693,7 +5544,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListDishesReply); i { case 0: return &v.state @@ -5705,7 +5556,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListResponsiblePersonRequest); i { case 0: return &v.state @@ -5717,7 +5568,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListResponsiblePersonReply); i { case 0: return &v.state @@ -5729,7 +5580,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResponsiblePerson); i { case 0: return &v.state @@ -5741,7 +5592,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomInformationElement); i { case 0: return &v.state @@ -5753,7 +5604,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMoreInformationRequest); i { case 0: return &v.state @@ -5765,7 +5616,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMoreInformationReply); i { case 0: return &v.state @@ -5777,7 +5628,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListOpeningTimesRequest); i { case 0: return &v.state @@ -5789,7 +5640,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListOpeningTimesReply); i { case 0: return &v.state @@ -5801,7 +5652,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpeningTimesMsgElement); i { case 0: return &v.state @@ -5813,7 +5664,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUpdateNoteRequest); i { case 0: return &v.state @@ -5825,7 +5676,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUpdateNoteReply); i { case 0: return &v.state @@ -5837,7 +5688,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMoviesRequest); i { case 0: return &v.state @@ -5849,7 +5700,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMoviesReply); i { case 0: return &v.state @@ -5861,7 +5712,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Movie); i { case 0: return &v.state @@ -5873,7 +5724,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateFeedbackRequest); i { case 0: return &v.state @@ -5885,7 +5736,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Coordinate); i { case 0: return &v.state @@ -5897,7 +5748,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateFeedbackReply); i { case 0: return &v.state @@ -5909,7 +5760,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateFeedbackImageReply); i { case 0: return &v.state @@ -5921,7 +5772,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateFeedbackImageRequest); i { case 0: return &v.state @@ -5933,7 +5784,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMemberRequest); i { case 0: return &v.state @@ -5945,7 +5796,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMemberReply); i { case 0: return &v.state @@ -5957,7 +5808,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUploadStatusRequest); i { case 0: return &v.state @@ -5969,7 +5820,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUploadStatusReply); i { case 0: return &v.state @@ -5981,7 +5832,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationRequest); i { case 0: return &v.state @@ -5993,7 +5844,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationReply); i { case 0: return &v.state @@ -6005,7 +5856,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationConfirmRequest); i { case 0: return &v.state @@ -6017,7 +5868,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationConfirmReply); i { case 0: return &v.state @@ -6029,7 +5880,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCanteenHeadCountRequest); i { case 0: return &v.state @@ -6041,7 +5892,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCanteenHeadCountReply); i { case 0: return &v.state @@ -6053,7 +5904,7 @@ func file_tumdev_campus_backend_proto_init() { return nil } } - file_tumdev_campus_backend_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListMoreInformationReply_MoreInformation); i { case 0: return &v.state @@ -6072,7 +5923,7 @@ func file_tumdev_campus_backend_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_tumdev_campus_backend_proto_rawDesc, NumEnums: 2, - NumMessages: 69, + NumMessages: 67, NumExtensions: 0, NumServices: 1, }, diff --git a/server/api/tumdev/campus_backend.pb.gw.go b/server/api/tumdev/campus_backend.pb.gw.go index 35568e48..a6db7dc9 100644 --- a/server/api/tumdev/campus_backend.pb.gw.go +++ b/server/api/tumdev/campus_backend.pb.gw.go @@ -847,32 +847,6 @@ func local_request_Campus_GetCanteenHeadCount_0(ctx context.Context, marshaler r } -func request_Campus_IOSDeviceRequestResponse_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IOSDeviceRequestResponseRequest - 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) - } - - msg, err := client.IOSDeviceRequestResponse(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Campus_IOSDeviceRequestResponse_0(ctx context.Context, marshaler runtime.Marshaler, server CampusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq IOSDeviceRequestResponseRequest - 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) - } - - msg, err := server.IOSDeviceRequestResponse(ctx, &protoReq) - return msg, metadata, err - -} - func request_Campus_CreateDevice_0(ctx context.Context, marshaler runtime.Marshaler, client CampusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateDeviceRequest var metadata runtime.ServerMetadata @@ -1532,31 +1506,6 @@ func RegisterCampusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) - mux.Handle("POST", pattern_Campus_IOSDeviceRequestResponse_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, "/api.Campus/IOSDeviceRequestResponse", runtime.WithHTTPPathPattern("/ios/notifications/deviceRequestResponse")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Campus_IOSDeviceRequestResponse_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_Campus_IOSDeviceRequestResponse_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_Campus_CreateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2154,28 +2103,6 @@ func RegisterCampusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) - mux.Handle("POST", pattern_Campus_IOSDeviceRequestResponse_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, "/api.Campus/IOSDeviceRequestResponse", runtime.WithHTTPPathPattern("/ios/notifications/deviceRequestResponse")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Campus_IOSDeviceRequestResponse_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_Campus_IOSDeviceRequestResponse_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_Campus_CreateDevice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -2342,8 +2269,6 @@ var ( pattern_Campus_GetCanteenHeadCount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"canteen", "headCount", "canteen_id"}, "")) - pattern_Campus_IOSDeviceRequestResponse_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"ios", "notifications", "deviceRequestResponse"}, "")) - pattern_Campus_CreateDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"device"}, "")) pattern_Campus_DeleteDevice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 1, 0, 4, 1, 5, 1}, []string{"device", "device_id"}, "")) @@ -2396,8 +2321,6 @@ var ( forward_Campus_GetCanteenHeadCount_0 = runtime.ForwardResponseMessage - forward_Campus_IOSDeviceRequestResponse_0 = runtime.ForwardResponseMessage - forward_Campus_CreateDevice_0 = runtime.ForwardResponseMessage forward_Campus_DeleteDevice_0 = runtime.ForwardResponseMessage diff --git a/server/api/tumdev/campus_backend.proto b/server/api/tumdev/campus_backend.proto index 6f853173..f46ae3f2 100644 --- a/server/api/tumdev/campus_backend.proto +++ b/server/api/tumdev/campus_backend.proto @@ -145,14 +145,6 @@ service Campus { option (google.api.http) = {get: "/canteen/headCount/{canteen_id}"}; } - // Endpoint for the iOS app to respond to background notifications requests - rpc IOSDeviceRequestResponse(IOSDeviceRequestResponseRequest) returns (IOSDeviceRequestResponseReply) { // TODO naming - option (google.api.http) = { - post: "/ios/notifications/deviceRequestResponse", - body: "*", - }; - } - // Create an device (Android/iOS/Windows) for push notifications rpc CreateDevice(CreateDeviceRequest) returns (CreateDeviceReply) { option (google.api.http) = { @@ -192,14 +184,6 @@ message DeleteDeviceReply { string device_id = 1; } -message IOSDeviceRequestResponseRequest { - string request_id = 1; - string payload = 2; -} - -message IOSDeviceRequestResponseReply { - string message = 1; -} message News { int64 id = 1; string title = 2; diff --git a/server/api/tumdev/campus_backend.swagger.json b/server/api/tumdev/campus_backend.swagger.json index b9d04e96..289e10b2 100644 --- a/server/api/tumdev/campus_backend.swagger.json +++ b/server/api/tumdev/campus_backend.swagger.json @@ -577,40 +577,6 @@ ] } }, - "/ios/notifications/deviceRequestResponse": { - "post": { - "summary": "Endpoint for the iOS app to respond to background notifications requests", - "description": "TODO naming", - "operationId": "Campus_IOSDeviceRequestResponse", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/apiIOSDeviceRequestResponseReply" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/rpcStatus" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/apiIOSDeviceRequestResponseRequest" - } - } - ], - "tags": [ - "Campus" - ] - } - }, "/members/{lrzId}": { "get": { "operationId": "Campus_GetMember", @@ -1263,25 +1229,6 @@ } } }, - "apiIOSDeviceRequestResponseReply": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - } - }, - "apiIOSDeviceRequestResponseRequest": { - "type": "object", - "properties": { - "requestId": { - "type": "string" - }, - "payload": { - "type": "string" - } - } - }, "apiListAvailableCanteenTagsReply": { "type": "object", "properties": { diff --git a/server/api/tumdev/campus_backend_grpc.pb.go b/server/api/tumdev/campus_backend_grpc.pb.go index f662ce61..572a7d3b 100644 --- a/server/api/tumdev/campus_backend_grpc.pb.go +++ b/server/api/tumdev/campus_backend_grpc.pb.go @@ -43,7 +43,6 @@ const ( Campus_GetNotificationConfirm_FullMethodName = "/api.Campus/GetNotificationConfirm" Campus_GetMember_FullMethodName = "/api.Campus/GetMember" Campus_GetCanteenHeadCount_FullMethodName = "/api.Campus/GetCanteenHeadCount" - Campus_IOSDeviceRequestResponse_FullMethodName = "/api.Campus/IOSDeviceRequestResponse" Campus_CreateDevice_FullMethodName = "/api.Campus/CreateDevice" Campus_DeleteDevice_FullMethodName = "/api.Campus/DeleteDevice" ) @@ -77,8 +76,6 @@ type CampusClient interface { GetNotificationConfirm(ctx context.Context, in *GetNotificationConfirmRequest, opts ...grpc.CallOption) (*GetNotificationConfirmReply, error) GetMember(ctx context.Context, in *GetMemberRequest, opts ...grpc.CallOption) (*GetMemberReply, error) GetCanteenHeadCount(ctx context.Context, in *GetCanteenHeadCountRequest, opts ...grpc.CallOption) (*GetCanteenHeadCountReply, error) - // Endpoint for the iOS app to respond to background notifications requests - IOSDeviceRequestResponse(ctx context.Context, in *IOSDeviceRequestResponseRequest, opts ...grpc.CallOption) (*IOSDeviceRequestResponseReply, error) // Create an device (Android/iOS/Windows) for push notifications CreateDevice(ctx context.Context, in *CreateDeviceRequest, opts ...grpc.CallOption) (*CreateDeviceReply, error) // Delete a device from push notifications @@ -325,15 +322,6 @@ func (c *campusClient) GetCanteenHeadCount(ctx context.Context, in *GetCanteenHe return out, nil } -func (c *campusClient) IOSDeviceRequestResponse(ctx context.Context, in *IOSDeviceRequestResponseRequest, opts ...grpc.CallOption) (*IOSDeviceRequestResponseReply, error) { - out := new(IOSDeviceRequestResponseReply) - err := c.cc.Invoke(ctx, Campus_IOSDeviceRequestResponse_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *campusClient) CreateDevice(ctx context.Context, in *CreateDeviceRequest, opts ...grpc.CallOption) (*CreateDeviceReply, error) { out := new(CreateDeviceReply) err := c.cc.Invoke(ctx, Campus_CreateDevice_FullMethodName, in, out, opts...) @@ -381,8 +369,6 @@ type CampusServer interface { GetNotificationConfirm(context.Context, *GetNotificationConfirmRequest) (*GetNotificationConfirmReply, error) GetMember(context.Context, *GetMemberRequest) (*GetMemberReply, error) GetCanteenHeadCount(context.Context, *GetCanteenHeadCountRequest) (*GetCanteenHeadCountReply, error) - // Endpoint for the iOS app to respond to background notifications requests - IOSDeviceRequestResponse(context.Context, *IOSDeviceRequestResponseRequest) (*IOSDeviceRequestResponseReply, error) // Create an device (Android/iOS/Windows) for push notifications CreateDevice(context.Context, *CreateDeviceRequest) (*CreateDeviceReply, error) // Delete a device from push notifications @@ -463,9 +449,6 @@ func (UnimplementedCampusServer) GetMember(context.Context, *GetMemberRequest) ( func (UnimplementedCampusServer) GetCanteenHeadCount(context.Context, *GetCanteenHeadCountRequest) (*GetCanteenHeadCountReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCanteenHeadCount not implemented") } -func (UnimplementedCampusServer) IOSDeviceRequestResponse(context.Context, *IOSDeviceRequestResponseRequest) (*IOSDeviceRequestResponseReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method IOSDeviceRequestResponse not implemented") -} func (UnimplementedCampusServer) CreateDevice(context.Context, *CreateDeviceRequest) (*CreateDeviceReply, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateDevice not implemented") } @@ -907,24 +890,6 @@ func _Campus_GetCanteenHeadCount_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Campus_IOSDeviceRequestResponse_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(IOSDeviceRequestResponseRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CampusServer).IOSDeviceRequestResponse(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Campus_IOSDeviceRequestResponse_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CampusServer).IOSDeviceRequestResponse(ctx, req.(*IOSDeviceRequestResponseRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Campus_CreateDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateDeviceRequest) if err := dec(in); err != nil { @@ -1056,10 +1021,6 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetCanteenHeadCount", Handler: _Campus_GetCanteenHeadCount_Handler, }, - { - MethodName: "IOSDeviceRequestResponse", - Handler: _Campus_IOSDeviceRequestResponse_Handler, - }, { MethodName: "CreateDevice", Handler: _Campus_CreateDevice_Handler, diff --git a/server/backend/campus_api/campus_api.go b/server/backend/campus_api/campus_api.go deleted file mode 100644 index 003cc646..00000000 --- a/server/backend/campus_api/campus_api.go +++ /dev/null @@ -1,58 +0,0 @@ -// Package campus_api handles all requests to the TUM Campus API and decodes the XML responses. -package campus_api - -import ( - "encoding/xml" - "errors" - "fmt" - "io" - "net/http" - "os" - - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" -) - -// FetchExamResultsPublished fetches all published exam results from the TUM Campus API using CAMPUS_API_TOKEN. -func FetchExamResultsPublished() (*model.TUMAPIPublishedExamResults, error) { - var examResultsPublished model.TUMAPIPublishedExamResults - token := os.Getenv("CAMPUS_API_TOKEN") - err := RequestCampusApi("/wbservicesbasic.pruefungenErgebnisse", token, &examResultsPublished) - if err != nil { - return nil, err - } - - return &examResultsPublished, nil -} - -func FetchGrades(token string) (*model.IOSGrades, error) { - var grades model.IOSGrades - err := RequestCampusApi("/wbservicesbasic.noten", token, &grades) - if err != nil { - return nil, err - } - - return &grades, nil -} - -func RequestCampusApi(path string, token string, response any) error { - requestUrl := fmt.Sprintf("https://campus.tum.de/tumonline%s?pToken=%s", path, token) - resp, err := http.Get(requestUrl) - if err != nil { - log.WithError(err).WithField("path", path).Error("Error while fetching url") - return errors.New("error while fetching " + path) - } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - log.WithError(err).Error("Error while closing body") - } - }(resp.Body) - - if err = xml.NewDecoder(resp.Body).Decode(&response); err != nil { - log.WithError(err).WithField("path", path).Error("Error while unmarshalling") - return errors.New("error while unmarshalling") - } - - return nil -} diff --git a/server/backend/cron/cronjobs.go b/server/backend/cron/cronjobs.go index 82d9b2a8..f78b8d9f 100644 --- a/server/backend/cron/cronjobs.go +++ b/server/backend/cron/cronjobs.go @@ -3,7 +3,6 @@ package cron import ( "time" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" "github.com/TUM-Dev/Campus-Backend/server/env" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -14,9 +13,8 @@ import ( ) type CronService struct { - db *gorm.DB - gf *gofeed.Parser - APNs *apns.Service + db *gorm.DB + gf *gofeed.Parser } // StorageDir is the directory where files are stored @@ -25,15 +23,12 @@ var StorageDir = "/Storage/" // target location of files // names for cron jobs as specified in database const ( - NewsType = "news" - FileDownloadType = "fileDownload" - DishNameDownload = "dishNameDownload" - CanteenHeadcount = "canteenHeadCount" - IOSNotifications = "iosNotifications" - IOSActivityReset = "iosActivityReset" - NewExamResultsHook = "newExamResultsHook" - MovieType = "movie" - FeedbackEmail = "feedbackEmail" + NewsType = "news" + FileDownloadType = "fileDownload" + DishNameDownload = "dishNameDownload" + CanteenHeadcount = "canteenHeadCount" + MovieType = "movie" + FeedbackEmail = "feedbackEmail" /* MensaType = "mensa" AlarmType = "alarm" */ @@ -41,9 +36,8 @@ const ( func New(db *gorm.DB) *CronService { return &CronService{ - db: db, - gf: gofeed.NewParser(), - APNs: apns.NewCronService(db), + db: db, + gf: gofeed.NewParser(), } } @@ -61,9 +55,6 @@ func (c *CronService) Run() error { FileDownloadType, DishNameDownload, CanteenHeadcount, - IOSNotifications, - IOSActivityReset, - NewExamResultsHook, MovieType, FeedbackEmail, ). @@ -90,8 +81,6 @@ func (c *CronService) Run() error { if env.IsMensaCronActive() { g.Go(c.dishNameDownloadCron) } - case NewExamResultsHook: - g.Go(func() error { return c.newExamResultsHookCron() }) case MovieType: g.Go(func() error { return c.movieCron() }) /* @@ -105,10 +94,6 @@ func (c *CronService) Run() error { */ case CanteenHeadcount: g.Go(func() error { return c.canteenHeadCountCron() }) - case IOSNotifications: - g.Go(func() error { return c.iosNotificationsCron() }) - case IOSActivityReset: - g.Go(func() error { return c.iosActivityReset() }) case FeedbackEmail: g.Go(func() error { return c.feedbackEmailCron() }) } diff --git a/server/backend/cron/ios_notifications.go b/server/backend/cron/ios_notifications.go deleted file mode 100644 index fa39a0e4..00000000 --- a/server/backend/cron/ios_notifications.go +++ /dev/null @@ -1,30 +0,0 @@ -package cron - -import ( - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/devices_activity_reset" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/scheduled_update_log" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/scheduling" -) - -// Starts the cron job for sending iOS notifications reuses -// the APNs client (apns.Service) stored in CronService -func (c *CronService) iosNotificationsCron() error { - if !c.APNs.IsActive { - return nil - } - - devicesRepo := device.NewRepository(c.db) - schedulerRepo := scheduled_update_log.NewRepository(c.db) - - service := scheduling.NewService(devicesRepo, schedulerRepo, c.APNs) - - return service.HandleScheduledCron() -} - -// Resets the activity of all devices to 0 every day, week, month or year -func (c *CronService) iosActivityReset() error { - service := devices_activity_reset.NewService(c.db) - - return service.HandleScheduledActivityReset() -} diff --git a/server/backend/cron/new_exam_results_hook.go b/server/backend/cron/new_exam_results_hook.go deleted file mode 100644 index 94a0dcfc..00000000 --- a/server/backend/cron/new_exam_results_hook.go +++ /dev/null @@ -1,15 +0,0 @@ -package cron - -import ( - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/backend/new_exam_results_hook/scheduling" -) - -func (c *CronService) newExamResultsHookCron() error { - repo := scheduling.NewRepository(c.db) - devicesRepo := device.NewRepository(c.db) - - service := scheduling.NewService(repo, devicesRepo, c.APNs) - - return service.HandleScheduledCron() -} diff --git a/server/backend/device.go b/server/backend/device.go index d899f159..752ce3c9 100644 --- a/server/backend/device.go +++ b/server/backend/device.go @@ -132,8 +132,7 @@ func (s *CampusServer) CreateDevice(_ context.Context, req *pb.CreateDeviceReque case pb.DeviceType_ANDROID: return nil, status.Error(codes.Unimplemented, "android device creation not implemented") case pb.DeviceType_IOS: - service := s.GetIOSDeviceService() - return service.CreateDevice(req) + return nil, status.Error(codes.Unimplemented, "ios device creation not implemented") case pb.DeviceType_WINDOWS: return nil, status.Error(codes.Unimplemented, "windows device creation not implemented") } @@ -150,8 +149,7 @@ func (s *CampusServer) DeleteDevice(_ context.Context, req *pb.DeleteDeviceReque case pb.DeviceType_ANDROID: return nil, status.Error(codes.Unimplemented, "android device remove not implemented") case pb.DeviceType_IOS: - service := s.GetIOSDeviceService() - return service.DeleteDevice(req) + return nil, status.Error(codes.Unimplemented, "ios device remove not implemented") case pb.DeviceType_WINDOWS: return nil, status.Error(codes.Unimplemented, "windows device remove not implemented") } diff --git a/server/backend/ios_notifications.go b/server/backend/ios_notifications.go deleted file mode 100644 index 392997fd..00000000 --- a/server/backend/ios_notifications.go +++ /dev/null @@ -1,40 +0,0 @@ -package backend - -import ( - "context" - - pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/request_response" - "gorm.io/gorm" -) - -type IOSNotificationsService struct { - DB *gorm.DB - APNSToken *apns.JWTToken - IsActive bool -} - -func (s *CampusServer) GetIOSDeviceService() *device.Service { - repository := device.NewRepository(s.db) - - return device.NewService(repository) -} - -func (s *CampusServer) GetIOSAPNsService() *apns.Service { - repository := apns.NewRepository(s.db, s.GetIOSNotificationsService().APNSToken) - - return apns.NewService(repository) -} - -func (s *CampusServer) GetIOSRequestResponseService() *request_response.Service { - repository := request_response.NewRepository(s.db, s.GetIOSNotificationsService().APNSToken) - - return request_response.NewService(repository) -} - -func (s *CampusServer) IOSDeviceRequestResponse(_ context.Context, req *pb.IOSDeviceRequestResponseRequest) (*pb.IOSDeviceRequestResponseReply, error) { - service := s.GetIOSRequestResponseService() - return service.HandleDeviceRequestResponse(req, s.iOSNotificationsService.IsActive) -} diff --git a/server/backend/ios_notifications/apns/jwt_token.go b/server/backend/ios_notifications/apns/jwt_token.go deleted file mode 100644 index 7e4df0c5..00000000 --- a/server/backend/ios_notifications/apns/jwt_token.go +++ /dev/null @@ -1,139 +0,0 @@ -// Package apns handles the generation and validation of the JWT token for the APNs service -package apns - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" - "os" - "path/filepath" - "sync" - "time" - - "github.com/golang-jwt/jwt" - log "github.com/sirupsen/logrus" -) - -type JWTToken struct { - sync.Mutex - EncryptionKey *ecdsa.PrivateKey - KeyId string - TeamId string - IssuedAt int64 - Bearer string -} - -func NewToken() (*JWTToken, error) { - encryptionKey, err := EncryptionKeyFromFile() - if err != nil { - return nil, err - } - - token := JWTToken{ - EncryptionKey: encryptionKey, - KeyId: os.Getenv("APNS_KEY_ID"), - TeamId: os.Getenv("APNS_TEAM_ID"), - } - - if err = token.Generate(); err != nil { - return nil, err - } - - return &token, nil -} - -// EncryptionKeyFromFile reads the APNs encryption key from the file system -// and returns it as an ecdsa.PrivateKey -// The file location is defined by the APNS_P8_FILE_PATH environment variable -func EncryptionKeyFromFile() (*ecdsa.PrivateKey, error) { - path, err := filepath.Abs(os.Getenv("APNS_P8_FILE_PATH")) - - if err != nil { - log.Error("No valid path to AuthKey") - - return nil, err - } - - data, err := os.ReadFile(path) - if err != nil { - log.Error("Could not read APNs encryption key from file") - - return nil, err - } - - block, _ := pem.Decode(data) - - if block == nil { - log.Error("Could not decode APNs encryption key from file") - - return nil, errors.New("failed to parse token: AuthKey must be a valid .p8 PEM file") - } - - key, err := x509.ParsePKCS8PrivateKey(block.Bytes) - - if err != nil { - log.Error("Could not parse APNs encryption key from file") - - return nil, err - } - - if ecdsaKey, ok := key.(*ecdsa.PrivateKey); ok { - return ecdsaKey, nil - } - - return nil, errors.New("failed to parse token: AuthKey must be of type ecdsa.PrivateKey") -} - -func (t *JWTToken) GenerateNewTokenIfExpired() (bearer string) { - t.Lock() - defer t.Unlock() - - if t.IsExpired() { - err := t.Generate() - if err != nil { - return "" - } - } - - return t.Bearer -} - -func (t *JWTToken) IsExpired() bool { - return currentTimestamp() >= (t.IssuedAt + 3000) -} - -func (t *JWTToken) Generate() error { - if t.EncryptionKey == nil { - return errors.New("failed to parse token: AuthKey was nil") - } - - issuedAt := currentTimestamp() - - jwtToken := &jwt.Token{ - Header: map[string]interface{}{ - "alg": "ES256", - "kid": t.KeyId, - }, - Claims: jwt.MapClaims{ - "iss": t.TeamId, - "iat": issuedAt, - }, - Method: jwt.SigningMethodES256, - } - - token, err := jwtToken.SignedString(t.EncryptionKey) - - if err != nil { - return err - } - - t.IssuedAt = issuedAt - t.Bearer = token - - return nil -} - -func currentTimestamp() int64 { - return time.Now().UTC().Unix() -} diff --git a/server/backend/ios_notifications/apns/repository.go b/server/backend/ios_notifications/apns/repository.go deleted file mode 100644 index c3eb29f5..00000000 --- a/server/backend/ios_notifications/apns/repository.go +++ /dev/null @@ -1,117 +0,0 @@ -package apns - -import ( - "bytes" - "encoding/json" - "errors" - "io" - "net/http" - "strconv" - "time" - - "github.com/TUM-Dev/Campus-Backend/server/env" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" - "golang.org/x/net/http2" - "gorm.io/gorm" -) - -type Repository struct { - DB gorm.DB - Token *JWTToken - httpClient *http.Client -} - -// ApnsUrl uses the environment variable ENVIRONMENT to determine whether -// to use the production or development APNs URL. -func (r *Repository) ApnsUrl(DeviceId string) string { - if env.IsProd() { - return "https://api.push.apple.com:443/3/device/" + DeviceId - } - return "https://api.sandbox.push.apple.com:443/3/device/" + DeviceId -} - -// CreateCampusTokenRequest creates a request log in the database that can be referred to -// when the app responds to the background notification. -func (r *Repository) CreateCampusTokenRequest(deviceId string) (*model.IOSDeviceRequestLog, error) { - return r.CreateRequest(deviceId, model.IOSBackgroundCampusTokenRequest) -} - -func (r *Repository) CreateRequest(deviceId string, requestType model.IOSBackgroundNotificationType) (*model.IOSDeviceRequestLog, error) { - var request model.IOSDeviceRequestLog - - tx := r.DB.Raw(` - insert into ios_device_request_logs (device_id, request_type) - values (?, ?) - returning device_id, request_id, request_type; - `, deviceId, requestType.String()).Scan(&request) - - if err := tx.Error; err != nil { - return nil, err - } - - return &request, nil -} - -func (r *Repository) SendNotification(notification *model.IOSNotificationPayload, apnsPushType model.IOSAPNSPushType) (*model.IOSRemoteNotificationResponse, error) { - body, _ := notification.MarshalJSON() - - req, _ := http.NewRequest(http.MethodPost, r.ApnsUrl(notification.DeviceId), bytes.NewBuffer(body)) - - // can be e.g. alert or background - req.Header.Set("apns-push-type", apnsPushType.String()) - req.Header.Set("apns-topic", "de.tum.tca") - // can be a value between 1 and 10 - req.Header.Set("apns-priority", strconv.Itoa(10)) - - bearer := r.Token.GenerateNewTokenIfExpired() - req.Header.Set("authorization", "bearer "+bearer) - - resp, err := r.httpClient.Do(req) - if err != nil { - log.WithError(err).Error("Could not send notification") - return nil, errors.New("could not send notification") - } - defer func(Body io.ReadCloser) { - if err := Body.Close(); err != nil { - log.WithError(err).Error("Could not close body") - } - }(resp.Body) - - var response model.IOSRemoteNotificationResponse - if err := json.NewDecoder(resp.Body).Decode(&response); err != nil && err != io.EOF { - log.WithError(err).Error("Could not decode APNs response") - return nil, errors.New("could not decode apns response") - } - - return &response, nil -} - -func NewRepository(db *gorm.DB, token *JWTToken) *Repository { - transport := &http2.Transport{ - ReadIdleTimeout: 15 * time.Second, - } - - return &Repository{ - DB: *db, - Token: token, - httpClient: &http.Client{ - Transport: transport, - Timeout: 60 * time.Second, - }, - } -} - -func NewCronRepository(db *gorm.DB) (*Repository, error) { - if err := ValidateRequirementsForIOSNotificationsService(); err != nil { - log.WithError(err).Warn("Failed to validate requirements for ios notifications service") - return nil, err - } - - token, err := NewToken() - if err != nil { - log.WithError(err).Error("Could not create APNs token") - } - - return NewRepository(db, token), nil -} diff --git a/server/backend/ios_notifications/apns/service.go b/server/backend/ios_notifications/apns/service.go deleted file mode 100644 index 27700525..00000000 --- a/server/backend/ios_notifications/apns/service.go +++ /dev/null @@ -1,69 +0,0 @@ -// Package apns contains the logic for sending push notifications to iOS devices. -// and communicating with the Apple Push Notification Service (APNs). -package apns - -import ( - "errors" - "os" - - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" -) - -var ( - ErrCouldNotCreateTokenRequest = errors.New("could not create token request") -) - -type Service struct { - Repository *Repository - IsActive bool -} - -// RequestGradeUpdateForDevice stores a Request ID to the database and sends a background -// notification to the device with the given deviceID. -// The device will then send an update request to the server including the CampusToken -// and the request ID. -func (s *Service) RequestGradeUpdateForDevice(deviceID string) error { - campusRequestToken, err := s.Repository.CreateCampusTokenRequest(deviceID) - if err != nil { - log.WithError(err).Error("Could not create campus token request") - return ErrCouldNotCreateTokenRequest - } - - notification := model.NewIOSNotificationPayload(deviceID).Background(campusRequestToken.RequestID, model.IOSBackgroundCampusTokenRequest) - - if _, err := s.Repository.SendNotification(notification, model.IOSAPNSPushTypeBackground); err != nil { - log.WithError(err).Error("Could not send background notification") - return errors.New("could not send notification") - } - return nil -} - -func ValidateRequirementsForIOSNotificationsService() error { - for _, envVar := range []string{"APNS_KEY_ID", "APNS_TEAM_ID", "APNS_P8_FILE_PATH"} { - if os.Getenv(envVar) == "" { - return errors.New(envVar + " env variable is not set") - } - } - - if _, err := EncryptionKeyFromFile(); err != nil { - return errors.New("APNS P8 token is not valid or not set") - } - return nil -} - -func NewService(repository *Repository) *Service { - return &Service{ - Repository: repository, - IsActive: true, - } -} - -func NewCronService(db *gorm.DB) *Service { - if repo, err := NewCronRepository(db); err != nil { - return &Service{IsActive: false} - } else { - return NewService(repo) - } -} diff --git a/server/backend/ios_notifications/crypto/encrypted_string.go b/server/backend/ios_notifications/crypto/encrypted_string.go deleted file mode 100644 index 01654a7b..00000000 --- a/server/backend/ios_notifications/crypto/encrypted_string.go +++ /dev/null @@ -1,122 +0,0 @@ -// Package crypto provides functions for encrypting and decrypting strings using AES-256-GCM. -package crypto - -import ( - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/base64" - "encoding/pem" - "errors" - - log "github.com/sirupsen/logrus" -) - -type EncryptedString string - -func (e *EncryptedString) String() string { - return string(*e) -} - -func AsymmetricEncrypt(plaintext string, publicKey string) (*EncryptedString, error) { - pub, err := StringToPublicKey(publicKey) - - if err != nil { - return nil, err - } - - oaep, err := rsa.EncryptOAEP( - sha256.New(), - rand.Reader, - pub, - []byte(plaintext), - nil, - ) - - if err != nil { - return nil, err - } - - encryptedString := EncryptedString(base64.StdEncoding.EncodeToString(oaep)) - - return &encryptedString, nil -} - -func StringToPublicKey(pub string) (*rsa.PublicKey, error) { - block, _ := pem.Decode([]byte(pub)) - if block == nil { - return nil, errors.New("failed to parse PEM block containing the public key") - } - - key, err := x509.ParsePKIXPublicKey(block.Bytes) - if err != nil { - return nil, errors.New("failed to parse DER encoded public key: " + err.Error()) - } - - if pubKey, ok := key.(*rsa.PublicKey); !ok { - return nil, errors.New("failed to parse DER encoded public key: " + err.Error()) - } else { - return pubKey, nil - } -} - -func SymmetricEncrypt(plaintext string, key string) (*EncryptedString, error) { - bytesKey := []byte(key) - bytesPlaintext := []byte(plaintext) - - c, err := aes.NewCipher(bytesKey) - if err != nil { - log.WithError(err).Error("Could not create cipher") - return nil, err - } - - gcm, err := cipher.NewGCM(c) - if err != nil { - log.WithError(err).Error("Could not create GCM") - return nil, err - } - - nonce := make([]byte, gcm.NonceSize()) - - if _, err = rand.Read(nonce); err != nil { - log.WithError(err).Error("Could not read random bytes") - return nil, err - } - - ciphertext := gcm.Seal(nonce, nonce, bytesPlaintext, nil) - - encryptedString := EncryptedString(base64.StdEncoding.EncodeToString(ciphertext)) - - return &encryptedString, nil -} - -func SymmetricDecrypt(encryptedString EncryptedString, key string) (string, error) { - bytesKey := []byte(key) - bytesEncryptedString, err := base64.StdEncoding.DecodeString(string(encryptedString)) - if err != nil { - return "", err - } - - c, err := aes.NewCipher(bytesKey) - if err != nil { - return "", err - } - - gcm, err := cipher.NewGCM(c) - if err != nil { - return "", err - } - - nonceSize := gcm.NonceSize() - nonce, ciphertext := bytesEncryptedString[:nonceSize], bytesEncryptedString[nonceSize:] - - plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) - if err != nil { - return "", err - } - - return string(plaintext), nil -} diff --git a/server/backend/ios_notifications/device/repository.go b/server/backend/ios_notifications/device/repository.go deleted file mode 100644 index 6c740ab6..00000000 --- a/server/backend/ios_notifications/device/repository.go +++ /dev/null @@ -1,108 +0,0 @@ -package device - -import ( - "errors" - - "github.com/TUM-Dev/Campus-Backend/server/model" - "gorm.io/gorm" -) - -type Repository struct { - DB *gorm.DB -} - -func (repository *Repository) CreateDevice(device *model.IOSDevice) error { - return repository.DB.Transaction(func(tx *gorm.DB) error { - - var foundDevice model.IOSDevice - res := tx.First(&foundDevice, "device_id = ?", device.DeviceID) - - if errors.Is(res.Error, gorm.ErrRecordNotFound) { - return tx.Create(device).Error - } - - if res.Error != nil { - return res.Error - } - - newDevice := model.IOSDevice{ - DeviceID: device.DeviceID, - PublicKey: device.PublicKey, - ActivityToday: foundDevice.ActivityToday + 1, - ActivityThisWeek: foundDevice.ActivityThisWeek + 1, - ActivityThisMonth: foundDevice.ActivityThisMonth + 1, - ActivityThisYear: foundDevice.ActivityThisYear + 1, - } - - return tx.Save(&newDevice).Error - }) -} - -func (repository *Repository) DeleteDevice(deviceId string) error { - return repository.DB.Delete(&model.IOSDevice{DeviceID: deviceId}).Error -} - -func (repository *Repository) GetDevices() ([]model.IOSDevice, error) { - var devices []model.IOSDevice - if err := repository.DB.Find(&devices).Error; err != nil { - return []model.IOSDevice{}, err - } - - return devices, nil -} - -func (repository *Repository) GetDevice(id string) (*model.IOSDevice, error) { - var device *model.IOSDevice - if err := repository.DB.First(&device, "device_id = ?", id).Error; err != nil { - return nil, err - } - - return device, nil -} - -// GetDevicesThatShouldUpdateGrades returns a list of devices that should be updated -// A device that needs to be updated is either a new device or a device that has not -// been updated in the last model.IOSMinimumUpdateInterval minutes -func (repository *Repository) GetDevicesThatShouldUpdateGrades() ([]model.IOSDeviceLastUpdated, error) { - var devices []model.IOSDeviceLastUpdated - - tx := repository.DB.Raw(`select d.device_id, ul.created_at as last_updated, d.public_key - from ios_devices d - left join ios_scheduled_update_logs ul on d.device_id = ul.device_id - where ul.created_at is null - or (ul.type = ? - and ul.created_at < date_sub(now(), interval ? minute)) - group by d.device_id, ul.created_at - order by ul.created_at`, - model.IOSUpdateTypeGrades, - model.IOSMinimumUpdateInterval, - ).Scan(&devices) - - if tx.Error != nil { - return nil, tx.Error - } - - return devices, nil -} - -func (repository *Repository) ResetDevicesDailyActivity() error { - return repository.DB.Model(model.IOSDevice{}).Where("activity_today != ?", 0).Update("activity_today", 0).Error -} - -func (repository *Repository) ResetDevicesWeeklyActivity() error { - return repository.DB.Model(model.IOSDevice{}).Where("activity_this_week != ?", 0).Update("activity_this_week", 0).Error -} - -func (repository *Repository) ResetDevicesMonthlyActivity() error { - return repository.DB.Model(model.IOSDevice{}).Where("activity_this_month != ?", 0).Update("activity_this_month", 0).Error -} - -func (repository *Repository) ResetDevicesYearlyActivity() error { - return repository.DB.Model(model.IOSDevice{}).Where("activity_this_year != ?", 0).Update("activity_this_year", 0).Error -} - -func NewRepository(db *gorm.DB) *Repository { - return &Repository{ - DB: db, - } -} diff --git a/server/backend/ios_notifications/device/service.go b/server/backend/ios_notifications/device/service.go deleted file mode 100644 index 46d5ef70..00000000 --- a/server/backend/ios_notifications/device/service.go +++ /dev/null @@ -1,57 +0,0 @@ -// Package device provides functions to create/delete ios devices -package device - -import ( - pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" - "github.com/TUM-Dev/Campus-Backend/server/model" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -type Service struct { - Repository *Repository -} - -var ( - iosRegisteredDevices = promauto.NewGauge(prometheus.GaugeOpts{ - Subsystem: "ios", - Name: "ios_created_devices", - Help: "The number of currently created ios devices", - }) -) - -func (service *Service) CreateDevice(req *pb.CreateDeviceRequest) (*pb.CreateDeviceReply, error) { - device := model.IOSDevice{ - DeviceID: req.DeviceId, - PublicKey: req.PublicKey, - } - - if err := service.Repository.CreateDevice(&device); err != nil { - return nil, status.Error(codes.Internal, "Could not create device") - } - iosRegisteredDevices.Inc() - - return &pb.CreateDeviceReply{ - DeviceId: device.DeviceID, - }, nil -} - -func (service *Service) DeleteDevice(req *pb.DeleteDeviceRequest) (*pb.DeleteDeviceReply, error) { - if err := service.Repository.DeleteDevice(req.DeviceId); err != nil { - return nil, status.Error(codes.Internal, "Could not delete device") - } - - iosRegisteredDevices.Dec() - return &pb.DeleteDeviceReply{ - DeviceId: req.DeviceId, - }, nil -} - -func NewService(db *Repository) *Service { - return &Service{ - Repository: db, - } -} diff --git a/server/backend/ios_notifications/devices_activity_reset/repository.go b/server/backend/ios_notifications/devices_activity_reset/repository.go deleted file mode 100644 index 9e8cf609..00000000 --- a/server/backend/ios_notifications/devices_activity_reset/repository.go +++ /dev/null @@ -1,116 +0,0 @@ -package devices_activity_reset - -import ( - "time" - - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" - "gorm.io/gorm/clause" -) - -type Repository struct { - DB *gorm.DB -} - -func (repo *Repository) GetDevicesActivityResets() ([]model.IOSDevicesActivityReset, error) { - var resets []model.IOSDevicesActivityReset - if err := repo.DB.Find(&resets).Error; err != nil { - return nil, err - } - - return resets, nil -} - -func (repo *Repository) GetDevicesActivityResetDaily() (*model.IOSDevicesActivityReset, error) { - return repo.GetDevicesActivityReset(model.IOSDevicesActivityResetTypeDay) -} - -func (repo *Repository) GetDevicesActivityResetWeekly() (*model.IOSDevicesActivityReset, error) { - return repo.GetDevicesActivityReset(model.IOSDevicesActivityResetTypeWeek) -} - -func (repo *Repository) GetDevicesActivityResetMonthly() (*model.IOSDevicesActivityReset, error) { - return repo.GetDevicesActivityReset(model.IOSDevicesActivityResetTypeMonth) -} - -func (repo *Repository) GetDevicesActivityResetYearly() (*model.IOSDevicesActivityReset, error) { - return repo.GetDevicesActivityReset(model.IOSDevicesActivityResetTypeYear) -} - -func (repo *Repository) GetDevicesActivityReset(resetType string) (*model.IOSDevicesActivityReset, error) { - var reset model.IOSDevicesActivityReset - if err := repo.DB.First(&reset, "type = ?", resetType).Error; err != nil { - return nil, err - } - - return &reset, nil -} - -func (repo *Repository) ResettedDevicesDaily() error { - return repo.ResetActivityNow(model.IOSDevicesActivityResetTypeDay) -} - -func (repo *Repository) ResettedDevicesWeekly() error { - return repo.ResetActivityNow(model.IOSDevicesActivityResetTypeWeek) -} - -func (repo *Repository) ResettedDevicesMonthly() error { - return repo.ResetActivityNow(model.IOSDevicesActivityResetTypeMonth) -} - -func (repo *Repository) ResettedDevicesYearly() error { - return repo.ResetActivityNow(model.IOSDevicesActivityResetTypeYear) -} - -func (repo *Repository) ResetActivityNow(resetType string) error { - reset := model.IOSDevicesActivityReset{ - Type: resetType, - LastReset: time.Now(), - } - - return repo.ResetActivity(&reset) -} - -func (repo *Repository) ResetActivity(reset *model.IOSDevicesActivityReset) error { - res := repo.DB.Clauses( - clause.OnConflict{ - Columns: []clause.Column{{Name: "type"}}, - DoUpdates: clause.AssignmentColumns([]string{ - "last_reset", - }), - }, - ).Create(&reset) - - return res.Error -} - -func (repo *Repository) CreateInitialRecords() { - now := time.Now() - - types := []string{ - model.IOSDevicesActivityResetTypeDay, - model.IOSDevicesActivityResetTypeWeek, - model.IOSDevicesActivityResetTypeMonth, - model.IOSDevicesActivityResetTypeYear, - } - - // iterate over types - for _, resetType := range types { - reset := model.IOSDevicesActivityReset{ - Type: resetType, - LastReset: now, - } - - if err := repo.DB.Create(&reset).Error; err != nil { - log.WithError(err).WithField("resetType", resetType).Error("Failed to create IOSDevicesActivityReset") - continue - } - } -} - -func NewRepository(db *gorm.DB) *Repository { - return &Repository{ - DB: db, - } -} diff --git a/server/backend/ios_notifications/devices_activity_reset/service.go b/server/backend/ios_notifications/devices_activity_reset/service.go deleted file mode 100644 index 33bf89d9..00000000 --- a/server/backend/ios_notifications/devices_activity_reset/service.go +++ /dev/null @@ -1,86 +0,0 @@ -package devices_activity_reset - -import ( - "time" - - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" -) - -type Service struct { - Repository *Repository -} - -func (service *Service) HandleScheduledActivityReset() error { - daily, err := service.Repository.GetDevicesActivityResetDaily() - if err != nil { - service.Repository.CreateInitialRecords() - return nil - } - - weekly, err := service.Repository.GetDevicesActivityResetWeekly() - if err != nil { - return err - } - - monthly, err := service.Repository.GetDevicesActivityResetMonthly() - if err != nil { - return err - } - - yearly, err := service.Repository.GetDevicesActivityResetYearly() - if err != nil { - return err - } - - now := time.Now() - - devicesRepo := device.NewRepository(service.Repository.DB) - - if now.Sub(daily.LastReset).Hours() > 24 { - if err := service.Repository.ResettedDevicesDaily(); err != nil { - log.WithError(err).Error("while resetting devices daily") - } - - if err := devicesRepo.ResetDevicesDailyActivity(); err != nil { - log.WithError(err).Error("while resetting devices daily activity") - } - } - - if now.Sub(weekly.LastReset).Hours() > 168 { - if err := service.Repository.ResettedDevicesWeekly(); err != nil { - log.WithError(err).Error("while resetting devices weekly") - } - - if err := devicesRepo.ResetDevicesWeeklyActivity(); err != nil { - log.WithError(err).Error("while resetting devices weekly activity") - } - } - - if now.Sub(monthly.LastReset).Hours() > 730 { - if err := service.Repository.ResettedDevicesMonthly(); err != nil { - log.WithError(err).Error("while resetting devices monthly") - } - - if err := devicesRepo.ResetDevicesMonthlyActivity(); err != nil { - log.WithError(err).Error("while resetting devices monthly activity") - } - } - - if now.Sub(yearly.LastReset).Hours() > 8760 { - if err := service.Repository.ResettedDevicesYearly(); err != nil { - log.WithError(err).Error("while resetting devices yearly") - } - - if err := devicesRepo.ResetDevicesYearlyActivity(); err != nil { - log.WithError(err).Error("while resetting devices yearly activity") - } - } - - return nil -} - -func NewService(db *gorm.DB) *Service { - return &Service{Repository: NewRepository(db)} -} diff --git a/server/backend/ios_notifications/request_response/repository.go b/server/backend/ios_notifications/request_response/repository.go deleted file mode 100644 index 45fb44ae..00000000 --- a/server/backend/ios_notifications/request_response/repository.go +++ /dev/null @@ -1,59 +0,0 @@ -package request_response - -import ( - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" - "github.com/TUM-Dev/Campus-Backend/server/model" - "gorm.io/gorm" -) - -type Repository struct { - DB *gorm.DB - Token *apns.JWTToken -} - -func (r *Repository) SaveEncryptedGrade(grade *model.IOSEncryptedGrade) error { - return r.DB.Create(grade).Error -} - -func (r *Repository) GetIOSDeviceRequest(requestId string) (*model.IOSDeviceRequestLog, error) { - var request model.IOSDeviceRequestLog - if err := r.DB.First(&request, "request_id = ?", requestId).Error; err != nil { - return nil, err - } - - return &request, nil -} - -func (r *Repository) GetIOSEncryptedGrades(deviceId string) ([]model.IOSEncryptedGrade, error) { - var grades []model.IOSEncryptedGrade - if err := r.DB.Find(&grades, "device_id = ?", deviceId).Error; err != nil { - return nil, err - } - - return grades, nil -} - -func (r *Repository) DeleteEncryptedGrades(deviceId string) error { - return r.DB.Delete(&model.IOSEncryptedGrade{}, "device_id = ?", deviceId).Error -} - -func (r *Repository) DeleteRequestLog(requestId string) error { - return r.DB.Delete(&model.IOSDeviceRequestLog{}, "request_id = ?", requestId).Error -} - -func (r *Repository) DeleteAllRequestLogsForThisDeviceWithType(requestLog *model.IOSDeviceRequestLog) error { - return r.DB. - Delete( - &model.IOSDeviceRequestLog{}, - "device_id = ? and request_type = ?", - requestLog.DeviceID, - requestLog.RequestType, - ).Error -} - -func NewRepository(db *gorm.DB, token *apns.JWTToken) *Repository { - return &Repository{ - DB: db, - Token: token, - } -} diff --git a/server/backend/ios_notifications/request_response/service.go b/server/backend/ios_notifications/request_response/service.go deleted file mode 100644 index 7a79372d..00000000 --- a/server/backend/ios_notifications/request_response/service.go +++ /dev/null @@ -1,206 +0,0 @@ -// Package request_response provides functionality to handle device requests. -// Device Requests are requests that are sent from the device to the server when the -// device received a background push notification from the backend. -package request_response - -import ( - "fmt" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - - pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" - "github.com/TUM-Dev/Campus-Backend/server/backend/campus_api" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -type Service struct { - Repository *Repository -} - -var collectedNewGrades = promauto.NewHistogram(prometheus.HistogramOpts{ - Name: "ios_new_grades", - Help: "The total number of processed events", - Buckets: prometheus.LinearBuckets(0, 5, 5), -}) - -func (service *Service) HandleDeviceRequestResponse(req *pb.IOSDeviceRequestResponseRequest, apnsIsActive bool) (*pb.IOSDeviceRequestResponseReply, error) { - log.WithField("requestId", req.RequestId).Trace("Handling request") - - requestLog, err := service.Repository.GetIOSDeviceRequest(req.RequestId) - if err != nil { - log.WithError(err).Error("Could not get request") - return nil, status.Error(codes.Internal, "Could not get request, probably request is already outdated") - } - - switch requestLog.RequestType { - case model.IOSBackgroundCampusTokenRequest.String(): - if req.Payload == "" { - return nil, status.Error(codes.InvalidArgument, "Payload is empty") - } - - if !apnsIsActive { - return nil, status.Error(codes.Internal, "APNS is not active") - } - - return service.handleDeviceCampusTokenRequest(requestLog, req.Payload) - default: - return nil, status.Error(codes.InvalidArgument, "Unknown request type") - } -} - -func (service *Service) handleDeviceCampusTokenRequest(requestLog *model.IOSDeviceRequestLog, campusToken string) (*pb.IOSDeviceRequestResponseReply, error) { - log.WithField("DeviceID", requestLog.DeviceID).Trace("Handling campus token request") - - userRepo := device.NewRepository(service.Repository.DB) - - device, err := userRepo.GetDevice(requestLog.DeviceID) - if err != nil { - log.WithError(err).Error("Could not get device") - return nil, status.Error(codes.Internal, "Could not get device") - } - - apiGrades, err := campus_api.FetchGrades(campusToken) - if err != nil { - log.WithError(err).Error("Could not fetch grades") - return nil, status.Error(codes.Internal, "Could not handle grades request") - } - - oldEncryptedGrades, err := service.Repository.GetIOSEncryptedGrades(requestLog.DeviceID) - if err != nil { - log.WithError(err).Error("Could not get old grades") - return nil, status.Error(codes.Internal, "Could not handle grades request") - } - - oldGrades, err := decryptGrades(oldEncryptedGrades, campusToken) - if err != nil { - log.WithError(err).Error("Could not decrypt old grades") - return nil, status.Error(codes.Internal, "Could not handle grades request") - } - - newGrades := compareAndFindNewGrades(apiGrades.Grades, oldGrades) - collectedNewGrades.Observe(float64(len(newGrades))) - if len(newGrades) == 0 { - log.Info("No new grades found") - if err := service.Repository.DeleteAllRequestLogsForThisDeviceWithType(requestLog); err != nil { - log.WithError(err).Error("Could not delete request logs") - } - return &pb.IOSDeviceRequestResponseReply{ - Message: "Successfully handled request", - }, nil - } - - err = service.Repository.DeleteEncryptedGrades(requestLog.DeviceID) - if err != nil { - log.WithError(err).Error("Could not delete old grades") - return nil, status.Error(codes.Internal, "Could not handle grades request") - } - - service.encryptGradesAndStoreInDatabase(apiGrades.Grades, requestLog.DeviceID, campusToken) - - log.WithFields(log.Fields{"old": len(oldGrades), "new": len(newGrades)}).Info("Found grades") - - if len(newGrades) > 0 && len(oldGrades) > 0 { - apnsRepository := apns.NewRepository(service.Repository.DB, service.Repository.Token) - sendGradesToDevice(device, newGrades, apnsRepository) - } - - if err := service.Repository.DeleteAllRequestLogsForThisDeviceWithType(requestLog); err != nil { - log.WithError(err).Error("Could not delete request logs") - } - - return &pb.IOSDeviceRequestResponseReply{ - Message: "Successfully handled request", - }, nil -} - -func decryptGrades(grades []model.IOSEncryptedGrade, campusToken string) ([]model.IOSEncryptedGrade, error) { - oldGrades := make([]model.IOSEncryptedGrade, len(grades)) - for i, encryptedGrade := range grades { - err := encryptedGrade.Decrypt(campusToken) - if err != nil { - log.WithError(err).Error("Could not decrypt grade") - return nil, status.Error(codes.Internal, "Could not decrypt grade") - } - - oldGrades[i] = encryptedGrade - } - - return oldGrades, nil -} - -func compareAndFindNewGrades(newGrades []model.IOSGrade, oldGrades []model.IOSEncryptedGrade) []model.IOSGrade { - var grades []model.IOSGrade - for _, grade := range newGrades { - found := false - for _, oldGrade := range oldGrades { - if grade.CompareToEncrypted(&oldGrade) { - found = true - break - } - } - - if !found { - grades = append(grades, grade) - } - } - - return grades -} - -func (service *Service) encryptGradesAndStoreInDatabase(grades []model.IOSGrade, deviceID string, campusToken string) { - for _, grade := range grades { - encryptedGrade := model.IOSEncryptedGrade{ - Grade: grade.Grade, - DeviceID: deviceID, - LectureTitle: grade.LectureTitle, - } - - err := encryptedGrade.Encrypt(campusToken) - if err != nil { - log.WithError(err).Error("Could not encrypt grade") - } - - err = service.Repository.SaveEncryptedGrade(&encryptedGrade) - if err != nil { - log.WithError(err).Error("Could not save grade") - } - } -} - -func sendGradesToDevice(device *model.IOSDevice, grades []model.IOSGrade, apns *apns.Repository) { - alertTitle := fmt.Sprintf("%d New Grades Available", len(grades)) - if len(grades) == 1 { - alertTitle = "New Grade Available" - } - - var alertBody string - for i, grade := range grades { - if i == 0 { - alertBody = fmt.Sprintf("%s: %s", grade.LectureTitle, grade.Grade) - } else { - alertBody = fmt.Sprintf("%s\n %s: %s", alertBody, grade.LectureTitle, grade.Grade) - } - } - - notificationPayload := model.NewIOSNotificationPayload(device.DeviceID). - Alert(alertTitle, "", alertBody). - Encrypt(device.PublicKey) - - log.WithField("DeviceID", device.DeviceID).Info("Sending push notification") - - if _, err := apns.SendNotification(notificationPayload, model.IOSAPNSPushTypeAlert); err != nil { - log.WithField("DeviceID", device.DeviceID).WithError(err).Error("Could not send notification") - } -} - -func NewService(repo *Repository) *Service { - return &Service{ - Repository: repo, - } -} diff --git a/server/backend/ios_notifications/scheduled_update_log/repository.go b/server/backend/ios_notifications/scheduled_update_log/repository.go deleted file mode 100644 index 48057f0e..00000000 --- a/server/backend/ios_notifications/scheduled_update_log/repository.go +++ /dev/null @@ -1,28 +0,0 @@ -// Package scheduled_update_log provides functionality for logging scheduler updates -// E.g. when a device updated its grades, the scheduler will log the update -package scheduled_update_log - -import ( - "github.com/TUM-Dev/Campus-Backend/server/model" - "gorm.io/gorm" - "gorm.io/gorm/clause" -) - -type Repository struct { - DB *gorm.DB -} - -func (service *Repository) LogScheduledUpdate(log *model.IOSScheduledUpdateLog) error { - return service.DB.Clauses(clause.OnConflict{ - Columns: []clause.Column{{Name: "device_id"}}, - DoUpdates: clause.AssignmentColumns([]string{ - "created_at", - }), - }).Create(log).Error -} - -func NewRepository(db *gorm.DB) *Repository { - return &Repository{ - DB: db, - } -} diff --git a/server/backend/ios_notifications/scheduling/service.go b/server/backend/ios_notifications/scheduling/service.go deleted file mode 100644 index e3c40cb2..00000000 --- a/server/backend/ios_notifications/scheduling/service.go +++ /dev/null @@ -1,145 +0,0 @@ -// Package scheduling provides functionality for updating user information -// and optionally sending notifications to iOS devices. -package scheduling - -import ( - "sync" - "time" - - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/scheduled_update_log" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" -) - -var devicesToUpdate = promauto.NewGauge(prometheus.GaugeOpts{ - Name: "ios_scheduling_devices_to_update", - Help: "The numer of devices that should be updated for a given priority", -}) - -type Service struct { - DevicesRepository *device.Repository - SchedulerLogRepository *scheduled_update_log.Repository - APNs *apns.Service -} - -func (service *Service) HandleScheduledCron() error { - devices, err := service.DevicesRepository.GetDevicesThatShouldUpdateGrades() - if err != nil { - log.WithError(err).Error("can't get devices") - return err - } - - devicesToUpdate.Set(float64(len(devices))) - - if len(devices) == 0 { - log.Info("No devices to update") - return nil - } - - priority := findSchedulingPriority() - devices = service.selectDevicesToUpdate(devices, priority) - - log.Infof("Updating %d devices", len(devices)) - - service.handleDevices(devices) - - return nil -} - -func (service *Service) handleDevices(devices []model.IOSDeviceLastUpdated) { - routinesCount := min(len(devices), 10) - chunkSize := len(devices) / routinesCount - perfectlyChunkable := (len(devices) % routinesCount) == 0 - - chunksArrSize := routinesCount - if !perfectlyChunkable { - chunksArrSize = routinesCount + 1 - } - - chunks := make([][]model.IOSDeviceLastUpdated, chunksArrSize) - - for i := 0; i < routinesCount; i++ { - chunks[i] = devices[i*chunkSize : (i+1)*chunkSize] - } - - if !perfectlyChunkable { - chunks[routinesCount] = devices[routinesCount*chunkSize:] - } - - var group sync.WaitGroup - - for _, chunk := range chunks { - group.Add(1) - go func(chunk []model.IOSDeviceLastUpdated) { - defer group.Done() - service.handleDevicesChunk(chunk) - }(chunk) - } - - group.Wait() -} - -func (service *Service) handleDevicesChunk(devices []model.IOSDeviceLastUpdated) { - for _, device := range devices { - if err := service.APNs.RequestGradeUpdateForDevice(device.DeviceID); err != nil { - log.WithError(err).Error("could not RequestGradeUpdateForDevice") - continue - } - if err := service.LogScheduledUpdate(device.DeviceID); err != nil { - log.WithError(err).WithField("deviceID", device.DeviceID).Error("could not log scheduled update") - } - } -} - -func (service *Service) LogScheduledUpdate(deviceID string) error { - scheduleLog := model.IOSScheduledUpdateLog{ - DeviceID: deviceID, - Type: model.IOSUpdateTypeGrades, - } - - return service.SchedulerLogRepository.LogScheduledUpdate(&scheduleLog) -} - -// selectDevicesToUpdate selects the first DevicesToCheckPerCronBase * priority devices -func (service *Service) selectDevicesToUpdate(devices []model.IOSDeviceLastUpdated, priority int) []model.IOSDeviceLastUpdated { - maxDevicesToCheck := 10 * priority - - if len(devices) < maxDevicesToCheck { - return devices - } - - return devices[:maxDevicesToCheck] -} -func findSchedulingPriority() int { - now := time.Now() - - isNight := 1 <= now.Hour() && now.Hour() <= 6 - if isNight { - return 1 - } - - isDuringSummerSemester := 32 <= now.YearDay() && now.YearDay() <= 106 - isDuringWinterSemester := 152 <= now.YearDay() && now.YearDay() <= 288 - if isDuringWinterSemester || isDuringSummerSemester { - return 10 - } - - return 5 -} - -func NewService( - devicesRepository *device.Repository, - schedulerRepository *scheduled_update_log.Repository, - apnsService *apns.Service, -) *Service { - return &Service{ - DevicesRepository: devicesRepository, - SchedulerLogRepository: schedulerRepository, - APNs: apnsService, - } -} diff --git a/server/backend/migration/20240207000000.go b/server/backend/migration/20240207000000.go new file mode 100644 index 00000000..862723f1 --- /dev/null +++ b/server/backend/migration/20240207000000.go @@ -0,0 +1,138 @@ +package migration + +import ( + "time" + + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/go-gormigrate/gormigrate/v2" + "github.com/guregu/null" + "gorm.io/gorm" +) + +// IOSScheduledUpdateLog logs the last time a device was updated. +type IOSScheduledUpdateLog struct { + ID int64 `gorm:"primary_key;auto_increment;not_null"` + DeviceID string `gorm:"index:idx_scheduled_update_log_device,unique"` + Device IOSDevice `gorm:"constraint:OnDelete:CASCADE;"` + Type string `gorm:"type:enum ('grades');"` + CreatedAt time.Time `gorm:"index:idx_scheduled_update_log_created,unique;autoCreateTime"` +} + +type IOSDevicesActivityReset struct { + Type string `gorm:"primary_key;type:enum('day', 'week', 'month', 'year')"` + LastReset time.Time `gorm:"autoCreateTime"` +} + +// IOSEncryptedGrade is a grade that can be encrypted. +// Whether it is currently encrypted or not is indicated by the IsEncrypted field. +type IOSEncryptedGrade struct { + ID int64 `gorm:"primaryKey"` + Device IOSDevice `gorm:"constraint:OnDelete:CASCADE"` + DeviceID string `gorm:"index;not null"` + LectureTitle string `gorm:"not null"` + Grade string `gorm:"not null"` + IsEncrypted bool `gorm:"not null,default:true"` +} + +// An IOSDeviceRequestLog is created when the backend wants to request data from the device. +// +// 1. The backend creates a new IOSDeviceRequestLog +// +// 2. The backend sends a background push notification to the device containing +// the RequestID of the IOSDeviceRequestLog. +// +// 3. The device receives the push notification and sends a request to the backend +// containing the RequestID and the data. +type IOSDeviceRequestLog struct { + RequestID string `gorm:"primary_key;default:UUID()"` + DeviceID string `gorm:"size:200;not null"` + Device IOSDevice `gorm:"constraint:OnDelete:CASCADE;"` + RequestType string `gorm:"not null;type:enum ('CAMPUS_TOKEN_REQUEST');"` + CreatedAt time.Time `gorm:"autoCreateTime"` +} + +// IOSDevice stores relevant device information. +// E.g. the PublicKey which is used to encrypt push notifications +// The DeviceID can be used to send push notifications via APNs +type IOSDevice struct { + DeviceID string `gorm:"primary_key"` + CreatedAt time.Time `gorm:"autoCreateTime"` + PublicKey string `gorm:"not null"` + ActivityToday int32 `gorm:"default:0"` + ActivityThisWeek int32 `gorm:"default:0"` + ActivityThisMonth int32 `gorm:"default:0"` + ActivityThisYear int32 `gorm:"default:0"` +} + +// migrate20240207000000 +// remove unused ios notifications +func migrate20240207000000() *gormigrate.Migration { + return &gormigrate.Migration{ + ID: "20240207000000", + Migrate: func(tx *gorm.DB) error { + // remove cronjobs + if err := tx.Delete(&model.Crontab{}, "type = 'newExamResultsHook'").Error; err != nil { + return err + } + if err := tx.Delete(&model.Crontab{}, "type = 'iosNotifications'").Error; err != nil { + return err + } + if err := tx.Delete(&model.Crontab{}, "type = 'iosActivityReset'").Error; err != nil { + return err + } + // drop related tables + if err := tx.Migrator().DropTable(&IOSDeviceRequestLog{}); err != nil { + return err + } + if err := tx.Migrator().DropTable(&IOSEncryptedGrade{}); err != nil { + return err + } + if err := tx.Migrator().DropTable(&IOSScheduledUpdateLog{}); err != nil { + return err + } + if err := tx.Migrator().DropTable(&IOSDevicesActivityReset{}); err != nil { + return err + } + if err := tx.Migrator().DropTable(&IOSDevice{}); err != nil { + return err + } + return nil + }, + Rollback: func(tx *gorm.DB) error { + // create models + if err := tx.Migrator().AutoMigrate(&IOSDevice{}); err != nil { + return err + } + if err := tx.Migrator().AutoMigrate(&IOSDeviceRequestLog{}); err != nil { + return err + } + if err := tx.Migrator().AutoMigrate(&IOSEncryptedGrade{}); err != nil { + return err + } + if err := tx.Migrator().AutoMigrate(&IOSScheduledUpdateLog{}); err != nil { + return err + } + if err := tx.Migrator().AutoMigrate(&IOSDevicesActivityReset{}); err != nil { + return err + } + // create cron + + if err := tx.Create(&model.Crontab{ + Interval: 60, + Type: null.StringFrom("iosNotifications"), + }).Error; err != nil { + return err + } + if err := tx.Create(&model.Crontab{ + Interval: 86400, + Type: null.StringFrom("iosActivityReset"), + }).Error; err != nil { + return err + } + return tx.Create(&model.Crontab{ + Interval: 600, + Type: null.StringFrom("newExamResultsHook"), + }).Error + }, + } +} diff --git a/server/backend/migration/migration.go b/server/backend/migration/migration.go index cebebb32..b031a60d 100644 --- a/server/backend/migration/migration.go +++ b/server/backend/migration/migration.go @@ -29,16 +29,8 @@ func autoMigrate(db *gorm.DB) error { &model.DishRatingTagOption{}, &model.DishToDishNameTag{}, &model.DishesOfTheWeek{}, - &model.PublishedExamResult{}, &model.Feedback{}, &model.File{}, - &model.IOSDevice{}, - //&model.IOSDeviceLastUpdated{}, -- not a gorm model - &model.IOSDeviceRequestLog{}, - &model.IOSDevicesActivityReset{}, - //&model.IOSGrade{}, -- not a gorm model - //&model.IOSRemoteNotification...{}, -- wtf??? - &model.IOSScheduledUpdateLog{}, &model.Kino{}, &model.NewExamResultsSubscriber{}, &model.News{}, @@ -78,6 +70,7 @@ func manualMigrate(db *gorm.DB) error { migrate20240101000000(), migrate20240102000000(), migrate20240103000000(), + migrate20240207000000(), } return gormigrate.New(db, gormigrateOptions, migrations).Migrate() } diff --git a/server/backend/new_exam_results_hook/scheduling/repository.go b/server/backend/new_exam_results_hook/scheduling/repository.go deleted file mode 100644 index aaff769a..00000000 --- a/server/backend/new_exam_results_hook/scheduling/repository.go +++ /dev/null @@ -1,40 +0,0 @@ -package scheduling - -import ( - "github.com/TUM-Dev/Campus-Backend/server/model" - "gorm.io/gorm" - "gorm.io/gorm/logger" -) - -type Repository struct { - DB *gorm.DB -} - -func (repository *Repository) StoreExamResultsPublished(examResultsPublished []model.PublishedExamResult) error { - db := repository.DB - - return db.Transaction(func(tx *gorm.DB) error { - err := tx.Where("1 = 1").Delete(&model.PublishedExamResult{}).Error - if err != nil { - return err - } - - // disabled logging because this query always prints a warning because it takes longer then normal - // to execute because we bulk insert a lot of data - return tx.Session(&gorm.Session{Logger: logger.Default.LogMode(logger.Silent)}). - Create(examResultsPublished).Error - }) -} - -func (repository *Repository) FindAllExamResultsPublished() (*[]model.PublishedExamResult, error) { - var results []model.PublishedExamResult - err := repository.DB.Find(&results).Error - - return &results, err -} - -func NewRepository(db *gorm.DB) *Repository { - return &Repository{ - DB: db, - } -} diff --git a/server/backend/new_exam_results_hook/scheduling/service.go b/server/backend/new_exam_results_hook/scheduling/service.go deleted file mode 100644 index 4720ee71..00000000 --- a/server/backend/new_exam_results_hook/scheduling/service.go +++ /dev/null @@ -1,91 +0,0 @@ -package scheduling - -import ( - "github.com/TUM-Dev/Campus-Backend/server/backend/campus_api" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/device" - "github.com/TUM-Dev/Campus-Backend/server/backend/new_exam_results_hook/subscriber" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" -) - -type Service struct { - Repository *Repository - DevicesRepository *device.Repository - APNs *apns.Service -} - -func (service *Service) HandleScheduledCron() error { - log.Info("Fetching published exam results") - - apiResult, err := campus_api.FetchExamResultsPublished() - if err != nil { - return err - } - - var apiExamResults []model.PublishedExamResult - for _, apiExamResult := range apiResult.ExamResults { - apiExamResults = append(apiExamResults, *apiExamResult.ToDBExamResult()) - } - - storedExamResults, err := service.Repository.FindAllExamResultsPublished() - if err != nil { - return err - } - - newPublishedExamResults := service.findNewPublishedExamResults(&apiExamResults, storedExamResults) - - if len(*newPublishedExamResults) > 0 { - service.notifySubscribers(newPublishedExamResults) - } else { - log.Info("No new published exam results") - } - - return service.Repository.StoreExamResultsPublished(apiExamResults) -} - -func (service *Service) findNewPublishedExamResults(apiExamResults, storedExamResults *[]model.PublishedExamResult) *[]model.PublishedExamResult { - var apiExamResultsMap = make(map[string]model.PublishedExamResult) - for _, apiExamResult := range *apiExamResults { - apiExamResultsMap[apiExamResult.ExamID] = apiExamResult - } - - var storedExamResultsMap = make(map[string]model.PublishedExamResult) - for _, storedExamResult := range *storedExamResults { - storedExamResultsMap[storedExamResult.ExamID] = storedExamResult - } - - var newPublishedExamResults []model.PublishedExamResult - - for id, result := range apiExamResultsMap { - if storedResult, ok := storedExamResultsMap[id]; ok && !storedResult.Published && result.Published { - newPublishedExamResults = append(newPublishedExamResults, result) - } - } - - return &newPublishedExamResults -} - -func (service *Service) notifySubscribers(newPublishedExamResults *[]model.PublishedExamResult) { - log.Infof("Notifying subscribers about %d published exam results", len(*newPublishedExamResults)) - - subscribersRepo := subscriber.NewRepository(service.Repository.DB) - subscribersService := subscriber.NewService(subscribersRepo) - - err := subscribersService.NotifySubscribers(newPublishedExamResults) - if err != nil { - log.WithError(err).Error("Failed to notify subscribers") - return - } -} - -func NewService(repository *Repository, - devicesRepository *device.Repository, - apnsService *apns.Service, -) *Service { - return &Service{ - Repository: repository, - DevicesRepository: devicesRepository, - APNs: apnsService, - } -} diff --git a/server/backend/new_exam_results_hook/subscriber/repository.go b/server/backend/new_exam_results_hook/subscriber/repository.go deleted file mode 100644 index 27667410..00000000 --- a/server/backend/new_exam_results_hook/subscriber/repository.go +++ /dev/null @@ -1,55 +0,0 @@ -package subscriber - -import ( - "bytes" - "encoding/json" - "net/http" - - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" -) - -type Repository struct { - DB *gorm.DB -} - -func (repository *Repository) FindAllSubscribers() (*[]model.NewExamResultsSubscriber, error) { - var subscribers []model.NewExamResultsSubscriber - err := repository.DB.Find(&subscribers).Error - - return &subscribers, err -} - -func (repository *Repository) NotifySubscriber(subscriber *model.NewExamResultsSubscriber, newGrades *[]model.PublishedExamResult) error { - body, err := json.Marshal(newGrades) - if err != nil { - log.WithError(err).Error("Error while marshalling newGrades") - return err - } - - req, err := http.NewRequest(http.MethodPost, subscriber.CallbackUrl, bytes.NewBuffer(body)) - if err != nil { - log.WithError(err).Error("Error while creating request") - return err - } - - req.Header.Set("Content-Type", "application/json") - if subscriber.ApiKey.Valid { - req.Header.Set("Authorization", subscriber.ApiKey.String) - } - - _, err = http.DefaultClient.Do(req) - if err != nil { - log.WithField("url", subscriber.CallbackUrl).WithError(err).Error("Error while fetching url") - return err - } - - return nil -} - -func NewRepository(db *gorm.DB) *Repository { - return &Repository{ - DB: db, - } -} diff --git a/server/backend/new_exam_results_hook/subscriber/service.go b/server/backend/new_exam_results_hook/subscriber/service.go deleted file mode 100644 index 55c6747f..00000000 --- a/server/backend/new_exam_results_hook/subscriber/service.go +++ /dev/null @@ -1,32 +0,0 @@ -package subscriber - -import ( - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" -) - -type Service struct { - Repository *Repository -} - -func (service *Service) NotifySubscribers(newGrades *[]model.PublishedExamResult) error { - subscribers, err := service.Repository.FindAllSubscribers() - if err != nil { - return err - } - - for _, subscriber := range *subscribers { - if err := service.Repository.NotifySubscriber(&subscriber, newGrades); err != nil { - log.WithError(err).Error("Failed to notify subscriber") - continue - } - } - - return nil -} - -func NewService(repository *Repository) *Service { - return &Service{ - Repository: repository, - } -} diff --git a/server/backend/rpcserver.go b/server/backend/rpcserver.go index 622ef575..06f767d6 100644 --- a/server/backend/rpcserver.go +++ b/server/backend/rpcserver.go @@ -2,16 +2,14 @@ package backend import ( pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/apns" log "github.com/sirupsen/logrus" "gorm.io/gorm" ) type CampusServer struct { pb.UnimplementedCampusServer - db *gorm.DB - deviceBuf *deviceBuffer // deviceBuf stores all devices from recent request and flushes them to db - iOSNotificationsService *IOSNotificationsService + db *gorm.DB + deviceBuf *deviceBuffer // deviceBuf stores all devices from recent request and flushes them to db } // Verify that CampusServer implements the pb.CampusServer interface @@ -20,33 +18,7 @@ var _ pb.CampusServer = (*CampusServer)(nil) func New(db *gorm.DB) *CampusServer { log.Trace("Server starting up") return &CampusServer{ - db: db, - deviceBuf: newDeviceBuffer(), - iOSNotificationsService: NewIOSNotificationsService(), + db: db, + deviceBuf: newDeviceBuffer(), } } - -func NewIOSNotificationsService() *IOSNotificationsService { - if err := apns.ValidateRequirementsForIOSNotificationsService(); err != nil { - log.WithError(err).Warn("failed to validate requirements for ios notifications service") - - return &IOSNotificationsService{ - APNSToken: nil, - IsActive: false, - } - } - - token, err := apns.NewToken() - if err != nil { - log.WithError(err).Error("failed to create new token") - } - - return &IOSNotificationsService{ - APNSToken: token, - IsActive: true, - } -} - -func (s *CampusServer) GetIOSNotificationsService() *IOSNotificationsService { - return s.iOSNotificationsService -} diff --git a/server/go.mod b/server/go.mod index d2d1030f..3cd0d9cb 100644 --- a/server/go.mod +++ b/server/go.mod @@ -10,7 +10,6 @@ require ( github.com/getsentry/sentry-go v0.26.0 github.com/go-gormigrate/gormigrate/v2 v2.1.1 github.com/gofrs/uuid/v5 v5.0.0 - github.com/golang-jwt/jwt v3.2.2+incompatible github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 github.com/guregu/null v4.0.0+incompatible github.com/makasim/sentryhook v0.4.2 diff --git a/server/go.sum b/server/go.sum index 9120f4d1..2d3bad77 100644 --- a/server/go.sum +++ b/server/go.sum @@ -148,7 +148,6 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= diff --git a/server/model/ios_device.go b/server/model/ios_device.go deleted file mode 100644 index 1a36d3b6..00000000 --- a/server/model/ios_device.go +++ /dev/null @@ -1,23 +0,0 @@ -package model - -import ( - "fmt" - "time" -) - -// IOSDevice stores relevant device information. -// E.g. the PublicKey which is used to encrypt push notifications -// The DeviceID can be used to send push notifications via APNs -type IOSDevice struct { - DeviceID string `gorm:"primary_key" json:"deviceId"` - CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"` - PublicKey string `gorm:"not null" json:"publicKey"` - ActivityToday int32 `gorm:"default:0" json:"activityToday"` - ActivityThisWeek int32 `gorm:"default:0" json:"activityThisWeek"` - ActivityThisMonth int32 `gorm:"default:0" json:"activityThisMonth"` - ActivityThisYear int32 `gorm:"default:0" json:"activityThisYear"` -} - -func (device *IOSDevice) String() string { - return fmt.Sprintf("IOSDevice{DeviceID: %s}", device.DeviceID) -} diff --git a/server/model/ios_device_last_updated.go b/server/model/ios_device_last_updated.go deleted file mode 100644 index be79699c..00000000 --- a/server/model/ios_device_last_updated.go +++ /dev/null @@ -1,24 +0,0 @@ -package model - -import ( - "fmt" - - "github.com/guregu/null" -) - -// IOSDeviceLastUpdated used as a result of a query that joins -// IOSDevice and IOSDeviceRequestLog tables. -type IOSDeviceLastUpdated struct { - DeviceID string `json:"deviceId"` - LastUpdated null.Time `json:"lastUpdated"` - PublicKey string `json:"publicKey"` -} - -func (device *IOSDeviceLastUpdated) String() string { - time := "null" - - if device.LastUpdated.Valid { - time = device.LastUpdated.Time.String() - } - return fmt.Sprintf("IOSDeviceLastUpdated{DeviceID: %s, LastUpdated: %s}", device.DeviceID, time) -} diff --git a/server/model/ios_device_request_log.go b/server/model/ios_device_request_log.go deleted file mode 100644 index 3a06165b..00000000 --- a/server/model/ios_device_request_log.go +++ /dev/null @@ -1,20 +0,0 @@ -package model - -import "time" - -// An IOSDeviceRequestLog is created when the backend wants to request data from the device. -// -// 1. The backend creates a new IOSDeviceRequestLog -// -// 2. The backend sends a background push notification to the device containing -// the RequestID of the IOSDeviceRequestLog. -// -// 3. The device receives the push notification and sends a request to the backend -// containing the RequestID and the data. -type IOSDeviceRequestLog struct { - RequestID string `gorm:"primary_key;default:UUID()" json:"requestId"` - DeviceID string `gorm:"size:200;not null" json:"deviceId"` - Device IOSDevice `gorm:"constraint:OnDelete:CASCADE;" json:"device"` - RequestType string `gorm:"not null;type:enum ('CAMPUS_TOKEN_REQUEST');" json:"requestType"` - CreatedAt time.Time `gorm:"autoCreateTime" json:"createdAt"` -} diff --git a/server/model/ios_devices_activity_reset.go b/server/model/ios_devices_activity_reset.go deleted file mode 100644 index 24865cde..00000000 --- a/server/model/ios_devices_activity_reset.go +++ /dev/null @@ -1,15 +0,0 @@ -package model - -import "time" - -const ( - IOSDevicesActivityResetTypeDay = "day" - IOSDevicesActivityResetTypeWeek = "week" - IOSDevicesActivityResetTypeMonth = "month" - IOSDevicesActivityResetTypeYear = "year" -) - -type IOSDevicesActivityReset struct { - Type string `gorm:"primary_key;type:enum('day', 'week', 'month', 'year')"` - LastReset time.Time `gorm:"autoCreateTime"` -} diff --git a/server/model/ios_grade.go b/server/model/ios_grade.go deleted file mode 100644 index 48a3cc83..00000000 --- a/server/model/ios_grade.go +++ /dev/null @@ -1,100 +0,0 @@ -package model - -import ( - "encoding/xml" - "time" - - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/crypto" -) - -// IOSGrades is a wrapper for a list of grades => XML stuff -type IOSGrades struct { - XMLName xml.Name `xml:"rowset"` - Grades []IOSGrade `xml:"row"` -} - -type IOSGrade struct { - XMLName xml.Name `xml:"row"` - Date customDate `xml:"datum"` - LectureNumber string `xml:"lv_nummer"` - LectureSemester string `xml:"lv_semester"` - LectureTitle string `xml:"lv_titel"` - Examiner string `xml:"pruefer_nachname"` - Grade string `xml:"uninotenamekurz"` - ExamType string `xml:"exam_typ_name"` - Modus string `xml:"modus"` - StudyID string `xml:"studienidentifikator"` - StudyName string `xml:"studienbezeichnung"` - ECTS string `xml:"lv_credits"` -} - -type customDate struct { - time.Time -} - -func (c *customDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - var v string - if err := d.DecodeElement(&v, &start); err != nil { - return err - } - - t, err := time.Parse("2006-01-02", v) - if err != nil { - return err - } - - c.Time = t - - return nil -} - -func (grade *IOSGrade) CompareToEncrypted(encryptedGrade *IOSEncryptedGrade) bool { - return grade.LectureTitle == encryptedGrade.LectureTitle && grade.Grade == encryptedGrade.Grade -} - -// IOSEncryptedGrade is a grade that can be encrypted. -// Whether it is currently encrypted or not is indicated by the IsEncrypted field. -type IOSEncryptedGrade struct { - ID int64 `gorm:"primaryKey"` - Device IOSDevice `gorm:"constraint:OnDelete:CASCADE"` - DeviceID string `gorm:"index;not null"` - LectureTitle string `gorm:"not null"` - Grade string `gorm:"not null"` - IsEncrypted bool `gorm:"not null,default:true"` -} - -func (e *IOSEncryptedGrade) Encrypt(key string) error { - encryptedTitle, err := crypto.SymmetricEncrypt(e.LectureTitle, key) - if err != nil { - return err - } - - encryptedGrade, err := crypto.SymmetricEncrypt(e.Grade, key) - if err != nil { - return err - } - - e.LectureTitle = encryptedTitle.String() - e.Grade = encryptedGrade.String() - e.IsEncrypted = true - - return nil -} - -func (e *IOSEncryptedGrade) Decrypt(key string) error { - decryptedTitle, err := crypto.SymmetricDecrypt(crypto.EncryptedString(e.LectureTitle), key) - if err != nil { - return err - } - - decryptedGrade, err := crypto.SymmetricDecrypt(crypto.EncryptedString(e.Grade), key) - if err != nil { - return err - } - - e.LectureTitle = decryptedTitle - e.Grade = decryptedGrade - e.IsEncrypted = false - - return nil -} diff --git a/server/model/ios_remote_notification.go b/server/model/ios_remote_notification.go deleted file mode 100644 index ee174c50..00000000 --- a/server/model/ios_remote_notification.go +++ /dev/null @@ -1,159 +0,0 @@ -package model - -// inspired by https://github.com/sideshow/apns2 - -import ( - "encoding/json" - - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/crypto" -) - -type IOSNotificationPayload struct { - content map[string]interface{} - DeviceId string -} - -type IOSRemoteNotificationAPS struct { - Alert interface{} `json:"alert,omitempty"` - Badge interface{} `json:"badge,omitempty"` - Category string `json:"category,omitempty"` - ContentAvailable int `json:"content-available,omitempty"` - MutableContent int `json:"mutable-content,omitempty"` - RelevanceScore interface{} `json:"relevance-score,omitempty"` - Sound interface{} `json:"sound,omitempty"` - ThreadID string `json:"thread-id,omitempty"` - URLArgs []string `json:"url-args,omitempty"` -} - -type IOSAlertAPSContent struct { - Action string `json:"action,omitempty"` - ActionLocKey string `json:"action-loc-key,omitempty"` - Body string `json:"body,omitempty"` - LaunchImage string `json:"launch-image,omitempty"` - LocArgs []string `json:"loc-args,omitempty"` - LocKey string `json:"loc-key,omitempty"` - Title string `json:"title,omitempty"` - Subtitle string `json:"subtitle,omitempty"` - TitleLocArgs []string `json:"title-loc-args,omitempty"` - TitleLocKey string `json:"title-loc-key,omitempty"` - SummaryArg string `json:"summary-arg,omitempty"` - SummaryArgCount int `json:"summary-arg-count,omitempty"` -} - -type IOSRemoteNotificationResponse struct { - Reason string `json:"reason"` -} - -type IOSAPNSPushType int64 - -const ( - IOSAPNSPushTypeAlert IOSAPNSPushType = iota - IOSAPNSPushTypeBackground -) - -func (pt IOSAPNSPushType) String() string { - switch pt { - case IOSAPNSPushTypeAlert: - return "alert" - case IOSAPNSPushTypeBackground: - return "background" - } - - return "unknown" -} - -type IOSBackgroundNotificationType int64 - -const ( - IOSBackgroundCampusTokenRequest IOSBackgroundNotificationType = iota -) - -func (requestType IOSBackgroundNotificationType) String() string { - switch requestType { - case IOSBackgroundCampusTokenRequest: - return "CAMPUS_TOKEN_REQUEST" - } - - return "unknown" -} - -func NewIOSNotificationPayload(deviceId string) *IOSNotificationPayload { - return &IOSNotificationPayload{ - content: map[string]interface{}{ - "aps": &IOSRemoteNotificationAPS{}, - }, - DeviceId: deviceId, - } -} - -func (np *IOSNotificationPayload) Alert(title string, subtitle string, body string) *IOSNotificationPayload { - alert := np.aps().alert() - - alert.Title = title - alert.Subtitle = subtitle - alert.Body = body - - return np -} - -func (np *IOSNotificationPayload) Background(requestId string, requestType IOSBackgroundNotificationType) *IOSNotificationPayload { - np.aps().ContentAvailable = 1 - - np.content["request_id"] = requestId - np.content["notification_type"] = requestType.String() - - return np -} - -func (np *IOSNotificationPayload) aps() *IOSRemoteNotificationAPS { - return np.content["aps"].(*IOSRemoteNotificationAPS) -} - -func (aps *IOSRemoteNotificationAPS) alert() *IOSAlertAPSContent { - if _, ok := aps.Alert.(*IOSAlertAPSContent); !ok { - aps.Alert = &IOSAlertAPSContent{} - } - return aps.Alert.(*IOSAlertAPSContent) -} - -func (np *IOSNotificationPayload) Encrypt(publicKey string) *IOSNotificationPayload { - alert := np.aps().alert() - - np.aps().MutableContent = 1 - - if alert.Title != "" { - res, err := crypto.AsymmetricEncrypt(alert.Title, publicKey) - - if err != nil { - alert.Title = "You have a new notification" - } else { - alert.Title = res.String() - } - } - - if alert.Body != "" { - res, err := crypto.AsymmetricEncrypt(alert.Body, publicKey) - - if err != nil { - alert.Body = "" - } else { - alert.Body = res.String() - } - } - - if alert.Subtitle != "" { - res, err := crypto.AsymmetricEncrypt(alert.Subtitle, publicKey) - - if err != nil { - alert.Subtitle = "" - } else { - alert.Subtitle = res.String() - } - } - - return np -} - -func (np *IOSNotificationPayload) MarshalJSON() ([]byte, error) { - return json.Marshal(np.content) -} diff --git a/server/model/ios_scheduled_update_log.go b/server/model/ios_scheduled_update_log.go deleted file mode 100644 index 8a3c495e..00000000 --- a/server/model/ios_scheduled_update_log.go +++ /dev/null @@ -1,28 +0,0 @@ -package model - -import ( - "fmt" - "time" -) - -const ( - IOSUpdateTypeGrades = "grades" - IOSMinimumUpdateInterval = 30 -) - -// IOSScheduledUpdateLog logs the last time a device was updated. -type IOSScheduledUpdateLog struct { - ID int64 `gorm:"primary_key;auto_increment;not_null" json:"id"` - DeviceID string `gorm:"index:idx_scheduled_update_log_device,unique" json:"deviceId"` - Device IOSDevice `gorm:"constraint:OnDelete:CASCADE;" json:"device"` - Type string `gorm:"type:enum ('grades');" json:"type"` - CreatedAt time.Time `gorm:"index:idx_scheduled_update_log_created,unique;autoCreateTime" json:"createdAt"` -} - -func (log *IOSScheduledUpdateLog) IsGrades() bool { - return log.Type == IOSUpdateTypeGrades -} - -func (log *IOSScheduledUpdateLog) String() string { - return fmt.Sprintf("IOSScheduledUpdateLog{ID: %d, DeviceID: %s, Type: %s, CreatedAt: %s}", log.ID, log.DeviceID, log.Type, log.CreatedAt) -} diff --git a/server/model/published_exam_result.go b/server/model/published_exam_result.go deleted file mode 100644 index 5cd24ffe..00000000 --- a/server/model/published_exam_result.go +++ /dev/null @@ -1,58 +0,0 @@ -package model - -import ( - "encoding/xml" - "time" -) - -type campusApiBool bool - -func (p *campusApiBool) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - var value string - if err := d.DecodeElement(&value, &start); err != nil { - return err - } - switch value { - case "J": - *p = true - default: - *p = false - } - return nil -} - -type TUMAPIPublishedExamResults struct { - XMLName xml.Name `xml:"pruefungen"` - ExamResults []TUMAPIPublishedExamResult `xml:"pruefung"` -} - -type TUMAPIPublishedExamResult struct { - XMLName xml.Name `xml:"pruefung"` - Date customDate `xml:"datum"` - ExamID string `xml:"pv_term_nr"` - LectureTitle string `xml:"lv_titel"` - LectureNumber string `xml:"lv_nummer"` - LectureSem string `xml:"lv_semester"` - LectureType string `xml:"lv_typ"` - Published campusApiBool `xml:"note_veroeffentlicht"` -} - -func (examResult *TUMAPIPublishedExamResult) ToDBExamResult() *PublishedExamResult { - return &PublishedExamResult{ - Date: examResult.Date.Time, - ExamID: examResult.ExamID, - LectureTitle: examResult.LectureTitle, - LectureType: examResult.LectureType, - LectureSem: examResult.LectureSem, - Published: bool(examResult.Published), - } -} - -type PublishedExamResult struct { - Date time.Time `json:"date"` - ExamID string `gorm:"primary_key" json:"examId"` - LectureTitle string `json:"lectureTitle"` - LectureType string `json:"lectureType"` - LectureSem string `json:"lectureSem"` - Published bool `json:"published"` -}