diff --git a/docs/grpc/index.html b/docs/grpc/index.html index e6a236c077..fa7c80304e 100644 --- a/docs/grpc/index.html +++ b/docs/grpc/index.html @@ -1532,6 +1532,10 @@

Table of Contents

MUpdateObligationValueResponse +
  • + MValueTriggerRequest +
  • + @@ -12466,6 +12470,14 @@

    CreateObligationValueRe

    + + triggers + ValueTriggerRequest + repeated +

    Optional +Combination of action and attribute_value that will trigger this obligation value policy decisioning.

    + + metadata common.MetadataMutable @@ -13093,6 +13105,14 @@

    UpdateObligationValueRe

    Optional

    + + triggers + ValueTriggerRequest + repeated +

    Optional +Obligation Triggers provided here will replace all existing records in the database.

    + + metadata common.MetadataMutable @@ -13138,6 +13158,37 @@

    UpdateObligationValueR +

    ValueTriggerRequest

    +

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    actioncommon.IdNameIdentifier

    Required. The ID of the action that will trigger this obligation value policy decisioning.

    attribute_valuecommon.IdFqnIdentifier

    Required. The attribute value ID that will trigger this obligation value policy decisioning.

    + + + + + diff --git a/docs/openapi/policy/obligations/obligations.openapi.yaml b/docs/openapi/policy/obligations/obligations.openapi.yaml index 2b697845be..090992e1b1 100644 --- a/docs/openapi/policy/obligations/obligations.openapi.yaml +++ b/docs/openapi/policy/obligations/obligations.openapi.yaml @@ -1411,6 +1411,14 @@ components: value: type: string title: value + triggers: + type: array + items: + $ref: '#/components/schemas/policy.obligations.ValueTriggerRequest' + title: triggers + description: |- + Optional + Combination of action and attribute_value that will trigger this obligation value policy decisioning. metadata: title: metadata description: |- @@ -1694,6 +1702,14 @@ components: type: string title: value description: Optional + triggers: + type: array + items: + $ref: '#/components/schemas/policy.obligations.ValueTriggerRequest' + title: triggers + description: |- + Optional + Obligation Triggers provided here will replace all existing records in the database. metadata: title: metadata $ref: '#/components/schemas/common.MetadataMutable' @@ -1710,6 +1726,22 @@ components: $ref: '#/components/schemas/policy.ObligationValue' title: UpdateObligationValueResponse additionalProperties: false + policy.obligations.ValueTriggerRequest: + type: object + properties: + action: + title: action + description: Required. The ID of the action that will trigger this obligation value policy decisioning. + $ref: '#/components/schemas/common.IdNameIdentifier' + attributeValue: + title: attribute_value + description: Required. The attribute value ID that will trigger this obligation value policy decisioning. + $ref: '#/components/schemas/common.IdFqnIdentifier' + title: ValueTriggerRequest + required: + - action + - attributeValue + additionalProperties: false connect-protocol-version: type: number title: Connect-Protocol-Version diff --git a/protocol/go/policy/obligations/obligations.pb.go b/protocol/go/policy/obligations/obligations.pb.go index 43152a2acf..03cf0403ad 100644 --- a/protocol/go/policy/obligations/obligations.pb.go +++ b/protocol/go/policy/obligations/obligations.pb.go @@ -105,6 +105,63 @@ func (*GetObligationRequest_Id) isGetObligationRequest_Identifier() {} func (*GetObligationRequest_Fqn) isGetObligationRequest_Identifier() {} +type ValueTriggerRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The ID of the action that will trigger this obligation value policy decisioning. + Action *common.IdNameIdentifier `protobuf:"bytes,1,opt,name=action,proto3" json:"action,omitempty"` + // Required. The attribute value ID that will trigger this obligation value policy decisioning. + AttributeValue *common.IdFqnIdentifier `protobuf:"bytes,2,opt,name=attribute_value,json=attributeValue,proto3" json:"attribute_value,omitempty"` +} + +func (x *ValueTriggerRequest) Reset() { + *x = ValueTriggerRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_policy_obligations_obligations_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValueTriggerRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValueTriggerRequest) ProtoMessage() {} + +func (x *ValueTriggerRequest) ProtoReflect() protoreflect.Message { + mi := &file_policy_obligations_obligations_proto_msgTypes[1] + 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 ValueTriggerRequest.ProtoReflect.Descriptor instead. +func (*ValueTriggerRequest) Descriptor() ([]byte, []int) { + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{1} +} + +func (x *ValueTriggerRequest) GetAction() *common.IdNameIdentifier { + if x != nil { + return x.Action + } + return nil +} + +func (x *ValueTriggerRequest) GetAttributeValue() *common.IdFqnIdentifier { + if x != nil { + return x.AttributeValue + } + return nil +} + type GetObligationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -116,7 +173,7 @@ type GetObligationResponse struct { func (x *GetObligationResponse) Reset() { *x = GetObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[1] + mi := &file_policy_obligations_obligations_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -129,7 +186,7 @@ func (x *GetObligationResponse) String() string { func (*GetObligationResponse) ProtoMessage() {} func (x *GetObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[1] + mi := &file_policy_obligations_obligations_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -142,7 +199,7 @@ func (x *GetObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationResponse.ProtoReflect.Descriptor instead. func (*GetObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{1} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{2} } func (x *GetObligationResponse) GetObligation() *policy.Obligation { @@ -163,7 +220,7 @@ type GetObligationsByFQNsRequest struct { func (x *GetObligationsByFQNsRequest) Reset() { *x = GetObligationsByFQNsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[2] + mi := &file_policy_obligations_obligations_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -176,7 +233,7 @@ func (x *GetObligationsByFQNsRequest) String() string { func (*GetObligationsByFQNsRequest) ProtoMessage() {} func (x *GetObligationsByFQNsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[2] + mi := &file_policy_obligations_obligations_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -189,7 +246,7 @@ func (x *GetObligationsByFQNsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationsByFQNsRequest.ProtoReflect.Descriptor instead. func (*GetObligationsByFQNsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{2} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{3} } func (x *GetObligationsByFQNsRequest) GetFqns() []string { @@ -210,7 +267,7 @@ type GetObligationsByFQNsResponse struct { func (x *GetObligationsByFQNsResponse) Reset() { *x = GetObligationsByFQNsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[3] + mi := &file_policy_obligations_obligations_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -223,7 +280,7 @@ func (x *GetObligationsByFQNsResponse) String() string { func (*GetObligationsByFQNsResponse) ProtoMessage() {} func (x *GetObligationsByFQNsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[3] + mi := &file_policy_obligations_obligations_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -236,7 +293,7 @@ func (x *GetObligationsByFQNsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationsByFQNsResponse.ProtoReflect.Descriptor instead. func (*GetObligationsByFQNsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{3} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{4} } func (x *GetObligationsByFQNsResponse) GetFqnObligationMap() map[string]*policy.Obligation { @@ -269,7 +326,7 @@ type CreateObligationRequest struct { func (x *CreateObligationRequest) Reset() { *x = CreateObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[4] + mi := &file_policy_obligations_obligations_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -282,7 +339,7 @@ func (x *CreateObligationRequest) String() string { func (*CreateObligationRequest) ProtoMessage() {} func (x *CreateObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[4] + mi := &file_policy_obligations_obligations_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -295,7 +352,7 @@ func (x *CreateObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationRequest.ProtoReflect.Descriptor instead. func (*CreateObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{4} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{5} } func (m *CreateObligationRequest) GetNamespaceIdentifier() isCreateObligationRequest_NamespaceIdentifier { @@ -367,7 +424,7 @@ type CreateObligationResponse struct { func (x *CreateObligationResponse) Reset() { *x = CreateObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[5] + mi := &file_policy_obligations_obligations_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -380,7 +437,7 @@ func (x *CreateObligationResponse) String() string { func (*CreateObligationResponse) ProtoMessage() {} func (x *CreateObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[5] + mi := &file_policy_obligations_obligations_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -393,7 +450,7 @@ func (x *CreateObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationResponse.ProtoReflect.Descriptor instead. func (*CreateObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{5} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{6} } func (x *CreateObligationResponse) GetObligation() *policy.Obligation { @@ -419,7 +476,7 @@ type UpdateObligationRequest struct { func (x *UpdateObligationRequest) Reset() { *x = UpdateObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[6] + mi := &file_policy_obligations_obligations_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -432,7 +489,7 @@ func (x *UpdateObligationRequest) String() string { func (*UpdateObligationRequest) ProtoMessage() {} func (x *UpdateObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[6] + mi := &file_policy_obligations_obligations_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -445,7 +502,7 @@ func (x *UpdateObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationRequest.ProtoReflect.Descriptor instead. func (*UpdateObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{6} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{7} } func (x *UpdateObligationRequest) GetId() string { @@ -487,7 +544,7 @@ type UpdateObligationResponse struct { func (x *UpdateObligationResponse) Reset() { *x = UpdateObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[7] + mi := &file_policy_obligations_obligations_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -500,7 +557,7 @@ func (x *UpdateObligationResponse) String() string { func (*UpdateObligationResponse) ProtoMessage() {} func (x *UpdateObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[7] + mi := &file_policy_obligations_obligations_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -513,7 +570,7 @@ func (x *UpdateObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationResponse.ProtoReflect.Descriptor instead. func (*UpdateObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{7} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{8} } func (x *UpdateObligationResponse) GetObligation() *policy.Obligation { @@ -538,7 +595,7 @@ type DeleteObligationRequest struct { func (x *DeleteObligationRequest) Reset() { *x = DeleteObligationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[8] + mi := &file_policy_obligations_obligations_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -551,7 +608,7 @@ func (x *DeleteObligationRequest) String() string { func (*DeleteObligationRequest) ProtoMessage() {} func (x *DeleteObligationRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[8] + mi := &file_policy_obligations_obligations_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -564,7 +621,7 @@ func (x *DeleteObligationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationRequest.ProtoReflect.Descriptor instead. func (*DeleteObligationRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{8} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{9} } func (m *DeleteObligationRequest) GetIdentifier() isDeleteObligationRequest_Identifier { @@ -615,7 +672,7 @@ type DeleteObligationResponse struct { func (x *DeleteObligationResponse) Reset() { *x = DeleteObligationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[9] + mi := &file_policy_obligations_obligations_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -628,7 +685,7 @@ func (x *DeleteObligationResponse) String() string { func (*DeleteObligationResponse) ProtoMessage() {} func (x *DeleteObligationResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[9] + mi := &file_policy_obligations_obligations_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -641,7 +698,7 @@ func (x *DeleteObligationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationResponse.ProtoReflect.Descriptor instead. func (*DeleteObligationResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{9} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{10} } func (x *DeleteObligationResponse) GetObligation() *policy.Obligation { @@ -671,7 +728,7 @@ type ListObligationsRequest struct { func (x *ListObligationsRequest) Reset() { *x = ListObligationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[10] + mi := &file_policy_obligations_obligations_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -684,7 +741,7 @@ func (x *ListObligationsRequest) String() string { func (*ListObligationsRequest) ProtoMessage() {} func (x *ListObligationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[10] + mi := &file_policy_obligations_obligations_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -697,7 +754,7 @@ func (x *ListObligationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationsRequest.ProtoReflect.Descriptor instead. func (*ListObligationsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{10} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{11} } func (m *ListObligationsRequest) GetNamespaceIdentifier() isListObligationsRequest_NamespaceIdentifier { @@ -756,7 +813,7 @@ type ListObligationsResponse struct { func (x *ListObligationsResponse) Reset() { *x = ListObligationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[11] + mi := &file_policy_obligations_obligations_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -769,7 +826,7 @@ func (x *ListObligationsResponse) String() string { func (*ListObligationsResponse) ProtoMessage() {} func (x *ListObligationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[11] + mi := &file_policy_obligations_obligations_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -782,7 +839,7 @@ func (x *ListObligationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListObligationsResponse.ProtoReflect.Descriptor instead. func (*ListObligationsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{11} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{12} } func (x *ListObligationsResponse) GetObligations() []*policy.Obligation { @@ -815,7 +872,7 @@ type GetObligationValueRequest struct { func (x *GetObligationValueRequest) Reset() { *x = GetObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[12] + mi := &file_policy_obligations_obligations_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -828,7 +885,7 @@ func (x *GetObligationValueRequest) String() string { func (*GetObligationValueRequest) ProtoMessage() {} func (x *GetObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[12] + mi := &file_policy_obligations_obligations_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -841,7 +898,7 @@ func (x *GetObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValueRequest.ProtoReflect.Descriptor instead. func (*GetObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{12} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{13} } func (m *GetObligationValueRequest) GetIdentifier() isGetObligationValueRequest_Identifier { @@ -892,7 +949,7 @@ type GetObligationValueResponse struct { func (x *GetObligationValueResponse) Reset() { *x = GetObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[13] + mi := &file_policy_obligations_obligations_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -905,7 +962,7 @@ func (x *GetObligationValueResponse) String() string { func (*GetObligationValueResponse) ProtoMessage() {} func (x *GetObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[13] + mi := &file_policy_obligations_obligations_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -918,7 +975,7 @@ func (x *GetObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValueResponse.ProtoReflect.Descriptor instead. func (*GetObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{13} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{14} } func (x *GetObligationValueResponse) GetValue() *policy.ObligationValue { @@ -939,7 +996,7 @@ type GetObligationValuesByFQNsRequest struct { func (x *GetObligationValuesByFQNsRequest) Reset() { *x = GetObligationValuesByFQNsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[14] + mi := &file_policy_obligations_obligations_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -952,7 +1009,7 @@ func (x *GetObligationValuesByFQNsRequest) String() string { func (*GetObligationValuesByFQNsRequest) ProtoMessage() {} func (x *GetObligationValuesByFQNsRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[14] + mi := &file_policy_obligations_obligations_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -965,7 +1022,7 @@ func (x *GetObligationValuesByFQNsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetObligationValuesByFQNsRequest.ProtoReflect.Descriptor instead. func (*GetObligationValuesByFQNsRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{14} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{15} } func (x *GetObligationValuesByFQNsRequest) GetFqns() []string { @@ -986,7 +1043,7 @@ type GetObligationValuesByFQNsResponse struct { func (x *GetObligationValuesByFQNsResponse) Reset() { *x = GetObligationValuesByFQNsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[15] + mi := &file_policy_obligations_obligations_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -999,7 +1056,7 @@ func (x *GetObligationValuesByFQNsResponse) String() string { func (*GetObligationValuesByFQNsResponse) ProtoMessage() {} func (x *GetObligationValuesByFQNsResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[15] + mi := &file_policy_obligations_obligations_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1012,7 +1069,7 @@ func (x *GetObligationValuesByFQNsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetObligationValuesByFQNsResponse.ProtoReflect.Descriptor instead. func (*GetObligationValuesByFQNsResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{15} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{16} } func (x *GetObligationValuesByFQNsResponse) GetFqnValueMap() map[string]*policy.ObligationValue { @@ -1036,6 +1093,9 @@ type CreateObligationValueRequest struct { ObligationIdentifier isCreateObligationValueRequest_ObligationIdentifier `protobuf_oneof:"obligation_identifier"` Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` // Optional + // Combination of action and attribute_value that will trigger this obligation value policy decisioning. + Triggers []*ValueTriggerRequest `protobuf:"bytes,4,rep,name=triggers,proto3" json:"triggers,omitempty"` + // Optional // Common metadata Metadata *common.MetadataMutable `protobuf:"bytes,100,opt,name=metadata,proto3" json:"metadata,omitempty"` } @@ -1043,7 +1103,7 @@ type CreateObligationValueRequest struct { func (x *CreateObligationValueRequest) Reset() { *x = CreateObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[16] + mi := &file_policy_obligations_obligations_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1056,7 +1116,7 @@ func (x *CreateObligationValueRequest) String() string { func (*CreateObligationValueRequest) ProtoMessage() {} func (x *CreateObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[16] + mi := &file_policy_obligations_obligations_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1069,7 +1129,7 @@ func (x *CreateObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationValueRequest.ProtoReflect.Descriptor instead. func (*CreateObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{16} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{17} } func (m *CreateObligationValueRequest) GetObligationIdentifier() isCreateObligationValueRequest_ObligationIdentifier { @@ -1100,6 +1160,13 @@ func (x *CreateObligationValueRequest) GetValue() string { return "" } +func (x *CreateObligationValueRequest) GetTriggers() []*ValueTriggerRequest { + if x != nil { + return x.Triggers + } + return nil +} + func (x *CreateObligationValueRequest) GetMetadata() *common.MetadataMutable { if x != nil { return x.Metadata @@ -1134,7 +1201,7 @@ type CreateObligationValueResponse struct { func (x *CreateObligationValueResponse) Reset() { *x = CreateObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[17] + mi := &file_policy_obligations_obligations_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1147,7 +1214,7 @@ func (x *CreateObligationValueResponse) String() string { func (*CreateObligationValueResponse) ProtoMessage() {} func (x *CreateObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[17] + mi := &file_policy_obligations_obligations_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1160,7 +1227,7 @@ func (x *CreateObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateObligationValueResponse.ProtoReflect.Descriptor instead. func (*CreateObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{17} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{18} } func (x *CreateObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1178,7 +1245,10 @@ type UpdateObligationValueRequest struct { // Required Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Optional - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + // Optional + // Obligation Triggers provided here will replace all existing records in the database. + Triggers []*ValueTriggerRequest `protobuf:"bytes,3,rep,name=triggers,proto3" json:"triggers,omitempty"` Metadata *common.MetadataMutable `protobuf:"bytes,100,opt,name=metadata,proto3" json:"metadata,omitempty"` MetadataUpdateBehavior common.MetadataUpdateEnum `protobuf:"varint,101,opt,name=metadata_update_behavior,json=metadataUpdateBehavior,proto3,enum=common.MetadataUpdateEnum" json:"metadata_update_behavior,omitempty"` } @@ -1186,7 +1256,7 @@ type UpdateObligationValueRequest struct { func (x *UpdateObligationValueRequest) Reset() { *x = UpdateObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[18] + mi := &file_policy_obligations_obligations_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1199,7 +1269,7 @@ func (x *UpdateObligationValueRequest) String() string { func (*UpdateObligationValueRequest) ProtoMessage() {} func (x *UpdateObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[18] + mi := &file_policy_obligations_obligations_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1212,7 +1282,7 @@ func (x *UpdateObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationValueRequest.ProtoReflect.Descriptor instead. func (*UpdateObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{18} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{19} } func (x *UpdateObligationValueRequest) GetId() string { @@ -1229,6 +1299,13 @@ func (x *UpdateObligationValueRequest) GetValue() string { return "" } +func (x *UpdateObligationValueRequest) GetTriggers() []*ValueTriggerRequest { + if x != nil { + return x.Triggers + } + return nil +} + func (x *UpdateObligationValueRequest) GetMetadata() *common.MetadataMutable { if x != nil { return x.Metadata @@ -1254,7 +1331,7 @@ type UpdateObligationValueResponse struct { func (x *UpdateObligationValueResponse) Reset() { *x = UpdateObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[19] + mi := &file_policy_obligations_obligations_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1267,7 +1344,7 @@ func (x *UpdateObligationValueResponse) String() string { func (*UpdateObligationValueResponse) ProtoMessage() {} func (x *UpdateObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[19] + mi := &file_policy_obligations_obligations_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1280,7 +1357,7 @@ func (x *UpdateObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateObligationValueResponse.ProtoReflect.Descriptor instead. func (*UpdateObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{19} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{20} } func (x *UpdateObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1305,7 +1382,7 @@ type DeleteObligationValueRequest struct { func (x *DeleteObligationValueRequest) Reset() { *x = DeleteObligationValueRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[20] + mi := &file_policy_obligations_obligations_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1318,7 +1395,7 @@ func (x *DeleteObligationValueRequest) String() string { func (*DeleteObligationValueRequest) ProtoMessage() {} func (x *DeleteObligationValueRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[20] + mi := &file_policy_obligations_obligations_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1331,7 +1408,7 @@ func (x *DeleteObligationValueRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationValueRequest.ProtoReflect.Descriptor instead. func (*DeleteObligationValueRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{20} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{21} } func (m *DeleteObligationValueRequest) GetIdentifier() isDeleteObligationValueRequest_Identifier { @@ -1382,7 +1459,7 @@ type DeleteObligationValueResponse struct { func (x *DeleteObligationValueResponse) Reset() { *x = DeleteObligationValueResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[21] + mi := &file_policy_obligations_obligations_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1395,7 +1472,7 @@ func (x *DeleteObligationValueResponse) String() string { func (*DeleteObligationValueResponse) ProtoMessage() {} func (x *DeleteObligationValueResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[21] + mi := &file_policy_obligations_obligations_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1408,7 +1485,7 @@ func (x *DeleteObligationValueResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteObligationValueResponse.ProtoReflect.Descriptor instead. func (*DeleteObligationValueResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{21} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{22} } func (x *DeleteObligationValueResponse) GetValue() *policy.ObligationValue { @@ -1438,7 +1515,7 @@ type AddObligationTriggerRequest struct { func (x *AddObligationTriggerRequest) Reset() { *x = AddObligationTriggerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[22] + mi := &file_policy_obligations_obligations_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1451,7 +1528,7 @@ func (x *AddObligationTriggerRequest) String() string { func (*AddObligationTriggerRequest) ProtoMessage() {} func (x *AddObligationTriggerRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[22] + mi := &file_policy_obligations_obligations_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1464,7 +1541,7 @@ func (x *AddObligationTriggerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddObligationTriggerRequest.ProtoReflect.Descriptor instead. func (*AddObligationTriggerRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{22} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{23} } func (x *AddObligationTriggerRequest) GetObligationValue() *common.IdFqnIdentifier { @@ -1506,7 +1583,7 @@ type AddObligationTriggerResponse struct { func (x *AddObligationTriggerResponse) Reset() { *x = AddObligationTriggerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[23] + mi := &file_policy_obligations_obligations_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1519,7 +1596,7 @@ func (x *AddObligationTriggerResponse) String() string { func (*AddObligationTriggerResponse) ProtoMessage() {} func (x *AddObligationTriggerResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[23] + mi := &file_policy_obligations_obligations_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1532,7 +1609,7 @@ func (x *AddObligationTriggerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddObligationTriggerResponse.ProtoReflect.Descriptor instead. func (*AddObligationTriggerResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{23} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{24} } func (x *AddObligationTriggerResponse) GetTrigger() *policy.ObligationTrigger { @@ -1554,7 +1631,7 @@ type RemoveObligationTriggerRequest struct { func (x *RemoveObligationTriggerRequest) Reset() { *x = RemoveObligationTriggerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[24] + mi := &file_policy_obligations_obligations_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1567,7 +1644,7 @@ func (x *RemoveObligationTriggerRequest) String() string { func (*RemoveObligationTriggerRequest) ProtoMessage() {} func (x *RemoveObligationTriggerRequest) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[24] + mi := &file_policy_obligations_obligations_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1580,7 +1657,7 @@ func (x *RemoveObligationTriggerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveObligationTriggerRequest.ProtoReflect.Descriptor instead. func (*RemoveObligationTriggerRequest) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{24} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{25} } func (x *RemoveObligationTriggerRequest) GetId() string { @@ -1601,7 +1678,7 @@ type RemoveObligationTriggerResponse struct { func (x *RemoveObligationTriggerResponse) Reset() { *x = RemoveObligationTriggerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_policy_obligations_obligations_proto_msgTypes[25] + mi := &file_policy_obligations_obligations_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1614,7 +1691,7 @@ func (x *RemoveObligationTriggerResponse) String() string { func (*RemoveObligationTriggerResponse) ProtoMessage() {} func (x *RemoveObligationTriggerResponse) ProtoReflect() protoreflect.Message { - mi := &file_policy_obligations_obligations_proto_msgTypes[25] + mi := &file_policy_obligations_obligations_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1627,7 +1704,7 @@ func (x *RemoveObligationTriggerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveObligationTriggerResponse.ProtoReflect.Descriptor instead. func (*RemoveObligationTriggerResponse) Descriptor() ([]byte, []int) { - return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{25} + return file_policy_obligations_obligations_proto_rawDescGZIP(), []int{26} } func (x *RemoveObligationTriggerResponse) GetTrigger() *policy.ObligationTrigger { @@ -1654,311 +1731,329 @@ var file_policy_obligations_obligations_proto_rawDesc = []byte{ 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x99, 0x01, 0x0a, 0x13, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, + 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x31, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x66, 0x71, + 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x12, 0x66, 0x71, 0x6e, 0x5f, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, 0x15, 0x46, 0x71, 0x6e, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x12, 0x66, 0x71, 0x6e, 0x5f, 0x6f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x66, 0x71, 0x6e, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, - 0x15, 0x46, 0x71, 0x6e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb8, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x16, 0x0a, 0x14, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x22, 0x4e, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, - 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x18, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x17, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, - 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x18, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x4f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xb8, 0x01, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x22, 0x4b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x36, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, - 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, - 0x0d, 0x66, 0x71, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, - 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x71, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, 0x10, 0x46, 0x71, 0x6e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xa8, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x03, 0x66, 0x71, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x16, 0x0a, 0x14, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, + 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc8, 0x01, + 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, + 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, - 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xcf, 0x01, - 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, - 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, - 0x4e, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, - 0x52, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x12, 0x33, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, + 0x14, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, + 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, + 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4b, + 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x36, 0x0a, 0x20, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x66, 0x71, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x66, + 0x71, 0x6e, 0x73, 0x22, 0xe8, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x66, 0x71, 0x6e, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x46, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x71, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4d, 0x61, 0x70, 0x1a, 0x57, 0x0a, 0x10, 0x46, 0x71, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xed, + 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0xa2, 0x02, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x10, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0f, - 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x38, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, - 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x0f, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, - 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, - 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x3a, 0x0a, - 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, - 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x1f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x32, 0xc6, 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, - 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x2a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x69, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x28, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x52, 0x03, 0x66, 0x71, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x17, 0x0a, 0x15, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, + 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x94, + 0x02, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x54, 0x0a, 0x18, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x18, 0x65, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x16, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x65, 0x68, + 0x61, 0x76, 0x69, 0x6f, 0x72, 0x22, 0x4e, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x52, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x03, 0x66, 0x71, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x66, 0x71, 0x6e, 0x42, 0x0c, 0x0a, 0x0a, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x1d, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa2, 0x02, 0x0a, 0x1b, 0x41, 0x64, + 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x10, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, 0x64, 0x46, + 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, 0x06, 0xba, 0x48, + 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x49, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x42, + 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x48, 0x0a, 0x0f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x49, 0x64, 0x46, 0x71, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x0e, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x53, + 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, + 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x22, 0x3a, 0x0a, 0x1e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x56, 0x0a, 0x1f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x32, 0xc6, 0x0c, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x6f, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x03, 0x90, 0x02, 0x01, 0x12, 0x69, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, + 0x7e, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, - 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x2d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x8d, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, - 0x46, 0x51, 0x4e, 0x73, 0x12, 0x34, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, - 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x6f, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x79, 0x46, 0x51, + 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, + 0x6f, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x6f, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6f, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x78, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x2d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, + 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x8d, 0x01, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x12, 0x34, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x2f, - 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, - 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, - 0x32, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, - 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xcf, 0x01, 0x0a, 0x16, 0x63, - 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x10, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, - 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x4f, 0x58, 0xaa, 0x02, 0x12, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0xca, 0x02, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xe2, 0x02, 0x1e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, - 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, - 0x3a, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x42, 0x79, 0x46, 0x51, 0x4e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x90, 0x02, 0x01, 0x12, 0x7e, 0x0a, 0x15, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x15, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x14, + 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x2f, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x4f, 0x62, + 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x17, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x32, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6f, + 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x2e, 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0xcf, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x10, 0x4f, 0x62, 0x6c, + 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x74, 0x64, 0x66, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, + 0x6f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x50, 0x4f, + 0x58, 0xaa, 0x02, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4f, 0x62, 0x6c, 0x69, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xca, 0x02, 0x12, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, + 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xe2, 0x02, 0x1e, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x4f, 0x62, 0x6c, 0x69, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1973,105 +2068,110 @@ func file_policy_obligations_obligations_proto_rawDescGZIP() []byte { return file_policy_obligations_obligations_proto_rawDescData } -var file_policy_obligations_obligations_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_policy_obligations_obligations_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_policy_obligations_obligations_proto_goTypes = []interface{}{ (*GetObligationRequest)(nil), // 0: policy.obligations.GetObligationRequest - (*GetObligationResponse)(nil), // 1: policy.obligations.GetObligationResponse - (*GetObligationsByFQNsRequest)(nil), // 2: policy.obligations.GetObligationsByFQNsRequest - (*GetObligationsByFQNsResponse)(nil), // 3: policy.obligations.GetObligationsByFQNsResponse - (*CreateObligationRequest)(nil), // 4: policy.obligations.CreateObligationRequest - (*CreateObligationResponse)(nil), // 5: policy.obligations.CreateObligationResponse - (*UpdateObligationRequest)(nil), // 6: policy.obligations.UpdateObligationRequest - (*UpdateObligationResponse)(nil), // 7: policy.obligations.UpdateObligationResponse - (*DeleteObligationRequest)(nil), // 8: policy.obligations.DeleteObligationRequest - (*DeleteObligationResponse)(nil), // 9: policy.obligations.DeleteObligationResponse - (*ListObligationsRequest)(nil), // 10: policy.obligations.ListObligationsRequest - (*ListObligationsResponse)(nil), // 11: policy.obligations.ListObligationsResponse - (*GetObligationValueRequest)(nil), // 12: policy.obligations.GetObligationValueRequest - (*GetObligationValueResponse)(nil), // 13: policy.obligations.GetObligationValueResponse - (*GetObligationValuesByFQNsRequest)(nil), // 14: policy.obligations.GetObligationValuesByFQNsRequest - (*GetObligationValuesByFQNsResponse)(nil), // 15: policy.obligations.GetObligationValuesByFQNsResponse - (*CreateObligationValueRequest)(nil), // 16: policy.obligations.CreateObligationValueRequest - (*CreateObligationValueResponse)(nil), // 17: policy.obligations.CreateObligationValueResponse - (*UpdateObligationValueRequest)(nil), // 18: policy.obligations.UpdateObligationValueRequest - (*UpdateObligationValueResponse)(nil), // 19: policy.obligations.UpdateObligationValueResponse - (*DeleteObligationValueRequest)(nil), // 20: policy.obligations.DeleteObligationValueRequest - (*DeleteObligationValueResponse)(nil), // 21: policy.obligations.DeleteObligationValueResponse - (*AddObligationTriggerRequest)(nil), // 22: policy.obligations.AddObligationTriggerRequest - (*AddObligationTriggerResponse)(nil), // 23: policy.obligations.AddObligationTriggerResponse - (*RemoveObligationTriggerRequest)(nil), // 24: policy.obligations.RemoveObligationTriggerRequest - (*RemoveObligationTriggerResponse)(nil), // 25: policy.obligations.RemoveObligationTriggerResponse - nil, // 26: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry - nil, // 27: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry - (*policy.Obligation)(nil), // 28: policy.Obligation - (*common.MetadataMutable)(nil), // 29: common.MetadataMutable - (common.MetadataUpdateEnum)(0), // 30: common.MetadataUpdateEnum - (*policy.PageRequest)(nil), // 31: policy.PageRequest - (*policy.PageResponse)(nil), // 32: policy.PageResponse - (*policy.ObligationValue)(nil), // 33: policy.ObligationValue - (*common.IdFqnIdentifier)(nil), // 34: common.IdFqnIdentifier - (*common.IdNameIdentifier)(nil), // 35: common.IdNameIdentifier - (*policy.ObligationTrigger)(nil), // 36: policy.ObligationTrigger + (*ValueTriggerRequest)(nil), // 1: policy.obligations.ValueTriggerRequest + (*GetObligationResponse)(nil), // 2: policy.obligations.GetObligationResponse + (*GetObligationsByFQNsRequest)(nil), // 3: policy.obligations.GetObligationsByFQNsRequest + (*GetObligationsByFQNsResponse)(nil), // 4: policy.obligations.GetObligationsByFQNsResponse + (*CreateObligationRequest)(nil), // 5: policy.obligations.CreateObligationRequest + (*CreateObligationResponse)(nil), // 6: policy.obligations.CreateObligationResponse + (*UpdateObligationRequest)(nil), // 7: policy.obligations.UpdateObligationRequest + (*UpdateObligationResponse)(nil), // 8: policy.obligations.UpdateObligationResponse + (*DeleteObligationRequest)(nil), // 9: policy.obligations.DeleteObligationRequest + (*DeleteObligationResponse)(nil), // 10: policy.obligations.DeleteObligationResponse + (*ListObligationsRequest)(nil), // 11: policy.obligations.ListObligationsRequest + (*ListObligationsResponse)(nil), // 12: policy.obligations.ListObligationsResponse + (*GetObligationValueRequest)(nil), // 13: policy.obligations.GetObligationValueRequest + (*GetObligationValueResponse)(nil), // 14: policy.obligations.GetObligationValueResponse + (*GetObligationValuesByFQNsRequest)(nil), // 15: policy.obligations.GetObligationValuesByFQNsRequest + (*GetObligationValuesByFQNsResponse)(nil), // 16: policy.obligations.GetObligationValuesByFQNsResponse + (*CreateObligationValueRequest)(nil), // 17: policy.obligations.CreateObligationValueRequest + (*CreateObligationValueResponse)(nil), // 18: policy.obligations.CreateObligationValueResponse + (*UpdateObligationValueRequest)(nil), // 19: policy.obligations.UpdateObligationValueRequest + (*UpdateObligationValueResponse)(nil), // 20: policy.obligations.UpdateObligationValueResponse + (*DeleteObligationValueRequest)(nil), // 21: policy.obligations.DeleteObligationValueRequest + (*DeleteObligationValueResponse)(nil), // 22: policy.obligations.DeleteObligationValueResponse + (*AddObligationTriggerRequest)(nil), // 23: policy.obligations.AddObligationTriggerRequest + (*AddObligationTriggerResponse)(nil), // 24: policy.obligations.AddObligationTriggerResponse + (*RemoveObligationTriggerRequest)(nil), // 25: policy.obligations.RemoveObligationTriggerRequest + (*RemoveObligationTriggerResponse)(nil), // 26: policy.obligations.RemoveObligationTriggerResponse + nil, // 27: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry + nil, // 28: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry + (*common.IdNameIdentifier)(nil), // 29: common.IdNameIdentifier + (*common.IdFqnIdentifier)(nil), // 30: common.IdFqnIdentifier + (*policy.Obligation)(nil), // 31: policy.Obligation + (*common.MetadataMutable)(nil), // 32: common.MetadataMutable + (common.MetadataUpdateEnum)(0), // 33: common.MetadataUpdateEnum + (*policy.PageRequest)(nil), // 34: policy.PageRequest + (*policy.PageResponse)(nil), // 35: policy.PageResponse + (*policy.ObligationValue)(nil), // 36: policy.ObligationValue + (*policy.ObligationTrigger)(nil), // 37: policy.ObligationTrigger } var file_policy_obligations_obligations_proto_depIdxs = []int32{ - 28, // 0: policy.obligations.GetObligationResponse.obligation:type_name -> policy.Obligation - 26, // 1: policy.obligations.GetObligationsByFQNsResponse.fqn_obligation_map:type_name -> policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry - 29, // 2: policy.obligations.CreateObligationRequest.metadata:type_name -> common.MetadataMutable - 28, // 3: policy.obligations.CreateObligationResponse.obligation:type_name -> policy.Obligation - 29, // 4: policy.obligations.UpdateObligationRequest.metadata:type_name -> common.MetadataMutable - 30, // 5: policy.obligations.UpdateObligationRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 28, // 6: policy.obligations.UpdateObligationResponse.obligation:type_name -> policy.Obligation - 28, // 7: policy.obligations.DeleteObligationResponse.obligation:type_name -> policy.Obligation - 31, // 8: policy.obligations.ListObligationsRequest.pagination:type_name -> policy.PageRequest - 28, // 9: policy.obligations.ListObligationsResponse.obligations:type_name -> policy.Obligation - 32, // 10: policy.obligations.ListObligationsResponse.pagination:type_name -> policy.PageResponse - 33, // 11: policy.obligations.GetObligationValueResponse.value:type_name -> policy.ObligationValue - 27, // 12: policy.obligations.GetObligationValuesByFQNsResponse.fqn_value_map:type_name -> policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry - 29, // 13: policy.obligations.CreateObligationValueRequest.metadata:type_name -> common.MetadataMutable - 33, // 14: policy.obligations.CreateObligationValueResponse.value:type_name -> policy.ObligationValue - 29, // 15: policy.obligations.UpdateObligationValueRequest.metadata:type_name -> common.MetadataMutable - 30, // 16: policy.obligations.UpdateObligationValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum - 33, // 17: policy.obligations.UpdateObligationValueResponse.value:type_name -> policy.ObligationValue - 33, // 18: policy.obligations.DeleteObligationValueResponse.value:type_name -> policy.ObligationValue - 34, // 19: policy.obligations.AddObligationTriggerRequest.obligation_value:type_name -> common.IdFqnIdentifier - 35, // 20: policy.obligations.AddObligationTriggerRequest.action:type_name -> common.IdNameIdentifier - 34, // 21: policy.obligations.AddObligationTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier - 29, // 22: policy.obligations.AddObligationTriggerRequest.metadata:type_name -> common.MetadataMutable - 36, // 23: policy.obligations.AddObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger - 36, // 24: policy.obligations.RemoveObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger - 28, // 25: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry.value:type_name -> policy.Obligation - 33, // 26: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.ObligationValue - 10, // 27: policy.obligations.Service.ListObligations:input_type -> policy.obligations.ListObligationsRequest - 0, // 28: policy.obligations.Service.GetObligation:input_type -> policy.obligations.GetObligationRequest - 2, // 29: policy.obligations.Service.GetObligationsByFQNs:input_type -> policy.obligations.GetObligationsByFQNsRequest - 4, // 30: policy.obligations.Service.CreateObligation:input_type -> policy.obligations.CreateObligationRequest - 6, // 31: policy.obligations.Service.UpdateObligation:input_type -> policy.obligations.UpdateObligationRequest - 8, // 32: policy.obligations.Service.DeleteObligation:input_type -> policy.obligations.DeleteObligationRequest - 12, // 33: policy.obligations.Service.GetObligationValue:input_type -> policy.obligations.GetObligationValueRequest - 14, // 34: policy.obligations.Service.GetObligationValuesByFQNs:input_type -> policy.obligations.GetObligationValuesByFQNsRequest - 16, // 35: policy.obligations.Service.CreateObligationValue:input_type -> policy.obligations.CreateObligationValueRequest - 18, // 36: policy.obligations.Service.UpdateObligationValue:input_type -> policy.obligations.UpdateObligationValueRequest - 20, // 37: policy.obligations.Service.DeleteObligationValue:input_type -> policy.obligations.DeleteObligationValueRequest - 22, // 38: policy.obligations.Service.AddObligationTrigger:input_type -> policy.obligations.AddObligationTriggerRequest - 24, // 39: policy.obligations.Service.RemoveObligationTrigger:input_type -> policy.obligations.RemoveObligationTriggerRequest - 11, // 40: policy.obligations.Service.ListObligations:output_type -> policy.obligations.ListObligationsResponse - 1, // 41: policy.obligations.Service.GetObligation:output_type -> policy.obligations.GetObligationResponse - 3, // 42: policy.obligations.Service.GetObligationsByFQNs:output_type -> policy.obligations.GetObligationsByFQNsResponse - 5, // 43: policy.obligations.Service.CreateObligation:output_type -> policy.obligations.CreateObligationResponse - 7, // 44: policy.obligations.Service.UpdateObligation:output_type -> policy.obligations.UpdateObligationResponse - 9, // 45: policy.obligations.Service.DeleteObligation:output_type -> policy.obligations.DeleteObligationResponse - 13, // 46: policy.obligations.Service.GetObligationValue:output_type -> policy.obligations.GetObligationValueResponse - 15, // 47: policy.obligations.Service.GetObligationValuesByFQNs:output_type -> policy.obligations.GetObligationValuesByFQNsResponse - 17, // 48: policy.obligations.Service.CreateObligationValue:output_type -> policy.obligations.CreateObligationValueResponse - 19, // 49: policy.obligations.Service.UpdateObligationValue:output_type -> policy.obligations.UpdateObligationValueResponse - 21, // 50: policy.obligations.Service.DeleteObligationValue:output_type -> policy.obligations.DeleteObligationValueResponse - 23, // 51: policy.obligations.Service.AddObligationTrigger:output_type -> policy.obligations.AddObligationTriggerResponse - 25, // 52: policy.obligations.Service.RemoveObligationTrigger:output_type -> policy.obligations.RemoveObligationTriggerResponse - 40, // [40:53] is the sub-list for method output_type - 27, // [27:40] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 29, // 0: policy.obligations.ValueTriggerRequest.action:type_name -> common.IdNameIdentifier + 30, // 1: policy.obligations.ValueTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier + 31, // 2: policy.obligations.GetObligationResponse.obligation:type_name -> policy.Obligation + 27, // 3: policy.obligations.GetObligationsByFQNsResponse.fqn_obligation_map:type_name -> policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry + 32, // 4: policy.obligations.CreateObligationRequest.metadata:type_name -> common.MetadataMutable + 31, // 5: policy.obligations.CreateObligationResponse.obligation:type_name -> policy.Obligation + 32, // 6: policy.obligations.UpdateObligationRequest.metadata:type_name -> common.MetadataMutable + 33, // 7: policy.obligations.UpdateObligationRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 31, // 8: policy.obligations.UpdateObligationResponse.obligation:type_name -> policy.Obligation + 31, // 9: policy.obligations.DeleteObligationResponse.obligation:type_name -> policy.Obligation + 34, // 10: policy.obligations.ListObligationsRequest.pagination:type_name -> policy.PageRequest + 31, // 11: policy.obligations.ListObligationsResponse.obligations:type_name -> policy.Obligation + 35, // 12: policy.obligations.ListObligationsResponse.pagination:type_name -> policy.PageResponse + 36, // 13: policy.obligations.GetObligationValueResponse.value:type_name -> policy.ObligationValue + 28, // 14: policy.obligations.GetObligationValuesByFQNsResponse.fqn_value_map:type_name -> policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry + 1, // 15: policy.obligations.CreateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest + 32, // 16: policy.obligations.CreateObligationValueRequest.metadata:type_name -> common.MetadataMutable + 36, // 17: policy.obligations.CreateObligationValueResponse.value:type_name -> policy.ObligationValue + 1, // 18: policy.obligations.UpdateObligationValueRequest.triggers:type_name -> policy.obligations.ValueTriggerRequest + 32, // 19: policy.obligations.UpdateObligationValueRequest.metadata:type_name -> common.MetadataMutable + 33, // 20: policy.obligations.UpdateObligationValueRequest.metadata_update_behavior:type_name -> common.MetadataUpdateEnum + 36, // 21: policy.obligations.UpdateObligationValueResponse.value:type_name -> policy.ObligationValue + 36, // 22: policy.obligations.DeleteObligationValueResponse.value:type_name -> policy.ObligationValue + 30, // 23: policy.obligations.AddObligationTriggerRequest.obligation_value:type_name -> common.IdFqnIdentifier + 29, // 24: policy.obligations.AddObligationTriggerRequest.action:type_name -> common.IdNameIdentifier + 30, // 25: policy.obligations.AddObligationTriggerRequest.attribute_value:type_name -> common.IdFqnIdentifier + 32, // 26: policy.obligations.AddObligationTriggerRequest.metadata:type_name -> common.MetadataMutable + 37, // 27: policy.obligations.AddObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger + 37, // 28: policy.obligations.RemoveObligationTriggerResponse.trigger:type_name -> policy.ObligationTrigger + 31, // 29: policy.obligations.GetObligationsByFQNsResponse.FqnObligationMapEntry.value:type_name -> policy.Obligation + 36, // 30: policy.obligations.GetObligationValuesByFQNsResponse.FqnValueMapEntry.value:type_name -> policy.ObligationValue + 11, // 31: policy.obligations.Service.ListObligations:input_type -> policy.obligations.ListObligationsRequest + 0, // 32: policy.obligations.Service.GetObligation:input_type -> policy.obligations.GetObligationRequest + 3, // 33: policy.obligations.Service.GetObligationsByFQNs:input_type -> policy.obligations.GetObligationsByFQNsRequest + 5, // 34: policy.obligations.Service.CreateObligation:input_type -> policy.obligations.CreateObligationRequest + 7, // 35: policy.obligations.Service.UpdateObligation:input_type -> policy.obligations.UpdateObligationRequest + 9, // 36: policy.obligations.Service.DeleteObligation:input_type -> policy.obligations.DeleteObligationRequest + 13, // 37: policy.obligations.Service.GetObligationValue:input_type -> policy.obligations.GetObligationValueRequest + 15, // 38: policy.obligations.Service.GetObligationValuesByFQNs:input_type -> policy.obligations.GetObligationValuesByFQNsRequest + 17, // 39: policy.obligations.Service.CreateObligationValue:input_type -> policy.obligations.CreateObligationValueRequest + 19, // 40: policy.obligations.Service.UpdateObligationValue:input_type -> policy.obligations.UpdateObligationValueRequest + 21, // 41: policy.obligations.Service.DeleteObligationValue:input_type -> policy.obligations.DeleteObligationValueRequest + 23, // 42: policy.obligations.Service.AddObligationTrigger:input_type -> policy.obligations.AddObligationTriggerRequest + 25, // 43: policy.obligations.Service.RemoveObligationTrigger:input_type -> policy.obligations.RemoveObligationTriggerRequest + 12, // 44: policy.obligations.Service.ListObligations:output_type -> policy.obligations.ListObligationsResponse + 2, // 45: policy.obligations.Service.GetObligation:output_type -> policy.obligations.GetObligationResponse + 4, // 46: policy.obligations.Service.GetObligationsByFQNs:output_type -> policy.obligations.GetObligationsByFQNsResponse + 6, // 47: policy.obligations.Service.CreateObligation:output_type -> policy.obligations.CreateObligationResponse + 8, // 48: policy.obligations.Service.UpdateObligation:output_type -> policy.obligations.UpdateObligationResponse + 10, // 49: policy.obligations.Service.DeleteObligation:output_type -> policy.obligations.DeleteObligationResponse + 14, // 50: policy.obligations.Service.GetObligationValue:output_type -> policy.obligations.GetObligationValueResponse + 16, // 51: policy.obligations.Service.GetObligationValuesByFQNs:output_type -> policy.obligations.GetObligationValuesByFQNsResponse + 18, // 52: policy.obligations.Service.CreateObligationValue:output_type -> policy.obligations.CreateObligationValueResponse + 20, // 53: policy.obligations.Service.UpdateObligationValue:output_type -> policy.obligations.UpdateObligationValueResponse + 22, // 54: policy.obligations.Service.DeleteObligationValue:output_type -> policy.obligations.DeleteObligationValueResponse + 24, // 55: policy.obligations.Service.AddObligationTrigger:output_type -> policy.obligations.AddObligationTriggerResponse + 26, // 56: policy.obligations.Service.RemoveObligationTrigger:output_type -> policy.obligations.RemoveObligationTriggerResponse + 44, // [44:57] is the sub-list for method output_type + 31, // [31:44] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name } func init() { file_policy_obligations_obligations_proto_init() } @@ -2093,7 +2193,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationResponse); i { + switch v := v.(*ValueTriggerRequest); i { case 0: return &v.state case 1: @@ -2105,7 +2205,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationsByFQNsRequest); i { + switch v := v.(*GetObligationResponse); i { case 0: return &v.state case 1: @@ -2117,7 +2217,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationsByFQNsResponse); i { + switch v := v.(*GetObligationsByFQNsRequest); i { case 0: return &v.state case 1: @@ -2129,7 +2229,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationRequest); i { + switch v := v.(*GetObligationsByFQNsResponse); i { case 0: return &v.state case 1: @@ -2141,7 +2241,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationResponse); i { + switch v := v.(*CreateObligationRequest); i { case 0: return &v.state case 1: @@ -2153,7 +2253,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationRequest); i { + switch v := v.(*CreateObligationResponse); i { case 0: return &v.state case 1: @@ -2165,7 +2265,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationResponse); i { + switch v := v.(*UpdateObligationRequest); i { case 0: return &v.state case 1: @@ -2177,7 +2277,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationRequest); i { + switch v := v.(*UpdateObligationResponse); i { case 0: return &v.state case 1: @@ -2189,7 +2289,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationResponse); i { + switch v := v.(*DeleteObligationRequest); i { case 0: return &v.state case 1: @@ -2201,7 +2301,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObligationsRequest); i { + switch v := v.(*DeleteObligationResponse); i { case 0: return &v.state case 1: @@ -2213,7 +2313,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObligationsResponse); i { + switch v := v.(*ListObligationsRequest); i { case 0: return &v.state case 1: @@ -2225,7 +2325,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValueRequest); i { + switch v := v.(*ListObligationsResponse); i { case 0: return &v.state case 1: @@ -2237,7 +2337,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValueResponse); i { + switch v := v.(*GetObligationValueRequest); i { case 0: return &v.state case 1: @@ -2249,7 +2349,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValuesByFQNsRequest); i { + switch v := v.(*GetObligationValueResponse); i { case 0: return &v.state case 1: @@ -2261,7 +2361,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetObligationValuesByFQNsResponse); i { + switch v := v.(*GetObligationValuesByFQNsRequest); i { case 0: return &v.state case 1: @@ -2273,7 +2373,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationValueRequest); i { + switch v := v.(*GetObligationValuesByFQNsResponse); i { case 0: return &v.state case 1: @@ -2285,7 +2385,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateObligationValueResponse); i { + switch v := v.(*CreateObligationValueRequest); i { case 0: return &v.state case 1: @@ -2297,7 +2397,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationValueRequest); i { + switch v := v.(*CreateObligationValueResponse); i { case 0: return &v.state case 1: @@ -2309,7 +2409,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateObligationValueResponse); i { + switch v := v.(*UpdateObligationValueRequest); i { case 0: return &v.state case 1: @@ -2321,7 +2421,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationValueRequest); i { + switch v := v.(*UpdateObligationValueResponse); i { case 0: return &v.state case 1: @@ -2333,7 +2433,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteObligationValueResponse); i { + switch v := v.(*DeleteObligationValueRequest); i { case 0: return &v.state case 1: @@ -2345,7 +2445,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddObligationTriggerRequest); i { + switch v := v.(*DeleteObligationValueResponse); i { case 0: return &v.state case 1: @@ -2357,7 +2457,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddObligationTriggerResponse); i { + switch v := v.(*AddObligationTriggerRequest); i { case 0: return &v.state case 1: @@ -2369,7 +2469,7 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveObligationTriggerRequest); i { + switch v := v.(*AddObligationTriggerResponse); i { case 0: return &v.state case 1: @@ -2381,6 +2481,18 @@ func file_policy_obligations_obligations_proto_init() { } } file_policy_obligations_obligations_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveObligationTriggerRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_policy_obligations_obligations_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveObligationTriggerResponse); i { case 0: return &v.state @@ -2397,27 +2509,27 @@ func file_policy_obligations_obligations_proto_init() { (*GetObligationRequest_Id)(nil), (*GetObligationRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[5].OneofWrappers = []interface{}{ (*CreateObligationRequest_Id)(nil), (*CreateObligationRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[8].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[9].OneofWrappers = []interface{}{ (*DeleteObligationRequest_Id)(nil), (*DeleteObligationRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[11].OneofWrappers = []interface{}{ (*ListObligationsRequest_Id)(nil), (*ListObligationsRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[13].OneofWrappers = []interface{}{ (*GetObligationValueRequest_Id)(nil), (*GetObligationValueRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[16].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[17].OneofWrappers = []interface{}{ (*CreateObligationValueRequest_Id)(nil), (*CreateObligationValueRequest_Fqn)(nil), } - file_policy_obligations_obligations_proto_msgTypes[20].OneofWrappers = []interface{}{ + file_policy_obligations_obligations_proto_msgTypes[21].OneofWrappers = []interface{}{ (*DeleteObligationValueRequest_Id)(nil), (*DeleteObligationValueRequest_Fqn)(nil), } @@ -2427,7 +2539,7 @@ func file_policy_obligations_obligations_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_policy_obligations_obligations_proto_rawDesc, NumEnums: 0, - NumMessages: 28, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/service/integration/obligation_triggers_test.go b/service/integration/obligation_triggers_test.go index f8444f98c9..1e028a434f 100644 --- a/service/integration/obligation_triggers_test.go +++ b/service/integration/obligation_triggers_test.go @@ -197,7 +197,7 @@ func (s *ObligationTriggersSuite) Test_CreateObligationTrigger_ActionNotFound_Fa Action: &common.IdNameIdentifier{Id: randomID}, }) s.Require().Error(err) - s.Require().ErrorIs(err, db.ErrNotNullViolation) + s.Require().ErrorIs(err, db.ErrInvalidOblTriParam) s.Nil(trigger) } @@ -234,7 +234,7 @@ func (s *ObligationTriggersSuite) Test_CreateObligationTrigger_AttributeValueDif Action: &common.IdNameIdentifier{Id: s.action.GetId()}, }) s.Require().Error(err) - s.Require().ErrorIs(err, db.ErrNotNullViolation) + s.Require().ErrorIs(err, db.ErrInvalidOblTriParam) s.Nil(trigger) } diff --git a/service/integration/obligations_test.go b/service/integration/obligations_test.go index da7fe2eff1..27d32b9f15 100644 --- a/service/integration/obligations_test.go +++ b/service/integration/obligations_test.go @@ -23,6 +23,21 @@ type ObligationsSuite struct { ctx context.Context //nolint:containedctx // context is used in the test suite } +type TriggerSetup struct { + createdObl *policy.Obligation + namespace *fixtures.FixtureDataNamespace + action *policy.Action + attributeValues []*fixtures.FixtureDataAttributeValue +} + +type TriggerAssertion struct { + expectedAction *policy.Action + expectedObligation *policy.Obligation + expectedAttributeValue *fixtures.FixtureDataAttributeValue + expectedAttributeValueFQN string + expectedObligationValue *policy.ObligationValue +} + func (s *ObligationsSuite) SetupSuite() { slog.Info("setting up db.Obligations test suite") s.ctx = context.Background() @@ -547,6 +562,96 @@ func (s *ObligationsSuite) Test_CreateObligationValue_Succeeds() { s.deleteObligations([]string{createdObl.GetId()}) } +func (s *ObligationsSuite) Test_CreateObligationValue_WithTriggers_IDs_Succeeds() { + // Set up the obligation + triggerSetup := s.setupTriggerTests() + defer s.deleteObligations([]string{triggerSetup.createdObl.GetId()}) + + // Create the obligation value with a trigger + oblValue, err := s.db.PolicyClient.CreateObligationValue(s.ctx, &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{ + Id: triggerSetup.createdObl.GetId(), + }, + Value: oblValPrefix + "test-1", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[0].ID}, + }, + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[1].ID}, + }, + }, + }) + + // Assert the results + s.Require().NoError(err) + s.NotNil(oblValue) + s.assertObligationValueBasics(oblValue, oblValPrefix+"test-1", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(oblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: oblValue, + }, + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[1], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value2", + expectedObligationValue: oblValue, + }, + }) +} + +func (s *ObligationsSuite) Test_CreateObligationValue_WithTriggers_FQNsNames_Succeeds() { + // Set up the obligation + triggerSetup := s.setupTriggerTests() + defer s.deleteObligations([]string{triggerSetup.createdObl.GetId()}) + + // Create the obligation value with a trigger + oblValue, err := s.db.PolicyClient.CreateObligationValue(s.ctx, &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{ + Id: triggerSetup.createdObl.GetId(), + }, + Value: oblValPrefix + "test-1", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Name: triggerSetup.action.GetName()}, + AttributeValue: &common.IdFqnIdentifier{Fqn: "https://example.com/attr/attr1/value/value1"}, + }, + { + Action: &common.IdNameIdentifier{Name: triggerSetup.action.GetName()}, + AttributeValue: &common.IdFqnIdentifier{Fqn: "https://example.com/attr/attr1/value/value2"}, + }, + }, + }) + + // Assert the results + s.Require().NoError(err) + s.NotNil(oblValue) + s.assertObligationValueBasics(oblValue, oblValPrefix+"test-1", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(oblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: oblValue, + }, + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[1], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value2", + expectedObligationValue: oblValue, + }, + }) +} + func (s *ObligationsSuite) Test_CreateObligationValue_Fails() { // Test 1: Invalid obligation ID oblValue, err := s.db.PolicyClient.CreateObligationValue(s.ctx, &obligations.CreateObligationValueRequest{ @@ -918,6 +1023,142 @@ func (s *ObligationsSuite) Test_UpdateObligationValue_Succeeds() { s.deleteObligations([]string{createdObl.GetId()}) } +// TODO: Add a test to verify that no existing triggers change when not specifying triggers. +// TODO: Add test when we return triggers in Obligation GETs/Lists +func (s *ObligationsSuite) Test_UpdateObligationValue_WithTriggers_IDs_Succeeds() { + triggerSetup := s.setupTriggerTests() + defer s.deleteObligations([]string{triggerSetup.createdObl.GetId()}) + + oblValue, err := s.db.PolicyClient.CreateObligationValue(s.ctx, &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{ + Id: triggerSetup.createdObl.GetId(), + }, + Value: oblValPrefix + "test-1", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[0].ID}, + }, + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[1].ID}, + }, + }, + }) + + // Assert the results + s.Require().NoError(err) + s.NotNil(oblValue) + s.assertObligationValueBasics(oblValue, oblValPrefix+"test-1", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(oblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: oblValue, + }, + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value2", + expectedAttributeValue: triggerSetup.attributeValues[1], + expectedObligationValue: oblValue, + }, + }) + + updatedOblValue, err := s.db.PolicyClient.UpdateObligationValue(s.ctx, &obligations.UpdateObligationValueRequest{ + Id: oblValue.GetId(), + Value: oblValPrefix + "test-1-updated", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[0].ID}, + }, + }, + }) + s.Require().NoError(err) + s.NotNil(updatedOblValue) + s.assertObligationValueBasics(updatedOblValue, oblValPrefix+"test-1-updated", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(updatedOblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: updatedOblValue, + }, + }) + s.Require().NotEqual(oblValue.GetTriggers()[1].GetAttributeValue().GetFqn(), updatedOblValue.GetTriggers()[0].GetAttributeValue().GetFqn(), "The second trigger should have been removed") +} + +func (s *ObligationsSuite) Test_UpdateObligationValue_WithTriggers_FQNName_Succeeds() { + triggerSetup := s.setupTriggerTests() + defer s.deleteObligations([]string{triggerSetup.createdObl.GetId()}) + + oblValue, err := s.db.PolicyClient.CreateObligationValue(s.ctx, &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{ + Id: triggerSetup.createdObl.GetId(), + }, + Value: oblValPrefix + "test-1", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[0].ID}, + }, + { + Action: &common.IdNameIdentifier{Id: triggerSetup.action.GetId()}, + AttributeValue: &common.IdFqnIdentifier{Id: triggerSetup.attributeValues[1].ID}, + }, + }, + }) + + // Assert the results + s.Require().NoError(err) + s.NotNil(oblValue) + s.assertObligationValueBasics(oblValue, oblValPrefix+"test-1", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(oblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: oblValue, + }, + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value2", + expectedAttributeValue: triggerSetup.attributeValues[1], + expectedObligationValue: oblValue, + }, + }) + + updatedOblValue, err := s.db.PolicyClient.UpdateObligationValue(s.ctx, &obligations.UpdateObligationValueRequest{ + Id: oblValue.GetId(), + Value: oblValPrefix + "test-1-updated", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Name: triggerSetup.action.GetName()}, + AttributeValue: &common.IdFqnIdentifier{Fqn: "https://example.com/attr/attr1/value/value1"}, + }, + }, + }) + s.Require().NoError(err) + s.NotNil(updatedOblValue) + s.assertObligationValueBasics(updatedOblValue, oblValPrefix+"test-1-updated", triggerSetup.namespace.ID, triggerSetup.namespace.Name, httpsPrefix+triggerSetup.namespace.Name) + s.assertTriggers(updatedOblValue, []*TriggerAssertion{ + { + expectedAction: triggerSetup.action, + expectedObligation: triggerSetup.createdObl, + expectedAttributeValue: triggerSetup.attributeValues[0], + expectedAttributeValueFQN: "https://example.com/attr/attr1/value/value1", + expectedObligationValue: updatedOblValue, + }, + }) + s.Require().NotEqual(oblValue.GetTriggers()[1].GetAttributeValue().GetFqn(), updatedOblValue.GetTriggers()[0].GetAttributeValue().GetFqn(), "The second trigger should have been removed") +} + func (s *ObligationsSuite) Test_UpdateObligationValue_Fails() { oblName := oblName + "-update-fails" // Test 1: Invalid value ID @@ -1077,6 +1318,47 @@ func (s *ObligationsSuite) assertObligationValueBasics(oblValue *policy.Obligati s.assertMetadata(oblValue.GetMetadata()) } +func (s *ObligationsSuite) setupTriggerTests() *TriggerSetup { + namespaceID, _, namespace := s.getNamespaceData(nsExampleCom) + createdObl := s.createObligation(namespaceID, oblName, nil) + triggerAction := s.f.GetStandardAction("read") + triggerAttributeValue := s.f.GetAttributeValueKey("example.com/attr/attr1/value/value1") + triggerAttributeValue2 := s.f.GetAttributeValueKey("example.com/attr/attr1/value/value2") + + return &TriggerSetup{ + createdObl: createdObl, + namespace: &namespace, + action: triggerAction, + attributeValues: []*fixtures.FixtureDataAttributeValue{ + &triggerAttributeValue, + &triggerAttributeValue2, + }, + } +} + +func (s *ObligationsSuite) assertTriggers(oblVal *policy.ObligationValue, expectedTriggers []*TriggerAssertion) { + triggers := oblVal.GetTriggers() + s.Require().NotNil(triggers) + s.Require().Len(triggers, len(expectedTriggers)) + found := 0 + for _, t := range triggers { + for _, expected := range expectedTriggers { + if t.GetAction().GetId() == expected.expectedAction.GetId() && + t.GetAttributeValue().GetId() == expected.expectedAttributeValue.ID && + t.GetObligationValue().GetId() == expected.expectedObligationValue.GetId() { + found++ + s.Require().Equal(expected.expectedAction.GetName(), t.GetAction().GetName()) + s.Require().Equal(expected.expectedAttributeValue.Value, t.GetAttributeValue().GetValue()) + s.Require().Equal(expected.expectedAttributeValueFQN, t.GetAttributeValue().GetFqn()) + s.Require().Equal(expected.expectedObligationValue.GetValue(), t.GetObligationValue().GetValue()) + s.Require().Equal(expected.expectedObligationValue.GetObligation().GetId(), t.GetObligationValue().GetObligation().GetId()) + s.Require().Equal(oblVal.GetObligation().GetId(), t.GetObligationValue().GetObligation().GetId()) + } + } + } + s.Require().Equal(len(expectedTriggers), found) +} + func (s *ObligationsSuite) createObligation(namespaceID, name string, values []string) *policy.Obligation { obl, err := s.db.PolicyClient.CreateObligation(s.ctx, &obligations.CreateObligationRequest{ NamespaceIdentifier: &obligations.CreateObligationRequest_Id{ diff --git a/service/pkg/db/errors.go b/service/pkg/db/errors.go index 1abba532c7..f765b36f1c 100644 --- a/service/pkg/db/errors.go +++ b/service/pkg/db/errors.go @@ -37,6 +37,7 @@ var ( ErrNamespaceMismatch = errors.New("ErrNamespaceMismatch: namespace mismatch") ErrKIDMismatch = errors.New("ErrKIDMismatch: Key ID mismatch") ErrKasURIMismatch = errors.New("ErrKasURIMismatch: KAS URI mismatch") + ErrInvalidOblTriParam = errors.New("ErrInvalidOblTriParam: either the obligation value, attribute value, or action provided was not found") ) // Get helpful error message for PostgreSQL violation @@ -127,6 +128,7 @@ const ( ErrorTextNamespaceMismatch = "namespace mismatch" ErrorTextKasURIMismatch = "kas uri mismatch" ErrorTextKIDMismatch = "key id mismatch" + ErrorTextInvalidOblTrigParam = "either the obligation value, attribute value, or action provided is invalid" ) func StatusifyError(ctx context.Context, l *logger.Logger, err error, fallbackErr string, logs ...any) error { @@ -191,6 +193,10 @@ func StatusifyError(ctx context.Context, l *logger.Logger, err error, fallbackEr l.ErrorContext(ctx, ErrorTextKasURIMismatch, logs...) return connect.NewError(connect.CodeInvalidArgument, errors.New(ErrorTextKasURIMismatch)) } + if errors.Is(err, ErrInvalidOblTriParam) { + l.ErrorContext(ctx, ErrorTextInvalidOblTrigParam, logs...) + return connect.NewError(connect.CodeInvalidArgument, errors.New(ErrorTextInvalidOblTrigParam)) + } l.ErrorContext(ctx, "request error", append(logs, slog.Any("error", err))...) return connect.NewError(connect.CodeInternal, errors.New(fallbackErr)) diff --git a/service/policy/db/obligations.go b/service/policy/db/obligations.go index a6766a16c8..0db0681913 100644 --- a/service/policy/db/obligations.go +++ b/service/policy/db/obligations.go @@ -2,6 +2,7 @@ package db import ( "context" + "errors" "fmt" "strings" @@ -323,6 +324,22 @@ func (c PolicyDBClient) CreateObligationValue(ctx context.Context, r *obligation return nil, db.WrapIfKnownInvalidQueryErr(err) } + // Create triggers for obligation value if provided + triggers := make([]*policy.ObligationTrigger, len(r.GetTriggers())) + if len(r.GetTriggers()) > 0 { + for i, trigger := range r.GetTriggers() { + createdTrigger, err := c.CreateObligationTrigger(ctx, &obligations.AddObligationTriggerRequest{ + ObligationValue: &common.IdFqnIdentifier{Id: row.ID}, + Action: trigger.GetAction(), + AttributeValue: trigger.GetAttributeValue(), + }) + if err != nil { + return nil, err + } + triggers[i] = createdTrigger + } + } + namespace := &policy.Namespace{} if err := unmarshalNamespace(row.Namespace, namespace); err != nil { return nil, fmt.Errorf("failed to unmarshal obligation namespace: %w", err) @@ -347,6 +364,7 @@ func (c PolicyDBClient) CreateObligationValue(ctx context.Context, r *obligation Obligation: obl, Value: value, Metadata: metadata, + Triggers: triggers, }, nil } @@ -478,11 +496,36 @@ func (c PolicyDBClient) UpdateObligationValue(ctx context.Context, r *obligation metadata.CreatedAt = oblVal.GetMetadata().GetCreatedAt() metadata.UpdatedAt = now + // Update triggers for obligation value if provided + triggers := oblVal.GetTriggers() + if len(r.GetTriggers()) > 0 { + // Delete all existing triggers for this obligation value + _, err := c.queries.deleteAllObligationTriggersForValue(ctx, id) + if err != nil { + return nil, db.WrapIfKnownInvalidQueryErr(err) + } + + // Create new triggers + triggers = make([]*policy.ObligationTrigger, len(r.GetTriggers())) + for i, trigger := range r.GetTriggers() { + createdTrigger, err := c.CreateObligationTrigger(ctx, &obligations.AddObligationTriggerRequest{ + ObligationValue: &common.IdFqnIdentifier{Id: id}, + Action: trigger.GetAction(), + AttributeValue: trigger.GetAttributeValue(), + }) + if err != nil { + return nil, err + } + triggers[i] = createdTrigger + } + } + return &policy.ObligationValue{ Id: id, Value: value, Metadata: metadata, Obligation: oblVal.GetObligation(), + Triggers: triggers, }, nil } @@ -549,7 +592,11 @@ func (c PolicyDBClient) CreateObligationTrigger(ctx context.Context, r *obligati } row, err := c.queries.createObligationTrigger(ctx, params) if err != nil { - return nil, db.WrapIfKnownInvalidQueryErr(err) + wrappedErr := db.WrapIfKnownInvalidQueryErr(err) + if errors.Is(wrappedErr, db.ErrNotNullViolation) { + return nil, errors.Join(db.ErrInvalidOblTriParam, wrappedErr) + } + return nil, wrappedErr } metadata := &common.Metadata{} diff --git a/service/policy/db/obligations.sql.go b/service/policy/db/obligations.sql.go index 3e0c9ac120..e8ea326a8b 100644 --- a/service/policy/db/obligations.sql.go +++ b/service/policy/db/obligations.sql.go @@ -452,6 +452,23 @@ func (q *Queries) createObligationValue(ctx context.Context, arg createObligatio return i, err } +const deleteAllObligationTriggersForValue = `-- name: deleteAllObligationTriggersForValue :execrows +DELETE FROM obligation_triggers +WHERE obligation_value_id = $1 +` + +// deleteAllObligationTriggersForValue +// +// DELETE FROM obligation_triggers +// WHERE obligation_value_id = $1 +func (q *Queries) deleteAllObligationTriggersForValue(ctx context.Context, obligationValueID string) (int64, error) { + result, err := q.db.Exec(ctx, deleteAllObligationTriggersForValue, obligationValueID) + if err != nil { + return 0, err + } + return result.RowsAffected(), nil +} + const deleteObligation = `-- name: deleteObligation :one DELETE FROM obligation_definitions WHERE id IN ( diff --git a/service/policy/db/queries/obligations.sql b/service/policy/db/queries/obligations.sql index 61103403a0..2b8886f763 100644 --- a/service/policy/db/queries/obligations.sql +++ b/service/policy/db/queries/obligations.sql @@ -390,6 +390,11 @@ JOIN actions a ON i.action_id = a.id JOIN attribute_values av ON i.attribute_value_id = av.id LEFT JOIN attribute_fqns av_fqns ON av_fqns.value_id = av.id; +-- name: deleteAllObligationTriggersForValue :execrows +DELETE FROM obligation_triggers +WHERE obligation_value_id = $1; + + -- name: deleteObligationTrigger :one DELETE FROM obligation_triggers WHERE id = $1 diff --git a/service/policy/obligations/obligations.proto b/service/policy/obligations/obligations.proto index c661e9ba81..1d1cf7416e 100644 --- a/service/policy/obligations/obligations.proto +++ b/service/policy/obligations/obligations.proto @@ -20,6 +20,13 @@ message GetObligationRequest { } } +message ValueTriggerRequest { + // Required. The ID of the action that will trigger this obligation value policy decisioning. + common.IdNameIdentifier action = 1 [(buf.validate.field).required = true]; + // Required. The attribute value ID that will trigger this obligation value policy decisioning. + common.IdFqnIdentifier attribute_value = 2 [(buf.validate.field).required = true]; +} + message GetObligationResponse { policy.Obligation obligation = 1; } @@ -122,6 +129,10 @@ message CreateObligationValueRequest { } string value = 3; + // Optional + // Combination of action and attribute_value that will trigger this obligation value policy decisioning. + repeated ValueTriggerRequest triggers = 4; + // Optional // Common metadata common.MetadataMutable metadata = 100; @@ -137,6 +148,10 @@ message UpdateObligationValueRequest { // Optional string value = 2; + + // Optional + // Obligation Triggers provided here will replace all existing records in the database. + repeated ValueTriggerRequest triggers = 3; common.MetadataMutable metadata = 100; common.MetadataUpdateEnum metadata_update_behavior = 101; } diff --git a/service/policy/obligations/obligations_test.go b/service/policy/obligations/obligations_test.go index 8fee37b38e..a3b511da80 100644 --- a/service/policy/obligations/obligations_test.go +++ b/service/policy/obligations/obligations_test.go @@ -12,6 +12,7 @@ import ( const ( invalidUUID = "invalid-uuid" + validURI = "https://example.com/attr/value/1" invalidName = "&hello" ) @@ -231,3 +232,271 @@ func Test_RemoveObligationTrigger_Request(t *testing.T) { }) } } + +func Test_CreateObligationValue_Request(t *testing.T) { + validUUID := uuid.NewString() + testCases := []struct { + name string + req *obligations.CreateObligationValueRequest + expectError bool + errorMessage string + }{ + { + name: "valid with no triggers", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + }, + expectError: false, + }, + { + name: "valid with fqn and no triggers", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Fqn{Fqn: "f.q.n"}, + Value: "value", + }, + expectError: false, + }, + { + name: "valid with one trigger and ids", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: false, + }, + { + name: "valid with one trigger and fqns/names", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Name: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Fqn: validURI}, + }, + }, + }, + expectError: false, + }, + { + name: "valid with multiple triggers", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: false, + }, + { + name: "invalid trigger with invalid action_id", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: invalidUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "action.id", + }, + { + name: "invalid trigger with invalid attribute_value_id", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: invalidUUID}, + }, + }, + }, + expectError: true, + errorMessage: "attribute_value.id", + }, + { + name: "invalid trigger with missing action_id", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "action", + }, + { + name: "invalid trigger with missing attribute_value_id", + req: &obligations.CreateObligationValueRequest{ + ObligationIdentifier: &obligations.CreateObligationValueRequest_Id{Id: validUUID}, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "attribute_value", + }, + } + + v := getValidator() + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := v.Validate(tc.req) + if tc.expectError { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errorMessage) + } else { + require.NoError(t, err) + } + }) + } +} + +func Test_UpdateObligationValue_Request(t *testing.T) { + validUUID := uuid.NewString() + testCases := []struct { + name string + req *obligations.UpdateObligationValueRequest + expectError bool + errorMessage string + }{ + { + name: "valid with no triggers", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + }, + expectError: false, + }, + { + name: "valid with one trigger", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Fqn: validURI}, + }, + }, + }, + expectError: false, + }, + { + name: "valid with multiple triggers", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: false, + }, + { + name: "invalid trigger with invalid action_id", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: invalidUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "action.id", + }, + { + name: "invalid trigger with invalid attribute_value_id", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + AttributeValue: &common.IdFqnIdentifier{Id: invalidUUID}, + }, + }, + }, + expectError: true, + errorMessage: "attribute_value.id", + }, + { + name: "invalid trigger with missing action_id", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + AttributeValue: &common.IdFqnIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "action", + }, + { + name: "invalid trigger with missing attribute_value_id", + req: &obligations.UpdateObligationValueRequest{ + Id: validUUID, + Value: "value", + Triggers: []*obligations.ValueTriggerRequest{ + { + Action: &common.IdNameIdentifier{Id: validUUID}, + }, + }, + }, + expectError: true, + errorMessage: "attribute_value", + }, + } + + v := getValidator() + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + err := v.Validate(tc.req) + if tc.expectError { + require.Error(t, err) + require.Contains(t, err.Error(), tc.errorMessage) + } else { + require.NoError(t, err) + } + }) + } +}