From 7a9c6a77d8cb81f41b5b5db003b3ea3788c5c3fc Mon Sep 17 00:00:00 2001 From: Conor Schaefer Date: Fri, 18 Aug 2023 14:06:04 -0700 Subject: [PATCH] PARTIAL: custom BlockHeight for tx info requests --- .../proto/src/gen/penumbra.view.v1alpha1.rs | 62 +- .../src/gen/penumbra.view.v1alpha1.serde.rs | 432 +++++- crates/proto/src/gen/proto_descriptor.bin | 4 +- crates/view/src/client.rs | 16 +- crates/view/src/note_record.rs | 10 +- crates/view/src/service.rs | 16 +- crates/view/src/swap_record.rs | 10 +- crates/wasm/src/note_record.rs | 10 +- crates/wasm/src/swap_record.rs | 10 +- .../go/gen/penumbra/view/v1alpha1/view.pb.go | 1252 ++++++++++------- .../penumbra/view/v1alpha1/view.proto | 31 +- 11 files changed, 1300 insertions(+), 553 deletions(-) diff --git a/crates/proto/src/gen/penumbra.view.v1alpha1.rs b/crates/proto/src/gen/penumbra.view.v1alpha1.rs index 1a9136e510..cb21daa46e 100644 --- a/crates/proto/src/gen/penumbra.view.v1alpha1.rs +++ b/crates/proto/src/gen/penumbra.view.v1alpha1.rs @@ -578,18 +578,28 @@ pub struct TransactionInfoByHashRequest { #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionInfoRequest { /// If present, return only transactions after this height. - #[prost(uint64, tag = "1")] - pub start_height: u64, + #[prost(message, optional, tag = "1")] + pub start_height: ::core::option::Option, /// If present, return only transactions before this height. - #[prost(uint64, tag = "2")] - pub end_height: u64, + #[prost(message, optional, tag = "2")] + pub end_height: ::core::option::Option, +} +/// Nested message and enum types in `TransactionInfoRequest`. +pub mod transaction_info_request { + /// Submessage to represent optionality for specifying heights. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BlockHeight { + #[prost(uint64, tag = "1")] + pub height: u64, + } } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionInfo { /// The height the transaction was included in a block, if known. - #[prost(uint64, tag = "1")] - pub height: u64, + #[prost(message, optional, tag = "1")] + pub height: ::core::option::Option, /// The hash of the transaction. #[prost(message, optional, tag = "2")] pub id: ::core::option::Option, @@ -609,6 +619,16 @@ pub struct TransactionInfo { super::super::core::transaction::v1alpha1::TransactionView, >, } +/// Nested message and enum types in `TransactionInfo`. +pub mod transaction_info { + /// Submessage to represent optionality for block height. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BlockHeight { + #[prost(uint64, tag = "1")] + pub height: u64, + } +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct TransactionInfoResponse { @@ -663,8 +683,9 @@ pub struct SpendableNoteRecord { #[prost(uint64, tag = "5")] pub height_created: u64, /// Records whether the note was spent (and if so, at what height). - #[prost(uint64, tag = "6")] - pub height_spent: u64, + /// Present if the note was spent, otherwise absent. + #[prost(message, optional, tag = "6")] + pub height_spent: ::core::option::Option, /// The note position. #[prost(uint64, tag = "7")] pub position: u64, @@ -672,6 +693,16 @@ pub struct SpendableNoteRecord { #[prost(message, optional, tag = "8")] pub source: ::core::option::Option, } +/// Nested message and enum types in `SpendableNoteRecord`. +pub mod spendable_note_record { + /// A submessage to represent optionality for height at which a note was spent. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BlockHeight { + #[prost(uint64, tag = "1")] + pub height: u64, + } +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct SwapRecord { @@ -691,11 +722,22 @@ pub struct SwapRecord { pub output_data: ::core::option::Option< super::super::core::dex::v1alpha1::BatchSwapOutputData, >, - #[prost(uint64, tag = "6")] - pub height_claimed: u64, + /// If present, height at which Swap was claimed. + #[prost(message, optional, tag = "6")] + pub height_claimed: ::core::option::Option, #[prost(message, optional, tag = "7")] pub source: ::core::option::Option, } +/// Nested message and enum types in `SwapRecord`. +pub mod swap_record { + /// Submessage to represent optionality for block height. + #[allow(clippy::derive_partial_eq_without_eq)] + #[derive(Clone, PartialEq, ::prost::Message)] + pub struct BlockHeight { + #[prost(uint64, tag = "1")] + pub height: u64, + } +} #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] pub struct OwnedPositionIdsRequest { diff --git a/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs b/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs index b27152e617..c0fa626311 100644 --- a/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs +++ b/crates/proto/src/gen/penumbra.view.v1alpha1.serde.rs @@ -2996,7 +2996,7 @@ impl serde::Serialize for SpendableNoteRecord { if self.height_created != 0 { len += 1; } - if self.height_spent != 0 { + if self.height_spent.is_some() { len += 1; } if self.position != 0 { @@ -3021,8 +3021,8 @@ impl serde::Serialize for SpendableNoteRecord { if self.height_created != 0 { struct_ser.serialize_field("heightCreated", ToString::to_string(&self.height_created).as_str())?; } - if self.height_spent != 0 { - struct_ser.serialize_field("heightSpent", ToString::to_string(&self.height_spent).as_str())?; + if let Some(v) = self.height_spent.as_ref() { + struct_ser.serialize_field("heightSpent", v)?; } if self.position != 0 { struct_ser.serialize_field("position", ToString::to_string(&self.position).as_str())?; @@ -3158,9 +3158,7 @@ impl<'de> serde::Deserialize<'de> for SpendableNoteRecord { if height_spent__.is_some() { return Err(serde::de::Error::duplicate_field("heightSpent")); } - height_spent__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; + height_spent__ = map.next_value()?; } GeneratedField::Position => { if position__.is_some() { @@ -3184,7 +3182,7 @@ impl<'de> serde::Deserialize<'de> for SpendableNoteRecord { address_index: address_index__, nullifier: nullifier__, height_created: height_created__.unwrap_or_default(), - height_spent: height_spent__.unwrap_or_default(), + height_spent: height_spent__, position: position__.unwrap_or_default(), source: source__, }) @@ -3193,6 +3191,99 @@ impl<'de> serde::Deserialize<'de> for SpendableNoteRecord { deserializer.deserialize_struct("penumbra.view.v1alpha1.SpendableNoteRecord", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for spendable_note_record::BlockHeight { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.height != 0 { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.SpendableNoteRecord.BlockHeight", len)?; + if self.height != 0 { + struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for spendable_note_record::BlockHeight { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = spendable_note_record::BlockHeight; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1alpha1.SpendableNoteRecord.BlockHeight") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + } + } + Ok(spendable_note_record::BlockHeight { + height: height__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1alpha1.SpendableNoteRecord.BlockHeight", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for StatusRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -3845,7 +3936,7 @@ impl serde::Serialize for SwapRecord { if self.output_data.is_some() { len += 1; } - if self.height_claimed != 0 { + if self.height_claimed.is_some() { len += 1; } if self.source.is_some() { @@ -3867,8 +3958,8 @@ impl serde::Serialize for SwapRecord { if let Some(v) = self.output_data.as_ref() { struct_ser.serialize_field("outputData", v)?; } - if self.height_claimed != 0 { - struct_ser.serialize_field("heightClaimed", ToString::to_string(&self.height_claimed).as_str())?; + if let Some(v) = self.height_claimed.as_ref() { + struct_ser.serialize_field("heightClaimed", v)?; } if let Some(v) = self.source.as_ref() { struct_ser.serialize_field("source", v)?; @@ -3996,9 +4087,7 @@ impl<'de> serde::Deserialize<'de> for SwapRecord { if height_claimed__.is_some() { return Err(serde::de::Error::duplicate_field("heightClaimed")); } - height_claimed__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; + height_claimed__ = map.next_value()?; } GeneratedField::Source => { if source__.is_some() { @@ -4014,7 +4103,7 @@ impl<'de> serde::Deserialize<'de> for SwapRecord { position: position__.unwrap_or_default(), nullifier: nullifier__, output_data: output_data__, - height_claimed: height_claimed__.unwrap_or_default(), + height_claimed: height_claimed__, source: source__, }) } @@ -4022,7 +4111,7 @@ impl<'de> serde::Deserialize<'de> for SwapRecord { deserializer.deserialize_struct("penumbra.view.v1alpha1.SwapRecord", FIELDS, GeneratedVisitor) } } -impl serde::Serialize for TransactionInfo { +impl serde::Serialize for swap_record::BlockHeight { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result where @@ -4033,6 +4122,99 @@ impl serde::Serialize for TransactionInfo { if self.height != 0 { len += 1; } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.SwapRecord.BlockHeight", len)?; + if self.height != 0 { + struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for swap_record::BlockHeight { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = swap_record::BlockHeight; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1alpha1.SwapRecord.BlockHeight") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + } + } + Ok(swap_record::BlockHeight { + height: height__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1alpha1.SwapRecord.BlockHeight", FIELDS, GeneratedVisitor) + } +} +impl serde::Serialize for TransactionInfo { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.height.is_some() { + len += 1; + } if self.id.is_some() { len += 1; } @@ -4046,8 +4228,8 @@ impl serde::Serialize for TransactionInfo { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.TransactionInfo", len)?; - if self.height != 0 { - struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + if let Some(v) = self.height.as_ref() { + struct_ser.serialize_field("height", v)?; } if let Some(v) = self.id.as_ref() { struct_ser.serialize_field("id", v)?; @@ -4141,9 +4323,7 @@ impl<'de> serde::Deserialize<'de> for TransactionInfo { if height__.is_some() { return Err(serde::de::Error::duplicate_field("height")); } - height__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; + height__ = map.next_value()?; } GeneratedField::Id => { if id__.is_some() { @@ -4172,7 +4352,7 @@ impl<'de> serde::Deserialize<'de> for TransactionInfo { } } Ok(TransactionInfo { - height: height__.unwrap_or_default(), + height: height__, id: id__, transaction: transaction__, perspective: perspective__, @@ -4183,6 +4363,99 @@ impl<'de> serde::Deserialize<'de> for TransactionInfo { deserializer.deserialize_struct("penumbra.view.v1alpha1.TransactionInfo", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for transaction_info::BlockHeight { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.height != 0 { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.TransactionInfo.BlockHeight", len)?; + if self.height != 0 { + struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for transaction_info::BlockHeight { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = transaction_info::BlockHeight; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1alpha1.TransactionInfo.BlockHeight") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + } + } + Ok(transaction_info::BlockHeight { + height: height__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1alpha1.TransactionInfo.BlockHeight", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for TransactionInfoByHashRequest { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result @@ -4374,18 +4647,18 @@ impl serde::Serialize for TransactionInfoRequest { { use serde::ser::SerializeStruct; let mut len = 0; - if self.start_height != 0 { + if self.start_height.is_some() { len += 1; } - if self.end_height != 0 { + if self.end_height.is_some() { len += 1; } let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.TransactionInfoRequest", len)?; - if self.start_height != 0 { - struct_ser.serialize_field("startHeight", ToString::to_string(&self.start_height).as_str())?; + if let Some(v) = self.start_height.as_ref() { + struct_ser.serialize_field("startHeight", v)?; } - if self.end_height != 0 { - struct_ser.serialize_field("endHeight", ToString::to_string(&self.end_height).as_str())?; + if let Some(v) = self.end_height.as_ref() { + struct_ser.serialize_field("endHeight", v)?; } struct_ser.end() } @@ -4457,29 +4730,118 @@ impl<'de> serde::Deserialize<'de> for TransactionInfoRequest { if start_height__.is_some() { return Err(serde::de::Error::duplicate_field("startHeight")); } - start_height__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; + start_height__ = map.next_value()?; } GeneratedField::EndHeight => { if end_height__.is_some() { return Err(serde::de::Error::duplicate_field("endHeight")); } - end_height__ = - Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) - ; + end_height__ = map.next_value()?; } } } Ok(TransactionInfoRequest { - start_height: start_height__.unwrap_or_default(), - end_height: end_height__.unwrap_or_default(), + start_height: start_height__, + end_height: end_height__, }) } } deserializer.deserialize_struct("penumbra.view.v1alpha1.TransactionInfoRequest", FIELDS, GeneratedVisitor) } } +impl serde::Serialize for transaction_info_request::BlockHeight { + #[allow(deprecated)] + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + use serde::ser::SerializeStruct; + let mut len = 0; + if self.height != 0 { + len += 1; + } + let mut struct_ser = serializer.serialize_struct("penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight", len)?; + if self.height != 0 { + struct_ser.serialize_field("height", ToString::to_string(&self.height).as_str())?; + } + struct_ser.end() + } +} +impl<'de> serde::Deserialize<'de> for transaction_info_request::BlockHeight { + #[allow(deprecated)] + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + const FIELDS: &[&str] = &[ + "height", + ]; + + #[allow(clippy::enum_variant_names)] + enum GeneratedField { + Height, + } + impl<'de> serde::Deserialize<'de> for GeneratedField { + fn deserialize(deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + struct GeneratedVisitor; + + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = GeneratedField; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(formatter, "expected one of: {:?}", &FIELDS) + } + + #[allow(unused_variables)] + fn visit_str(self, value: &str) -> std::result::Result + where + E: serde::de::Error, + { + match value { + "height" => Ok(GeneratedField::Height), + _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + } + } + } + deserializer.deserialize_identifier(GeneratedVisitor) + } + } + struct GeneratedVisitor; + impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + type Value = transaction_info_request::BlockHeight; + + fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + formatter.write_str("struct penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight") + } + + fn visit_map(self, mut map: V) -> std::result::Result + where + V: serde::de::MapAccess<'de>, + { + let mut height__ = None; + while let Some(k) = map.next_key()? { + match k { + GeneratedField::Height => { + if height__.is_some() { + return Err(serde::de::Error::duplicate_field("height")); + } + height__ = + Some(map.next_value::<::pbjson::private::NumberDeserialize<_>>()?.0) + ; + } + } + } + Ok(transaction_info_request::BlockHeight { + height: height__.unwrap_or_default(), + }) + } + } + deserializer.deserialize_struct("penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight", FIELDS, GeneratedVisitor) + } +} impl serde::Serialize for TransactionInfoResponse { #[allow(deprecated)] fn serialize(&self, serializer: S) -> std::result::Result diff --git a/crates/proto/src/gen/proto_descriptor.bin b/crates/proto/src/gen/proto_descriptor.bin index 7f987bab2d..f26e119670 100644 --- a/crates/proto/src/gen/proto_descriptor.bin +++ b/crates/proto/src/gen/proto_descriptor.bin @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b4c599ce13681e945ff28681379fd3f25c80e961dc2aa60239f5b481a1572d6 -size 332189 +oid sha256:756b552ee221381e55c8f20e5ade44ea761b4bc4a90464791eab2a09cbb3daf5 +size 333372 diff --git a/crates/view/src/client.rs b/crates/view/src/client.rs index c699fe63c9..006c1f2640 100644 --- a/crates/view/src/client.rs +++ b/crates/view/src/client.rs @@ -713,7 +713,8 @@ where let tx_info = TransactionInfo { height: rsp .height - .ok_or_else(|| anyhow::anyhow!("missing height"))?, + .ok_or_else(|| anyhow::anyhow!("missing height"))? + .height, id: rsp .id .ok_or_else(|| anyhow::anyhow!("missing id"))? @@ -745,8 +746,14 @@ where let mut self2 = self.clone(); async move { let rsp = self2.transaction_info(tonic::Request::new(pb::TransactionInfoRequest { - start_height, - end_height, + start_height: match start_height { + Some(h) => Some(pb::transaction_info_request::BlockHeight { height: h }), + None => None, + }, + end_height: match end_height { + Some(h) => Some(pb::transaction_info_request::BlockHeight { height: h }), + None => None, + }, })); let pb_txs: Vec<_> = rsp.await?.into_inner().try_collect().await?; @@ -760,7 +767,8 @@ where let tx_info = TransactionInfo { height: tx_rsp .height - .ok_or_else(|| anyhow::anyhow!("missing height"))?, + .ok_or_else(|| anyhow::anyhow!("missing height"))? + .height, transaction: tx_rsp .transaction .ok_or_else(|| { diff --git a/crates/view/src/note_record.rs b/crates/view/src/note_record.rs index 4b0100c3b8..1dd4b8215d 100644 --- a/crates/view/src/note_record.rs +++ b/crates/view/src/note_record.rs @@ -38,7 +38,10 @@ impl From for pb::SpendableNoteRecord { address_index: Some(v.address_index.into()), nullifier: Some(v.nullifier.into()), height_created: v.height_created, - height_spent: v.height_spent, + height_spent: match v.height_spent { + Some(h) => Some(pb::spendable_note_record::BlockHeight { height: h }), + None => None, + }, position: v.position.into(), source: Some(v.source.into()), } @@ -66,7 +69,10 @@ impl TryFrom for SpendableNoteRecord { .ok_or_else(|| anyhow::anyhow!("missing nullifier"))? .try_into()?, height_created: v.height_created, - height_spent: v.height_spent, + height_spent: match v.height_spent { + Some(h) => Some(h.height), + None => None, + }, position: v.position.into(), source: v .source diff --git a/crates/view/src/service.rs b/crates/view/src/service.rs index 16665f76b9..28a4981f6f 100644 --- a/crates/view/src/service.rs +++ b/crates/view/src/service.rs @@ -733,7 +733,7 @@ impl ViewProtocolService for ViewService { let response = pb::TransactionInfoByHashResponse { tx_info: Some(pb::TransactionInfo { - height: Some(height), + height: Some(pb::transaction_info::BlockHeight { height }), id: Some(tx.id().into()), perspective: Some(txp.into()), transaction: Some(tx.into()), @@ -1100,10 +1100,22 @@ impl ViewProtocolService for ViewService { request: tonic::Request, ) -> Result, tonic::Status> { self.check_worker().await?; + + // Unpack optional start/end heights. + let start_height = match &request.get_ref().start_height { + Some(h) => Some(h.height), + None => None, + }; + let end_height = match &request.get_ref().end_height { + Some(h) => Some(h.height), + None => None, + }; + + // Fetch transactions from storage. let txs = self .storage - .transactions(request.get_ref().start_height, request.get_ref().end_height) + .transactions(start_height, end_height) .await .map_err(|e| tonic::Status::unavailable(format!("error fetching transactions: {e}")))?; diff --git a/crates/view/src/swap_record.rs b/crates/view/src/swap_record.rs index 7f16a78b54..6a71cf4d5d 100644 --- a/crates/view/src/swap_record.rs +++ b/crates/view/src/swap_record.rs @@ -34,7 +34,10 @@ impl From for pb::SwapRecord { position: msg.position.into(), nullifier: Some(msg.nullifier.into()), output_data: Some(msg.output_data.into()), - height_claimed: msg.height_claimed, + height_claimed: match msg.height_claimed { + Some(h) => Some(pb::swap_record::BlockHeight { height: h }), + None => None, + }, source: Some(msg.source.into()), } } @@ -61,7 +64,10 @@ impl TryFrom for SwapRecord { .output_data .ok_or_else(|| anyhow::anyhow!("missing output_data"))? .try_into()?, - height_claimed: value.height_claimed, + height_claimed: match value.height_claimed { + Some(h) => Some(h.height), + None => None, + }, source: value .source .ok_or_else(|| anyhow::anyhow!("missing source"))? diff --git a/crates/wasm/src/note_record.rs b/crates/wasm/src/note_record.rs index db78bdef68..9d64217604 100644 --- a/crates/wasm/src/note_record.rs +++ b/crates/wasm/src/note_record.rs @@ -37,7 +37,10 @@ impl From for pb::SpendableNoteRecord { address_index: Some(v.address_index.into()), nullifier: Some(v.nullifier.into()), height_created: v.height_created, - height_spent: v.height_spent, + height_spent: match v.height_spent { + Some(h) => Some(pb::spendable_note_record::BlockHeight { height: h }), + None => None, + }, position: v.position.into(), source: Some(v.source.into()), } @@ -65,7 +68,10 @@ impl TryFrom for SpendableNoteRecord { .ok_or_else(|| anyhow::anyhow!("missing nullifier"))? .try_into()?, height_created: v.height_created, - height_spent: v.height_spent, + height_spent: match v.height_spent { + Some(h) => Some(h.height), + None => None, + }, position: v.position.into(), source: v .source diff --git a/crates/wasm/src/swap_record.rs b/crates/wasm/src/swap_record.rs index ac06e6551e..3573e40546 100644 --- a/crates/wasm/src/swap_record.rs +++ b/crates/wasm/src/swap_record.rs @@ -34,7 +34,10 @@ impl From for pb::SwapRecord { position: msg.position.into(), nullifier: Some(msg.nullifier.into()), output_data: Some(msg.output_data.into()), - height_claimed: msg.height_claimed, + height_claimed: match msg.height_claimed { + Some(h) => Some(pb::swap_record::BlockHeight { height: h }), + None => None, + }, source: Some(msg.source.into()), } } @@ -61,7 +64,10 @@ impl TryFrom for SwapRecord { .output_data .ok_or_else(|| anyhow::anyhow!("missing output_data"))? .try_into()?, - height_claimed: value.height_claimed, + height_claimed: match value.height_claimed { + Some(v) => Some(v.height), + None => None, + }, source: value .source .ok_or_else(|| anyhow::anyhow!("missing source"))? diff --git a/proto/go/gen/penumbra/view/v1alpha1/view.pb.go b/proto/go/gen/penumbra/view/v1alpha1/view.pb.go index 55706a9d1e..0634f4f935 100644 --- a/proto/go/gen/penumbra/view/v1alpha1/view.pb.go +++ b/proto/go/gen/penumbra/view/v1alpha1/view.pb.go @@ -2292,9 +2292,9 @@ type TransactionInfoRequest struct { unknownFields protoimpl.UnknownFields // If present, return only transactions after this height. - StartHeight uint64 `protobuf:"varint,1,opt,name=start_height,json=startHeight,proto3" json:"start_height,omitempty"` + StartHeight *TransactionInfoRequest_BlockHeight `protobuf:"bytes,1,opt,name=start_height,json=startHeight,proto3" json:"start_height,omitempty"` // If present, return only transactions before this height. - EndHeight uint64 `protobuf:"varint,2,opt,name=end_height,json=endHeight,proto3" json:"end_height,omitempty"` + EndHeight *TransactionInfoRequest_BlockHeight `protobuf:"bytes,2,opt,name=end_height,json=endHeight,proto3" json:"end_height,omitempty"` } func (x *TransactionInfoRequest) Reset() { @@ -2329,18 +2329,18 @@ func (*TransactionInfoRequest) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{40} } -func (x *TransactionInfoRequest) GetStartHeight() uint64 { +func (x *TransactionInfoRequest) GetStartHeight() *TransactionInfoRequest_BlockHeight { if x != nil { return x.StartHeight } - return 0 + return nil } -func (x *TransactionInfoRequest) GetEndHeight() uint64 { +func (x *TransactionInfoRequest) GetEndHeight() *TransactionInfoRequest_BlockHeight { if x != nil { return x.EndHeight } - return 0 + return nil } type TransactionInfo struct { @@ -2349,7 +2349,7 @@ type TransactionInfo struct { unknownFields protoimpl.UnknownFields // The height the transaction was included in a block, if known. - Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` + Height *TransactionInfo_BlockHeight `protobuf:"bytes,1,opt,name=height,proto3" json:"height,omitempty"` // The hash of the transaction. Id *v1alpha1.Id `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` // The transaction data itself. @@ -2392,11 +2392,11 @@ func (*TransactionInfo) Descriptor() ([]byte, []int) { return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{41} } -func (x *TransactionInfo) GetHeight() uint64 { +func (x *TransactionInfo) GetHeight() *TransactionInfo_BlockHeight { if x != nil { return x.Height } - return 0 + return nil } func (x *TransactionInfo) GetId() *v1alpha1.Id { @@ -2640,7 +2640,8 @@ type SpendableNoteRecord struct { // The height at which the note was created. HeightCreated uint64 `protobuf:"varint,5,opt,name=height_created,json=heightCreated,proto3" json:"height_created,omitempty"` // Records whether the note was spent (and if so, at what height). - HeightSpent uint64 `protobuf:"varint,6,opt,name=height_spent,json=heightSpent,proto3" json:"height_spent,omitempty"` + // Present if the note was spent, otherwise absent. + HeightSpent *SpendableNoteRecord_BlockHeight `protobuf:"bytes,6,opt,name=height_spent,json=heightSpent,proto3" json:"height_spent,omitempty"` // The note position. Position uint64 `protobuf:"varint,7,opt,name=position,proto3" json:"position,omitempty"` // The source of the note (a tx hash or otherwise) @@ -2714,11 +2715,11 @@ func (x *SpendableNoteRecord) GetHeightCreated() uint64 { return 0 } -func (x *SpendableNoteRecord) GetHeightSpent() uint64 { +func (x *SpendableNoteRecord) GetHeightSpent() *SpendableNoteRecord_BlockHeight { if x != nil { return x.HeightSpent } - return 0 + return nil } func (x *SpendableNoteRecord) GetPosition() uint64 { @@ -2745,8 +2746,9 @@ type SwapRecord struct { Position uint64 `protobuf:"varint,3,opt,name=position,proto3" json:"position,omitempty"` Nullifier *v1alpha11.Nullifier `protobuf:"bytes,4,opt,name=nullifier,proto3" json:"nullifier,omitempty"` OutputData *v1alpha14.BatchSwapOutputData `protobuf:"bytes,5,opt,name=output_data,json=outputData,proto3" json:"output_data,omitempty"` - HeightClaimed uint64 `protobuf:"varint,6,opt,name=height_claimed,json=heightClaimed,proto3" json:"height_claimed,omitempty"` - Source *v1alpha13.NoteSource `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` + // If present, height at which Swap was claimed. + HeightClaimed *SwapRecord_BlockHeight `protobuf:"bytes,6,opt,name=height_claimed,json=heightClaimed,proto3" json:"height_claimed,omitempty"` + Source *v1alpha13.NoteSource `protobuf:"bytes,7,opt,name=source,proto3" json:"source,omitempty"` } func (x *SwapRecord) Reset() { @@ -2816,11 +2818,11 @@ func (x *SwapRecord) GetOutputData() *v1alpha14.BatchSwapOutputData { return nil } -func (x *SwapRecord) GetHeightClaimed() uint64 { +func (x *SwapRecord) GetHeightClaimed() *SwapRecord_BlockHeight { if x != nil { return x.HeightClaimed } - return 0 + return nil } func (x *SwapRecord) GetSource() *v1alpha13.NoteSource { @@ -3383,6 +3385,198 @@ func (x *TransactionPlannerRequest_PositionWithdraw) GetTradingPair() *v1alpha14 return nil } +// Submessage to represent optionality for specifying heights. +type TransactionInfoRequest_BlockHeight struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *TransactionInfoRequest_BlockHeight) Reset() { + *x = TransactionInfoRequest_BlockHeight{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionInfoRequest_BlockHeight) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionInfoRequest_BlockHeight) ProtoMessage() {} + +func (x *TransactionInfoRequest_BlockHeight) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[58] + 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 TransactionInfoRequest_BlockHeight.ProtoReflect.Descriptor instead. +func (*TransactionInfoRequest_BlockHeight) Descriptor() ([]byte, []int) { + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{40, 0} +} + +func (x *TransactionInfoRequest_BlockHeight) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + +// Submessage to represent optionality for block height. +type TransactionInfo_BlockHeight struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *TransactionInfo_BlockHeight) Reset() { + *x = TransactionInfo_BlockHeight{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransactionInfo_BlockHeight) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransactionInfo_BlockHeight) ProtoMessage() {} + +func (x *TransactionInfo_BlockHeight) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[59] + 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 TransactionInfo_BlockHeight.ProtoReflect.Descriptor instead. +func (*TransactionInfo_BlockHeight) Descriptor() ([]byte, []int) { + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{41, 0} +} + +func (x *TransactionInfo_BlockHeight) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + +// A submessage to represent optionality for height at which a note was spent. +type SpendableNoteRecord_BlockHeight struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *SpendableNoteRecord_BlockHeight) Reset() { + *x = SpendableNoteRecord_BlockHeight{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpendableNoteRecord_BlockHeight) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpendableNoteRecord_BlockHeight) ProtoMessage() {} + +func (x *SpendableNoteRecord_BlockHeight) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[60] + 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 SpendableNoteRecord_BlockHeight.ProtoReflect.Descriptor instead. +func (*SpendableNoteRecord_BlockHeight) Descriptor() ([]byte, []int) { + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{46, 0} +} + +func (x *SpendableNoteRecord_BlockHeight) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + +// Submessage to represent optionality for block height. +type SwapRecord_BlockHeight struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *SwapRecord_BlockHeight) Reset() { + *x = SwapRecord_BlockHeight{} + if protoimpl.UnsafeEnabled { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SwapRecord_BlockHeight) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SwapRecord_BlockHeight) ProtoMessage() {} + +func (x *SwapRecord_BlockHeight) ProtoReflect() protoreflect.Message { + mi := &file_penumbra_view_v1alpha1_view_proto_msgTypes[61] + 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 SwapRecord_BlockHeight.ProtoReflect.Descriptor instead. +func (*SwapRecord_BlockHeight) Descriptor() ([]byte, []int) { + return file_penumbra_view_v1alpha1_view_proto_rawDescGZIP(), []int{47, 0} +} + +func (x *SwapRecord_BlockHeight) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + var File_penumbra_view_v1alpha1_view_proto protoreflect.FileDescriptor var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ @@ -3895,320 +4089,347 @@ var file_penumbra_view_v1alpha1_view_proto_rawDesc = []byte{ 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x5a, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0xdb, 0x02, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, - 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x5b, - 0x0a, 0x17, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x61, 0x0a, 0x1d, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, - 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, - 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, + 0x52, 0x02, 0x69, 0x64, 0x22, 0xf9, 0x01, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x5d, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x59, + 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x09, + 0x65, 0x6e, 0x64, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x1a, 0x25, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0xb7, 0x03, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x36, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x0b, + 0x70, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, - 0x0a, 0x0d, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, - 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0xb5, 0x01, - 0x0a, 0x16, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x65, - 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x65, - 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, - 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x4b, 0x65, 0x79, 0x22, 0xe9, 0x03, 0x0a, 0x13, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, - 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x57, 0x0a, - 0x0f, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, - 0x50, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x46, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, + 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x0b, 0x70, + 0x65, 0x72, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x47, 0x0a, 0x04, 0x76, 0x69, + 0x65, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, + 0x69, 0x65, 0x77, 0x1a, 0x25, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x5b, 0x0a, 0x17, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x61, 0x0a, 0x1d, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x74, 0x78, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x06, 0x74, 0x78, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x5d, 0x0a, 0x0d, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, + 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x16, 0x4e, 0x6f, + 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x12, 0x4d, 0x0a, 0x0c, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x4b, 0x65, 0x79, 0x52, 0x0b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4b, 0x65, + 0x79, 0x22, 0xc9, 0x04, 0x0a, 0x13, 0x53, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x57, 0x0a, 0x0f, 0x6e, 0x6f, 0x74, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, + 0x0c, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x46, 0x0a, + 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x0c, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x70, 0x65, 0x6e, + 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x0b, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x53, 0x70, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, - 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x70, 0x65, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, 0x70, - 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x40, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, - 0x6f, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x12, 0x57, 0x0a, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x77, 0x61, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0b, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x53, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x25, - 0x0a, 0x0e, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, - 0x61, 0x69, 0x6d, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x17, 0x4f, 0x77, 0x6e, 0x65, - 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, - 0x72, 0x22, 0x63, 0x0a, 0x18, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, - 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xc0, 0x13, 0x0a, 0x13, 0x56, 0x69, 0x65, 0x77, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x57, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x71, 0x0a, 0x0e, - 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2d, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, - 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, - 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, - 0x5a, 0x0a, 0x07, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x26, 0x2e, 0x70, 0x65, 0x6e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x25, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x9a, 0x04, + 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x57, 0x0a, 0x0f, + 0x73, 0x77, 0x61, 0x70, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x73, 0x77, 0x61, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x77, 0x61, 0x70, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x04, + 0x73, 0x77, 0x61, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x46, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x6e, + 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x0b, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, + 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x53, 0x77, 0x61, 0x70, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x55, 0x0a, 0x0e, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x52, 0x0d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6c, 0x61, 0x69, 0x6d, 0x65, + 0x64, 0x12, 0x40, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x1a, 0x25, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xb7, 0x01, 0x0a, 0x17, 0x4f, + 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x69, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, + 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x69, 0x72, 0x22, 0x63, 0x0a, 0x18, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x47, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x78, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x52, 0x0a, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xc0, 0x13, 0x0a, 0x13, 0x56, 0x69, + 0x65, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x57, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2b, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, - 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x57, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, - 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, - 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x59, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, - 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, 0x0f, 0x43, 0x68, - 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x2e, - 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x68, 0x61, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x05, 0x4e, 0x6f, 0x74, 0x65, 0x73, + 0x12, 0x24, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, + 0x71, 0x0a, 0x0e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, + 0x67, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, + 0x46, 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x46, + 0x6f, 0x72, 0x56, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x07, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, - 0x0a, 0x0d, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, + 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, + 0x0a, 0x0f, 0x57, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x57, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x59, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x70, + 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x72, 0x0a, + 0x0f, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6c, 0x0a, 0x0d, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x2c, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x6f, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6f, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, + 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x75, 0x0a, 0x10, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, + 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x42, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x4d, 0x44, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2d, - 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4e, 0x6f, 0x74, + 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x79, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, - 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x2d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x79, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, - 0x0a, 0x10, 0x45, 0x70, 0x68, 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, 0x65, - 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, - 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x45, 0x70, 0x68, - 0x65, 0x6d, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x75, 0x0a, 0x10, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, + 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, + 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x4e, 0x75, 0x6c, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x75, 0x0a, 0x10, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, + 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x65, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, - 0x10, 0x53, 0x77, 0x61, 0x70, 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x42, - 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x77, 0x61, 0x70, - 0x42, 0x79, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x72, 0x0a, 0x0f, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, - 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x15, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, - 0x73, 0x68, 0x12, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, - 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x74, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, - 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7b, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x70, 0x65, + 0x68, 0x61, 0x31, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x84, 0x01, 0x0a, 0x15, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, + 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, + 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x74, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, + 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, 0x7b, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x70, 0x65, - 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, - 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2f, 0x2e, 0x70, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x70, 0x65, + 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, + 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6c, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x14, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, + 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, + 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x42, 0x72, 0x6f, + 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4f, 0x77, 0x6e, + 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2f, 0x2e, + 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, + 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x30, 0x01, 0x12, 0x78, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, + 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, + 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, + 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x70, 0x0a, 0x0f, + 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x5d, 0x0a, 0x08, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x30, 0x01, 0x12, - 0x78, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x12, 0x30, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, - 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, - 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x41, 0x6e, 0x64, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x70, 0x0a, 0x0f, 0x56, 0x69, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5d, 0x0a, 0x08, - 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x12, 0x27, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xf5, 0x01, 0x0a, 0x1a, - 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x76, 0x69, 0x65, - 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x09, 0x56, 0x69, 0x65, 0x77, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, 0x7a, 0x6f, 0x6e, - 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, - 0x2f, 0x76, 0x69, 0x65, 0x77, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x3b, 0x76, - 0x69, 0x65, 0x77, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x50, 0x56, - 0x58, 0xaa, 0x02, 0x16, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, 0x56, 0x69, 0x65, - 0x77, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x16, 0x50, 0x65, 0x6e, - 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x56, - 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x50, 0x65, 0x6e, 0x75, 0x6d, - 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x56, 0x69, 0x65, 0x77, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x56, 0x69, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xf5, + 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x76, 0x69, 0x65, 0x77, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x09, 0x56, + 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2d, + 0x7a, 0x6f, 0x6e, 0x65, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x65, 0x6e, 0x75, 0x6d, + 0x62, 0x72, 0x61, 0x2f, 0x76, 0x69, 0x65, 0x77, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x31, 0x3b, 0x76, 0x69, 0x65, 0x77, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xa2, 0x02, + 0x03, 0x50, 0x56, 0x58, 0xaa, 0x02, 0x16, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x2e, + 0x56, 0x69, 0x65, 0x77, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x16, + 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x22, 0x50, 0x65, 0x6e, 0x75, 0x6d, 0x62, 0x72, + 0x61, 0x5c, 0x56, 0x69, 0x65, 0x77, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x50, 0x65, + 0x6e, 0x75, 0x6d, 0x62, 0x72, 0x61, 0x3a, 0x3a, 0x56, 0x69, 0x65, 0x77, 0x3a, 0x3a, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4223,7 +4444,7 @@ func file_penumbra_view_v1alpha1_view_proto_rawDescGZIP() []byte { return file_penumbra_view_v1alpha1_view_proto_rawDescData } -var file_penumbra_view_v1alpha1_view_proto_msgTypes = make([]protoimpl.MessageInfo, 58) +var file_penumbra_view_v1alpha1_view_proto_msgTypes = make([]protoimpl.MessageInfo, 62) var file_penumbra_view_v1alpha1_view_proto_goTypes = []interface{}{ (*AuthorizeAndBuildRequest)(nil), // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest (*AuthorizeAndBuildResponse)(nil), // 1: penumbra.view.v1alpha1.AuthorizeAndBuildResponse @@ -4283,188 +4504,197 @@ var file_penumbra_view_v1alpha1_view_proto_goTypes = []interface{}{ (*TransactionPlannerRequest_PositionOpen)(nil), // 55: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen (*TransactionPlannerRequest_PositionClose)(nil), // 56: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose (*TransactionPlannerRequest_PositionWithdraw)(nil), // 57: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw - (*v1alpha1.TransactionPlan)(nil), // 58: penumbra.core.transaction.v1alpha1.TransactionPlan - (*v1alpha1.AuthorizationData)(nil), // 59: penumbra.core.transaction.v1alpha1.AuthorizationData - (*v1alpha1.Transaction)(nil), // 60: penumbra.core.transaction.v1alpha1.Transaction - (*v1alpha1.Id)(nil), // 61: penumbra.core.transaction.v1alpha1.Id - (*v1alpha11.Fee)(nil), // 62: penumbra.core.crypto.v1alpha1.Fee - (*v1alpha1.MemoPlaintext)(nil), // 63: penumbra.core.transaction.v1alpha1.MemoPlaintext - (*v1alpha11.AccountGroupId)(nil), // 64: penumbra.core.crypto.v1alpha1.AccountGroupId - (*v1alpha12.IbcAction)(nil), // 65: penumbra.core.ibc.v1alpha1.IbcAction - (*v1alpha11.AddressIndex)(nil), // 66: penumbra.core.crypto.v1alpha1.AddressIndex - (*v1alpha11.Address)(nil), // 67: penumbra.core.crypto.v1alpha1.Address - (*v1alpha11.AssetId)(nil), // 68: penumbra.core.crypto.v1alpha1.AssetId - (*v1alpha11.Value)(nil), // 69: penumbra.core.crypto.v1alpha1.Value - (*v1alpha11.FullViewingKey)(nil), // 70: penumbra.core.crypto.v1alpha1.FullViewingKey - (*v1alpha11.Amount)(nil), // 71: penumbra.core.crypto.v1alpha1.Amount - (*v1alpha11.StateCommitment)(nil), // 72: penumbra.core.crypto.v1alpha1.StateCommitment - (*v1alpha1.WitnessData)(nil), // 73: penumbra.core.transaction.v1alpha1.WitnessData - (*v1alpha11.Denom)(nil), // 74: penumbra.core.crypto.v1alpha1.Denom - (*v1alpha11.DenomMetadata)(nil), // 75: penumbra.core.crypto.v1alpha1.DenomMetadata - (*v1alpha13.ChainParameters)(nil), // 76: penumbra.core.chain.v1alpha1.ChainParameters - (*v1alpha13.FmdParameters)(nil), // 77: penumbra.core.chain.v1alpha1.FmdParameters - (*v1alpha11.Nullifier)(nil), // 78: penumbra.core.crypto.v1alpha1.Nullifier - (*v1alpha1.TransactionPerspective)(nil), // 79: penumbra.core.transaction.v1alpha1.TransactionPerspective - (*v1alpha1.TransactionView)(nil), // 80: penumbra.core.transaction.v1alpha1.TransactionView - (*v1alpha11.IdentityKey)(nil), // 81: penumbra.core.crypto.v1alpha1.IdentityKey - (*v1alpha11.Note)(nil), // 82: penumbra.core.crypto.v1alpha1.Note - (*v1alpha13.NoteSource)(nil), // 83: penumbra.core.chain.v1alpha1.NoteSource - (*v1alpha14.SwapPlaintext)(nil), // 84: penumbra.core.dex.v1alpha1.SwapPlaintext - (*v1alpha14.BatchSwapOutputData)(nil), // 85: penumbra.core.dex.v1alpha1.BatchSwapOutputData - (*v1alpha14.PositionState)(nil), // 86: penumbra.core.dex.v1alpha1.PositionState - (*v1alpha14.TradingPair)(nil), // 87: penumbra.core.dex.v1alpha1.TradingPair - (*v1alpha14.PositionId)(nil), // 88: penumbra.core.dex.v1alpha1.PositionId - (*v1alpha15.RateData)(nil), // 89: penumbra.core.stake.v1alpha1.RateData - (*v1alpha14.Position)(nil), // 90: penumbra.core.dex.v1alpha1.Position - (*v1alpha14.Reserves)(nil), // 91: penumbra.core.dex.v1alpha1.Reserves + (*TransactionInfoRequest_BlockHeight)(nil), // 58: penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight + (*TransactionInfo_BlockHeight)(nil), // 59: penumbra.view.v1alpha1.TransactionInfo.BlockHeight + (*SpendableNoteRecord_BlockHeight)(nil), // 60: penumbra.view.v1alpha1.SpendableNoteRecord.BlockHeight + (*SwapRecord_BlockHeight)(nil), // 61: penumbra.view.v1alpha1.SwapRecord.BlockHeight + (*v1alpha1.TransactionPlan)(nil), // 62: penumbra.core.transaction.v1alpha1.TransactionPlan + (*v1alpha1.AuthorizationData)(nil), // 63: penumbra.core.transaction.v1alpha1.AuthorizationData + (*v1alpha1.Transaction)(nil), // 64: penumbra.core.transaction.v1alpha1.Transaction + (*v1alpha1.Id)(nil), // 65: penumbra.core.transaction.v1alpha1.Id + (*v1alpha11.Fee)(nil), // 66: penumbra.core.crypto.v1alpha1.Fee + (*v1alpha1.MemoPlaintext)(nil), // 67: penumbra.core.transaction.v1alpha1.MemoPlaintext + (*v1alpha11.AccountGroupId)(nil), // 68: penumbra.core.crypto.v1alpha1.AccountGroupId + (*v1alpha12.IbcAction)(nil), // 69: penumbra.core.ibc.v1alpha1.IbcAction + (*v1alpha11.AddressIndex)(nil), // 70: penumbra.core.crypto.v1alpha1.AddressIndex + (*v1alpha11.Address)(nil), // 71: penumbra.core.crypto.v1alpha1.Address + (*v1alpha11.AssetId)(nil), // 72: penumbra.core.crypto.v1alpha1.AssetId + (*v1alpha11.Value)(nil), // 73: penumbra.core.crypto.v1alpha1.Value + (*v1alpha11.FullViewingKey)(nil), // 74: penumbra.core.crypto.v1alpha1.FullViewingKey + (*v1alpha11.Amount)(nil), // 75: penumbra.core.crypto.v1alpha1.Amount + (*v1alpha11.StateCommitment)(nil), // 76: penumbra.core.crypto.v1alpha1.StateCommitment + (*v1alpha1.WitnessData)(nil), // 77: penumbra.core.transaction.v1alpha1.WitnessData + (*v1alpha11.Denom)(nil), // 78: penumbra.core.crypto.v1alpha1.Denom + (*v1alpha11.DenomMetadata)(nil), // 79: penumbra.core.crypto.v1alpha1.DenomMetadata + (*v1alpha13.ChainParameters)(nil), // 80: penumbra.core.chain.v1alpha1.ChainParameters + (*v1alpha13.FmdParameters)(nil), // 81: penumbra.core.chain.v1alpha1.FmdParameters + (*v1alpha11.Nullifier)(nil), // 82: penumbra.core.crypto.v1alpha1.Nullifier + (*v1alpha1.TransactionPerspective)(nil), // 83: penumbra.core.transaction.v1alpha1.TransactionPerspective + (*v1alpha1.TransactionView)(nil), // 84: penumbra.core.transaction.v1alpha1.TransactionView + (*v1alpha11.IdentityKey)(nil), // 85: penumbra.core.crypto.v1alpha1.IdentityKey + (*v1alpha11.Note)(nil), // 86: penumbra.core.crypto.v1alpha1.Note + (*v1alpha13.NoteSource)(nil), // 87: penumbra.core.chain.v1alpha1.NoteSource + (*v1alpha14.SwapPlaintext)(nil), // 88: penumbra.core.dex.v1alpha1.SwapPlaintext + (*v1alpha14.BatchSwapOutputData)(nil), // 89: penumbra.core.dex.v1alpha1.BatchSwapOutputData + (*v1alpha14.PositionState)(nil), // 90: penumbra.core.dex.v1alpha1.PositionState + (*v1alpha14.TradingPair)(nil), // 91: penumbra.core.dex.v1alpha1.TradingPair + (*v1alpha14.PositionId)(nil), // 92: penumbra.core.dex.v1alpha1.PositionId + (*v1alpha15.RateData)(nil), // 93: penumbra.core.stake.v1alpha1.RateData + (*v1alpha14.Position)(nil), // 94: penumbra.core.dex.v1alpha1.Position + (*v1alpha14.Reserves)(nil), // 95: penumbra.core.dex.v1alpha1.Reserves } var file_penumbra_view_v1alpha1_view_proto_depIdxs = []int32{ - 58, // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 59, // 1: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData - 60, // 2: penumbra.view.v1alpha1.AuthorizeAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 60, // 3: penumbra.view.v1alpha1.BroadcastTransactionRequest.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 61, // 4: penumbra.view.v1alpha1.BroadcastTransactionResponse.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 62, // 5: penumbra.view.v1alpha1.TransactionPlannerRequest.fee:type_name -> penumbra.core.crypto.v1alpha1.Fee - 63, // 6: penumbra.view.v1alpha1.TransactionPlannerRequest.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext - 64, // 7: penumbra.view.v1alpha1.TransactionPlannerRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 62, // 0: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 63, // 1: penumbra.view.v1alpha1.AuthorizeAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData + 64, // 2: penumbra.view.v1alpha1.AuthorizeAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 64, // 3: penumbra.view.v1alpha1.BroadcastTransactionRequest.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 65, // 4: penumbra.view.v1alpha1.BroadcastTransactionResponse.id:type_name -> penumbra.core.transaction.v1alpha1.Id + 66, // 5: penumbra.view.v1alpha1.TransactionPlannerRequest.fee:type_name -> penumbra.core.crypto.v1alpha1.Fee + 67, // 6: penumbra.view.v1alpha1.TransactionPlannerRequest.memo:type_name -> penumbra.core.transaction.v1alpha1.MemoPlaintext + 68, // 7: penumbra.view.v1alpha1.TransactionPlannerRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId 50, // 8: penumbra.view.v1alpha1.TransactionPlannerRequest.outputs:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Output 51, // 9: penumbra.view.v1alpha1.TransactionPlannerRequest.swaps:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Swap 52, // 10: penumbra.view.v1alpha1.TransactionPlannerRequest.swap_claims:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim 53, // 11: penumbra.view.v1alpha1.TransactionPlannerRequest.delegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate 54, // 12: penumbra.view.v1alpha1.TransactionPlannerRequest.undelegations:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate - 65, // 13: penumbra.view.v1alpha1.TransactionPlannerRequest.ibc_actions:type_name -> penumbra.core.ibc.v1alpha1.IbcAction + 69, // 13: penumbra.view.v1alpha1.TransactionPlannerRequest.ibc_actions:type_name -> penumbra.core.ibc.v1alpha1.IbcAction 55, // 14: penumbra.view.v1alpha1.TransactionPlannerRequest.position_opens:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen 56, // 15: penumbra.view.v1alpha1.TransactionPlannerRequest.position_closes:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose 57, // 16: penumbra.view.v1alpha1.TransactionPlannerRequest.position_withdraws:type_name -> penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw - 58, // 17: penumbra.view.v1alpha1.TransactionPlannerResponse.plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 66, // 18: penumbra.view.v1alpha1.AddressByIndexRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 67, // 19: penumbra.view.v1alpha1.AddressByIndexResponse.address:type_name -> penumbra.core.crypto.v1alpha1.Address - 67, // 20: penumbra.view.v1alpha1.IndexByAddressRequest.address:type_name -> penumbra.core.crypto.v1alpha1.Address - 66, // 21: penumbra.view.v1alpha1.IndexByAddressResponse.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 66, // 22: penumbra.view.v1alpha1.EphemeralAddressRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 67, // 23: penumbra.view.v1alpha1.EphemeralAddressResponse.address:type_name -> penumbra.core.crypto.v1alpha1.Address - 66, // 24: penumbra.view.v1alpha1.BalancesRequest.account_filter:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 68, // 25: penumbra.view.v1alpha1.BalancesRequest.asset_id_filter:type_name -> penumbra.core.crypto.v1alpha1.AssetId - 66, // 26: penumbra.view.v1alpha1.BalancesResponse.account:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 69, // 27: penumbra.view.v1alpha1.BalancesResponse.balance:type_name -> penumbra.core.crypto.v1alpha1.Value - 70, // 28: penumbra.view.v1alpha1.ViewAuthRequest.fvk:type_name -> penumbra.core.crypto.v1alpha1.FullViewingKey + 62, // 17: penumbra.view.v1alpha1.TransactionPlannerResponse.plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 70, // 18: penumbra.view.v1alpha1.AddressByIndexRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 71, // 19: penumbra.view.v1alpha1.AddressByIndexResponse.address:type_name -> penumbra.core.crypto.v1alpha1.Address + 71, // 20: penumbra.view.v1alpha1.IndexByAddressRequest.address:type_name -> penumbra.core.crypto.v1alpha1.Address + 70, // 21: penumbra.view.v1alpha1.IndexByAddressResponse.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 70, // 22: penumbra.view.v1alpha1.EphemeralAddressRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 71, // 23: penumbra.view.v1alpha1.EphemeralAddressResponse.address:type_name -> penumbra.core.crypto.v1alpha1.Address + 70, // 24: penumbra.view.v1alpha1.BalancesRequest.account_filter:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 72, // 25: penumbra.view.v1alpha1.BalancesRequest.asset_id_filter:type_name -> penumbra.core.crypto.v1alpha1.AssetId + 70, // 26: penumbra.view.v1alpha1.BalancesResponse.account:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 73, // 27: penumbra.view.v1alpha1.BalancesResponse.balance:type_name -> penumbra.core.crypto.v1alpha1.Value + 74, // 28: penumbra.view.v1alpha1.ViewAuthRequest.fvk:type_name -> penumbra.core.crypto.v1alpha1.FullViewingKey 14, // 29: penumbra.view.v1alpha1.ViewAuthResponse.token:type_name -> penumbra.view.v1alpha1.ViewAuthToken - 64, // 30: penumbra.view.v1alpha1.StatusRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 64, // 31: penumbra.view.v1alpha1.StatusStreamRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 68, // 32: penumbra.view.v1alpha1.NotesRequest.asset_id:type_name -> penumbra.core.crypto.v1alpha1.AssetId - 66, // 33: penumbra.view.v1alpha1.NotesRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 71, // 34: penumbra.view.v1alpha1.NotesRequest.amount_to_spend:type_name -> penumbra.core.crypto.v1alpha1.Amount - 64, // 35: penumbra.view.v1alpha1.NotesRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 66, // 36: penumbra.view.v1alpha1.NotesForVotingRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 64, // 37: penumbra.view.v1alpha1.NotesForVotingRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 72, // 38: penumbra.view.v1alpha1.WitnessRequest.note_commitments:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 58, // 39: penumbra.view.v1alpha1.WitnessRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 64, // 40: penumbra.view.v1alpha1.WitnessRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 73, // 41: penumbra.view.v1alpha1.WitnessResponse.witness_data:type_name -> penumbra.core.transaction.v1alpha1.WitnessData - 58, // 42: penumbra.view.v1alpha1.WitnessAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan - 59, // 43: penumbra.view.v1alpha1.WitnessAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData - 60, // 44: penumbra.view.v1alpha1.WitnessAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 74, // 45: penumbra.view.v1alpha1.AssetsRequest.include_specific_denominations:type_name -> penumbra.core.crypto.v1alpha1.Denom - 75, // 46: penumbra.view.v1alpha1.AssetsResponse.denom_metadata:type_name -> penumbra.core.crypto.v1alpha1.DenomMetadata - 76, // 47: penumbra.view.v1alpha1.ChainParametersResponse.parameters:type_name -> penumbra.core.chain.v1alpha1.ChainParameters - 77, // 48: penumbra.view.v1alpha1.FMDParametersResponse.parameters:type_name -> penumbra.core.chain.v1alpha1.FmdParameters - 72, // 49: penumbra.view.v1alpha1.NoteByCommitmentRequest.note_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 64, // 50: penumbra.view.v1alpha1.NoteByCommitmentRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 68, // 30: penumbra.view.v1alpha1.StatusRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 68, // 31: penumbra.view.v1alpha1.StatusStreamRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 72, // 32: penumbra.view.v1alpha1.NotesRequest.asset_id:type_name -> penumbra.core.crypto.v1alpha1.AssetId + 70, // 33: penumbra.view.v1alpha1.NotesRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 75, // 34: penumbra.view.v1alpha1.NotesRequest.amount_to_spend:type_name -> penumbra.core.crypto.v1alpha1.Amount + 68, // 35: penumbra.view.v1alpha1.NotesRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 70, // 36: penumbra.view.v1alpha1.NotesForVotingRequest.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 68, // 37: penumbra.view.v1alpha1.NotesForVotingRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 76, // 38: penumbra.view.v1alpha1.WitnessRequest.note_commitments:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 62, // 39: penumbra.view.v1alpha1.WitnessRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 68, // 40: penumbra.view.v1alpha1.WitnessRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 77, // 41: penumbra.view.v1alpha1.WitnessResponse.witness_data:type_name -> penumbra.core.transaction.v1alpha1.WitnessData + 62, // 42: penumbra.view.v1alpha1.WitnessAndBuildRequest.transaction_plan:type_name -> penumbra.core.transaction.v1alpha1.TransactionPlan + 63, // 43: penumbra.view.v1alpha1.WitnessAndBuildRequest.authorization_data:type_name -> penumbra.core.transaction.v1alpha1.AuthorizationData + 64, // 44: penumbra.view.v1alpha1.WitnessAndBuildResponse.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 78, // 45: penumbra.view.v1alpha1.AssetsRequest.include_specific_denominations:type_name -> penumbra.core.crypto.v1alpha1.Denom + 79, // 46: penumbra.view.v1alpha1.AssetsResponse.denom_metadata:type_name -> penumbra.core.crypto.v1alpha1.DenomMetadata + 80, // 47: penumbra.view.v1alpha1.ChainParametersResponse.parameters:type_name -> penumbra.core.chain.v1alpha1.ChainParameters + 81, // 48: penumbra.view.v1alpha1.FMDParametersResponse.parameters:type_name -> penumbra.core.chain.v1alpha1.FmdParameters + 76, // 49: penumbra.view.v1alpha1.NoteByCommitmentRequest.note_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 68, // 50: penumbra.view.v1alpha1.NoteByCommitmentRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId 46, // 51: penumbra.view.v1alpha1.NoteByCommitmentResponse.spendable_note:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 72, // 52: penumbra.view.v1alpha1.SwapByCommitmentRequest.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 64, // 53: penumbra.view.v1alpha1.SwapByCommitmentRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 76, // 52: penumbra.view.v1alpha1.SwapByCommitmentRequest.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 68, // 53: penumbra.view.v1alpha1.SwapByCommitmentRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId 47, // 54: penumbra.view.v1alpha1.SwapByCommitmentResponse.swap:type_name -> penumbra.view.v1alpha1.SwapRecord - 78, // 55: penumbra.view.v1alpha1.NullifierStatusRequest.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier - 64, // 56: penumbra.view.v1alpha1.NullifierStatusRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId - 61, // 57: penumbra.view.v1alpha1.TransactionInfoByHashRequest.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 61, // 58: penumbra.view.v1alpha1.TransactionInfo.id:type_name -> penumbra.core.transaction.v1alpha1.Id - 60, // 59: penumbra.view.v1alpha1.TransactionInfo.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction - 79, // 60: penumbra.view.v1alpha1.TransactionInfo.perspective:type_name -> penumbra.core.transaction.v1alpha1.TransactionPerspective - 80, // 61: penumbra.view.v1alpha1.TransactionInfo.view:type_name -> penumbra.core.transaction.v1alpha1.TransactionView - 41, // 62: penumbra.view.v1alpha1.TransactionInfoResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo - 41, // 63: penumbra.view.v1alpha1.TransactionInfoByHashResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo - 46, // 64: penumbra.view.v1alpha1.NotesResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 46, // 65: penumbra.view.v1alpha1.NotesForVotingResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord - 81, // 66: penumbra.view.v1alpha1.NotesForVotingResponse.identity_key:type_name -> penumbra.core.crypto.v1alpha1.IdentityKey - 72, // 67: penumbra.view.v1alpha1.SpendableNoteRecord.note_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 82, // 68: penumbra.view.v1alpha1.SpendableNoteRecord.note:type_name -> penumbra.core.crypto.v1alpha1.Note - 66, // 69: penumbra.view.v1alpha1.SpendableNoteRecord.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex - 78, // 70: penumbra.view.v1alpha1.SpendableNoteRecord.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier - 83, // 71: penumbra.view.v1alpha1.SpendableNoteRecord.source:type_name -> penumbra.core.chain.v1alpha1.NoteSource - 72, // 72: penumbra.view.v1alpha1.SwapRecord.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 84, // 73: penumbra.view.v1alpha1.SwapRecord.swap:type_name -> penumbra.core.dex.v1alpha1.SwapPlaintext - 78, // 74: penumbra.view.v1alpha1.SwapRecord.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier - 85, // 75: penumbra.view.v1alpha1.SwapRecord.output_data:type_name -> penumbra.core.dex.v1alpha1.BatchSwapOutputData - 83, // 76: penumbra.view.v1alpha1.SwapRecord.source:type_name -> penumbra.core.chain.v1alpha1.NoteSource - 86, // 77: penumbra.view.v1alpha1.OwnedPositionIdsRequest.position_state:type_name -> penumbra.core.dex.v1alpha1.PositionState - 87, // 78: penumbra.view.v1alpha1.OwnedPositionIdsRequest.trading_pair:type_name -> penumbra.core.dex.v1alpha1.TradingPair - 88, // 79: penumbra.view.v1alpha1.OwnedPositionIdsResponse.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId - 69, // 80: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.value:type_name -> penumbra.core.crypto.v1alpha1.Value - 67, // 81: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.address:type_name -> penumbra.core.crypto.v1alpha1.Address - 69, // 82: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.value:type_name -> penumbra.core.crypto.v1alpha1.Value - 68, // 83: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.target_asset:type_name -> penumbra.core.crypto.v1alpha1.AssetId - 62, // 84: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.fee:type_name -> penumbra.core.crypto.v1alpha1.Fee - 72, // 85: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment - 71, // 86: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.amount:type_name -> penumbra.core.crypto.v1alpha1.Amount - 89, // 87: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.rate_data:type_name -> penumbra.core.stake.v1alpha1.RateData - 69, // 88: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.value:type_name -> penumbra.core.crypto.v1alpha1.Value - 89, // 89: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.rate_data:type_name -> penumbra.core.stake.v1alpha1.RateData - 90, // 90: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen.position:type_name -> penumbra.core.dex.v1alpha1.Position - 88, // 91: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId - 88, // 92: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId - 91, // 93: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.reserves:type_name -> penumbra.core.dex.v1alpha1.Reserves - 87, // 94: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.trading_pair:type_name -> penumbra.core.dex.v1alpha1.TradingPair - 17, // 95: penumbra.view.v1alpha1.ViewProtocolService.Status:input_type -> penumbra.view.v1alpha1.StatusRequest - 19, // 96: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:input_type -> penumbra.view.v1alpha1.StatusStreamRequest - 21, // 97: penumbra.view.v1alpha1.ViewProtocolService.Notes:input_type -> penumbra.view.v1alpha1.NotesRequest - 22, // 98: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:input_type -> penumbra.view.v1alpha1.NotesForVotingRequest - 23, // 99: penumbra.view.v1alpha1.ViewProtocolService.Witness:input_type -> penumbra.view.v1alpha1.WitnessRequest - 25, // 100: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:input_type -> penumbra.view.v1alpha1.WitnessAndBuildRequest - 27, // 101: penumbra.view.v1alpha1.ViewProtocolService.Assets:input_type -> penumbra.view.v1alpha1.AssetsRequest - 29, // 102: penumbra.view.v1alpha1.ViewProtocolService.ChainParameters:input_type -> penumbra.view.v1alpha1.ChainParametersRequest - 31, // 103: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:input_type -> penumbra.view.v1alpha1.FMDParametersRequest - 6, // 104: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:input_type -> penumbra.view.v1alpha1.AddressByIndexRequest - 8, // 105: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:input_type -> penumbra.view.v1alpha1.IndexByAddressRequest - 10, // 106: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:input_type -> penumbra.view.v1alpha1.EphemeralAddressRequest - 12, // 107: penumbra.view.v1alpha1.ViewProtocolService.Balances:input_type -> penumbra.view.v1alpha1.BalancesRequest - 33, // 108: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:input_type -> penumbra.view.v1alpha1.NoteByCommitmentRequest - 35, // 109: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:input_type -> penumbra.view.v1alpha1.SwapByCommitmentRequest - 37, // 110: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:input_type -> penumbra.view.v1alpha1.NullifierStatusRequest - 39, // 111: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:input_type -> penumbra.view.v1alpha1.TransactionInfoByHashRequest - 40, // 112: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:input_type -> penumbra.view.v1alpha1.TransactionInfoRequest - 4, // 113: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:input_type -> penumbra.view.v1alpha1.TransactionPlannerRequest - 2, // 114: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:input_type -> penumbra.view.v1alpha1.BroadcastTransactionRequest - 48, // 115: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:input_type -> penumbra.view.v1alpha1.OwnedPositionIdsRequest - 0, // 116: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:input_type -> penumbra.view.v1alpha1.AuthorizeAndBuildRequest - 15, // 117: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:input_type -> penumbra.view.v1alpha1.ViewAuthRequest - 18, // 118: penumbra.view.v1alpha1.ViewProtocolService.Status:output_type -> penumbra.view.v1alpha1.StatusResponse - 20, // 119: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:output_type -> penumbra.view.v1alpha1.StatusStreamResponse - 44, // 120: penumbra.view.v1alpha1.ViewProtocolService.Notes:output_type -> penumbra.view.v1alpha1.NotesResponse - 45, // 121: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:output_type -> penumbra.view.v1alpha1.NotesForVotingResponse - 24, // 122: penumbra.view.v1alpha1.ViewProtocolService.Witness:output_type -> penumbra.view.v1alpha1.WitnessResponse - 26, // 123: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:output_type -> penumbra.view.v1alpha1.WitnessAndBuildResponse - 28, // 124: penumbra.view.v1alpha1.ViewProtocolService.Assets:output_type -> penumbra.view.v1alpha1.AssetsResponse - 30, // 125: penumbra.view.v1alpha1.ViewProtocolService.ChainParameters:output_type -> penumbra.view.v1alpha1.ChainParametersResponse - 32, // 126: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:output_type -> penumbra.view.v1alpha1.FMDParametersResponse - 7, // 127: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:output_type -> penumbra.view.v1alpha1.AddressByIndexResponse - 9, // 128: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:output_type -> penumbra.view.v1alpha1.IndexByAddressResponse - 11, // 129: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:output_type -> penumbra.view.v1alpha1.EphemeralAddressResponse - 13, // 130: penumbra.view.v1alpha1.ViewProtocolService.Balances:output_type -> penumbra.view.v1alpha1.BalancesResponse - 34, // 131: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:output_type -> penumbra.view.v1alpha1.NoteByCommitmentResponse - 36, // 132: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:output_type -> penumbra.view.v1alpha1.SwapByCommitmentResponse - 38, // 133: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:output_type -> penumbra.view.v1alpha1.NullifierStatusResponse - 43, // 134: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:output_type -> penumbra.view.v1alpha1.TransactionInfoByHashResponse - 42, // 135: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:output_type -> penumbra.view.v1alpha1.TransactionInfoResponse - 5, // 136: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:output_type -> penumbra.view.v1alpha1.TransactionPlannerResponse - 3, // 137: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:output_type -> penumbra.view.v1alpha1.BroadcastTransactionResponse - 49, // 138: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:output_type -> penumbra.view.v1alpha1.OwnedPositionIdsResponse - 1, // 139: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:output_type -> penumbra.view.v1alpha1.AuthorizeAndBuildResponse - 16, // 140: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:output_type -> penumbra.view.v1alpha1.ViewAuthResponse - 118, // [118:141] is the sub-list for method output_type - 95, // [95:118] is the sub-list for method input_type - 95, // [95:95] is the sub-list for extension type_name - 95, // [95:95] is the sub-list for extension extendee - 0, // [0:95] is the sub-list for field type_name + 82, // 55: penumbra.view.v1alpha1.NullifierStatusRequest.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier + 68, // 56: penumbra.view.v1alpha1.NullifierStatusRequest.account_group_id:type_name -> penumbra.core.crypto.v1alpha1.AccountGroupId + 65, // 57: penumbra.view.v1alpha1.TransactionInfoByHashRequest.id:type_name -> penumbra.core.transaction.v1alpha1.Id + 58, // 58: penumbra.view.v1alpha1.TransactionInfoRequest.start_height:type_name -> penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight + 58, // 59: penumbra.view.v1alpha1.TransactionInfoRequest.end_height:type_name -> penumbra.view.v1alpha1.TransactionInfoRequest.BlockHeight + 59, // 60: penumbra.view.v1alpha1.TransactionInfo.height:type_name -> penumbra.view.v1alpha1.TransactionInfo.BlockHeight + 65, // 61: penumbra.view.v1alpha1.TransactionInfo.id:type_name -> penumbra.core.transaction.v1alpha1.Id + 64, // 62: penumbra.view.v1alpha1.TransactionInfo.transaction:type_name -> penumbra.core.transaction.v1alpha1.Transaction + 83, // 63: penumbra.view.v1alpha1.TransactionInfo.perspective:type_name -> penumbra.core.transaction.v1alpha1.TransactionPerspective + 84, // 64: penumbra.view.v1alpha1.TransactionInfo.view:type_name -> penumbra.core.transaction.v1alpha1.TransactionView + 41, // 65: penumbra.view.v1alpha1.TransactionInfoResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo + 41, // 66: penumbra.view.v1alpha1.TransactionInfoByHashResponse.tx_info:type_name -> penumbra.view.v1alpha1.TransactionInfo + 46, // 67: penumbra.view.v1alpha1.NotesResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord + 46, // 68: penumbra.view.v1alpha1.NotesForVotingResponse.note_record:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord + 85, // 69: penumbra.view.v1alpha1.NotesForVotingResponse.identity_key:type_name -> penumbra.core.crypto.v1alpha1.IdentityKey + 76, // 70: penumbra.view.v1alpha1.SpendableNoteRecord.note_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 86, // 71: penumbra.view.v1alpha1.SpendableNoteRecord.note:type_name -> penumbra.core.crypto.v1alpha1.Note + 70, // 72: penumbra.view.v1alpha1.SpendableNoteRecord.address_index:type_name -> penumbra.core.crypto.v1alpha1.AddressIndex + 82, // 73: penumbra.view.v1alpha1.SpendableNoteRecord.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier + 60, // 74: penumbra.view.v1alpha1.SpendableNoteRecord.height_spent:type_name -> penumbra.view.v1alpha1.SpendableNoteRecord.BlockHeight + 87, // 75: penumbra.view.v1alpha1.SpendableNoteRecord.source:type_name -> penumbra.core.chain.v1alpha1.NoteSource + 76, // 76: penumbra.view.v1alpha1.SwapRecord.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 88, // 77: penumbra.view.v1alpha1.SwapRecord.swap:type_name -> penumbra.core.dex.v1alpha1.SwapPlaintext + 82, // 78: penumbra.view.v1alpha1.SwapRecord.nullifier:type_name -> penumbra.core.crypto.v1alpha1.Nullifier + 89, // 79: penumbra.view.v1alpha1.SwapRecord.output_data:type_name -> penumbra.core.dex.v1alpha1.BatchSwapOutputData + 61, // 80: penumbra.view.v1alpha1.SwapRecord.height_claimed:type_name -> penumbra.view.v1alpha1.SwapRecord.BlockHeight + 87, // 81: penumbra.view.v1alpha1.SwapRecord.source:type_name -> penumbra.core.chain.v1alpha1.NoteSource + 90, // 82: penumbra.view.v1alpha1.OwnedPositionIdsRequest.position_state:type_name -> penumbra.core.dex.v1alpha1.PositionState + 91, // 83: penumbra.view.v1alpha1.OwnedPositionIdsRequest.trading_pair:type_name -> penumbra.core.dex.v1alpha1.TradingPair + 92, // 84: penumbra.view.v1alpha1.OwnedPositionIdsResponse.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId + 73, // 85: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.value:type_name -> penumbra.core.crypto.v1alpha1.Value + 71, // 86: penumbra.view.v1alpha1.TransactionPlannerRequest.Output.address:type_name -> penumbra.core.crypto.v1alpha1.Address + 73, // 87: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.value:type_name -> penumbra.core.crypto.v1alpha1.Value + 72, // 88: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.target_asset:type_name -> penumbra.core.crypto.v1alpha1.AssetId + 66, // 89: penumbra.view.v1alpha1.TransactionPlannerRequest.Swap.fee:type_name -> penumbra.core.crypto.v1alpha1.Fee + 76, // 90: penumbra.view.v1alpha1.TransactionPlannerRequest.SwapClaim.swap_commitment:type_name -> penumbra.core.crypto.v1alpha1.StateCommitment + 75, // 91: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.amount:type_name -> penumbra.core.crypto.v1alpha1.Amount + 93, // 92: penumbra.view.v1alpha1.TransactionPlannerRequest.Delegate.rate_data:type_name -> penumbra.core.stake.v1alpha1.RateData + 73, // 93: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.value:type_name -> penumbra.core.crypto.v1alpha1.Value + 93, // 94: penumbra.view.v1alpha1.TransactionPlannerRequest.Undelegate.rate_data:type_name -> penumbra.core.stake.v1alpha1.RateData + 94, // 95: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionOpen.position:type_name -> penumbra.core.dex.v1alpha1.Position + 92, // 96: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionClose.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId + 92, // 97: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.position_id:type_name -> penumbra.core.dex.v1alpha1.PositionId + 95, // 98: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.reserves:type_name -> penumbra.core.dex.v1alpha1.Reserves + 91, // 99: penumbra.view.v1alpha1.TransactionPlannerRequest.PositionWithdraw.trading_pair:type_name -> penumbra.core.dex.v1alpha1.TradingPair + 17, // 100: penumbra.view.v1alpha1.ViewProtocolService.Status:input_type -> penumbra.view.v1alpha1.StatusRequest + 19, // 101: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:input_type -> penumbra.view.v1alpha1.StatusStreamRequest + 21, // 102: penumbra.view.v1alpha1.ViewProtocolService.Notes:input_type -> penumbra.view.v1alpha1.NotesRequest + 22, // 103: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:input_type -> penumbra.view.v1alpha1.NotesForVotingRequest + 23, // 104: penumbra.view.v1alpha1.ViewProtocolService.Witness:input_type -> penumbra.view.v1alpha1.WitnessRequest + 25, // 105: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:input_type -> penumbra.view.v1alpha1.WitnessAndBuildRequest + 27, // 106: penumbra.view.v1alpha1.ViewProtocolService.Assets:input_type -> penumbra.view.v1alpha1.AssetsRequest + 29, // 107: penumbra.view.v1alpha1.ViewProtocolService.ChainParameters:input_type -> penumbra.view.v1alpha1.ChainParametersRequest + 31, // 108: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:input_type -> penumbra.view.v1alpha1.FMDParametersRequest + 6, // 109: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:input_type -> penumbra.view.v1alpha1.AddressByIndexRequest + 8, // 110: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:input_type -> penumbra.view.v1alpha1.IndexByAddressRequest + 10, // 111: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:input_type -> penumbra.view.v1alpha1.EphemeralAddressRequest + 12, // 112: penumbra.view.v1alpha1.ViewProtocolService.Balances:input_type -> penumbra.view.v1alpha1.BalancesRequest + 33, // 113: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:input_type -> penumbra.view.v1alpha1.NoteByCommitmentRequest + 35, // 114: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:input_type -> penumbra.view.v1alpha1.SwapByCommitmentRequest + 37, // 115: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:input_type -> penumbra.view.v1alpha1.NullifierStatusRequest + 39, // 116: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:input_type -> penumbra.view.v1alpha1.TransactionInfoByHashRequest + 40, // 117: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:input_type -> penumbra.view.v1alpha1.TransactionInfoRequest + 4, // 118: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:input_type -> penumbra.view.v1alpha1.TransactionPlannerRequest + 2, // 119: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:input_type -> penumbra.view.v1alpha1.BroadcastTransactionRequest + 48, // 120: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:input_type -> penumbra.view.v1alpha1.OwnedPositionIdsRequest + 0, // 121: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:input_type -> penumbra.view.v1alpha1.AuthorizeAndBuildRequest + 15, // 122: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:input_type -> penumbra.view.v1alpha1.ViewAuthRequest + 18, // 123: penumbra.view.v1alpha1.ViewProtocolService.Status:output_type -> penumbra.view.v1alpha1.StatusResponse + 20, // 124: penumbra.view.v1alpha1.ViewProtocolService.StatusStream:output_type -> penumbra.view.v1alpha1.StatusStreamResponse + 44, // 125: penumbra.view.v1alpha1.ViewProtocolService.Notes:output_type -> penumbra.view.v1alpha1.NotesResponse + 45, // 126: penumbra.view.v1alpha1.ViewProtocolService.NotesForVoting:output_type -> penumbra.view.v1alpha1.NotesForVotingResponse + 24, // 127: penumbra.view.v1alpha1.ViewProtocolService.Witness:output_type -> penumbra.view.v1alpha1.WitnessResponse + 26, // 128: penumbra.view.v1alpha1.ViewProtocolService.WitnessAndBuild:output_type -> penumbra.view.v1alpha1.WitnessAndBuildResponse + 28, // 129: penumbra.view.v1alpha1.ViewProtocolService.Assets:output_type -> penumbra.view.v1alpha1.AssetsResponse + 30, // 130: penumbra.view.v1alpha1.ViewProtocolService.ChainParameters:output_type -> penumbra.view.v1alpha1.ChainParametersResponse + 32, // 131: penumbra.view.v1alpha1.ViewProtocolService.FMDParameters:output_type -> penumbra.view.v1alpha1.FMDParametersResponse + 7, // 132: penumbra.view.v1alpha1.ViewProtocolService.AddressByIndex:output_type -> penumbra.view.v1alpha1.AddressByIndexResponse + 9, // 133: penumbra.view.v1alpha1.ViewProtocolService.IndexByAddress:output_type -> penumbra.view.v1alpha1.IndexByAddressResponse + 11, // 134: penumbra.view.v1alpha1.ViewProtocolService.EphemeralAddress:output_type -> penumbra.view.v1alpha1.EphemeralAddressResponse + 13, // 135: penumbra.view.v1alpha1.ViewProtocolService.Balances:output_type -> penumbra.view.v1alpha1.BalancesResponse + 34, // 136: penumbra.view.v1alpha1.ViewProtocolService.NoteByCommitment:output_type -> penumbra.view.v1alpha1.NoteByCommitmentResponse + 36, // 137: penumbra.view.v1alpha1.ViewProtocolService.SwapByCommitment:output_type -> penumbra.view.v1alpha1.SwapByCommitmentResponse + 38, // 138: penumbra.view.v1alpha1.ViewProtocolService.NullifierStatus:output_type -> penumbra.view.v1alpha1.NullifierStatusResponse + 43, // 139: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfoByHash:output_type -> penumbra.view.v1alpha1.TransactionInfoByHashResponse + 42, // 140: penumbra.view.v1alpha1.ViewProtocolService.TransactionInfo:output_type -> penumbra.view.v1alpha1.TransactionInfoResponse + 5, // 141: penumbra.view.v1alpha1.ViewProtocolService.TransactionPlanner:output_type -> penumbra.view.v1alpha1.TransactionPlannerResponse + 3, // 142: penumbra.view.v1alpha1.ViewProtocolService.BroadcastTransaction:output_type -> penumbra.view.v1alpha1.BroadcastTransactionResponse + 49, // 143: penumbra.view.v1alpha1.ViewProtocolService.OwnedPositionIds:output_type -> penumbra.view.v1alpha1.OwnedPositionIdsResponse + 1, // 144: penumbra.view.v1alpha1.ViewProtocolService.AuthorizeAndBuild:output_type -> penumbra.view.v1alpha1.AuthorizeAndBuildResponse + 16, // 145: penumbra.view.v1alpha1.ViewAuthService.ViewAuth:output_type -> penumbra.view.v1alpha1.ViewAuthResponse + 123, // [123:146] is the sub-list for method output_type + 100, // [100:123] is the sub-list for method input_type + 100, // [100:100] is the sub-list for extension type_name + 100, // [100:100] is the sub-list for extension extendee + 0, // [0:100] is the sub-list for field type_name } func init() { file_penumbra_view_v1alpha1_view_proto_init() } @@ -5169,6 +5399,54 @@ func file_penumbra_view_v1alpha1_view_proto_init() { return nil } } + file_penumbra_view_v1alpha1_view_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionInfoRequest_BlockHeight); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_view_v1alpha1_view_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransactionInfo_BlockHeight); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_view_v1alpha1_view_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpendableNoteRecord_BlockHeight); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_penumbra_view_v1alpha1_view_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SwapRecord_BlockHeight); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -5176,7 +5454,7 @@ func file_penumbra_view_v1alpha1_view_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_penumbra_view_v1alpha1_view_proto_rawDesc, NumEnums: 0, - NumMessages: 58, + NumMessages: 62, NumExtensions: 0, NumServices: 2, }, diff --git a/proto/penumbra/penumbra/view/v1alpha1/view.proto b/proto/penumbra/penumbra/view/v1alpha1/view.proto index 336e570253..7b9dd8a502 100644 --- a/proto/penumbra/penumbra/view/v1alpha1/view.proto +++ b/proto/penumbra/penumbra/view/v1alpha1/view.proto @@ -416,15 +416,23 @@ message TransactionInfoByHashRequest { } message TransactionInfoRequest { + // Submessage to represent optionality for specifying heights. + message BlockHeight { + uint64 height = 1; + } // If present, return only transactions after this height. - uint64 start_height = 1; + BlockHeight start_height = 1; // If present, return only transactions before this height. - uint64 end_height = 2; + BlockHeight end_height = 2; } message TransactionInfo { + // Submessage to represent optionality for block height. + message BlockHeight { + uint64 height = 1; + } // The height the transaction was included in a block, if known. - uint64 height = 1; + BlockHeight height = 1; // The hash of the transaction. core.transaction.v1alpha1.Id id = 2; // The transaction data itself. @@ -454,6 +462,12 @@ message NotesForVotingResponse { // A note plaintext with associated metadata about its status. message SpendableNoteRecord { + + // A submessage to represent optionality for height at which a note was spent. + message BlockHeight { + uint64 height = 1; + } + // The note commitment, identifying the note. core.crypto.v1alpha1.StateCommitment note_commitment = 1; // The note plaintext itself. @@ -465,7 +479,8 @@ message SpendableNoteRecord { // The height at which the note was created. uint64 height_created = 5; // Records whether the note was spent (and if so, at what height). - uint64 height_spent = 6; + // Present if the note was spent, otherwise absent. + BlockHeight height_spent = 6; // The note position. uint64 position = 7; // The source of the note (a tx hash or otherwise) @@ -473,12 +488,18 @@ message SpendableNoteRecord { } message SwapRecord { + // Submessage to represent optionality for block height. + message BlockHeight { + uint64 height = 1; + } core.crypto.v1alpha1.StateCommitment swap_commitment = 1; core.dex.v1alpha1.SwapPlaintext swap = 2; uint64 position = 3; core.crypto.v1alpha1.Nullifier nullifier = 4; core.dex.v1alpha1.BatchSwapOutputData output_data = 5; - uint64 height_claimed = 6; + + // If present, height at which Swap was claimed. + BlockHeight height_claimed = 6; core.chain.v1alpha1.NoteSource source = 7; }