From f3c7547f9187903e0412354ac9c48b2f8a458df2 Mon Sep 17 00:00:00 2001 From: Nathan VanBenschoten Date: Tue, 23 Jun 2020 00:44:19 -0400 Subject: [PATCH] kv/kvclient: introduce new tenant Proxy Fixes #47909. This commit starts by adding two RPCs to the Internal service: ``` service Internal { ... rpc RangeLookup (RangeLookupRequest) returns (RangeLookupResponse) {} rpc NodeInfo (NodeInfoRequest) returns (stream NodeInfoResponse) {} } // RangeLookupRequest is a request to proxy a RangeLookup through a Tenant // service. Its fields correspond to a subset of the args of kv.RangeLookup. message RangeLookupRequest { ... } // NodeInfoRequest is a request to establish an indefinite stream on a Tenant // service that provides an initial NodeInfoResponse and a NodeInfoResponse // whenever the collection of KV nodes in a cluster changes. It effectively // proxies any updates to NodeDescriptors in the KV gossip network back to the // client of the request. message NodeInfoRequest {} ``` The commit then introduces new `kvtenant.Proxy` object. Proxy mediates the communication of cluster-wide state to sandboxed SQL-only tenant processes through a restricted interface. A Proxy is seeded with a set of one or more network addresses that reference existing KV nodes in the cluster (or a load-balancer which fans out to some/all KV nodes). On startup, it establishes contact with one of these nodes to learn about the topology of the cluster and bootstrap the rest of SQL <-> KV network communication. Proxy has two main roles: First, Proxy is capable of providing information on each of the KV nodes in the cluster in the form of NodeDescriptors. This obviates the need for SQL-only tenant processes to join the cluster-wide gossip network. In doing so, it satisfies the `NodeDescStore` interface and can be used as an `AddressResolver` with a small adapter. Second, Proxy is capable of providing Range addressing information in the form of RangeDescriptors through delegated RangeLookup requests. This is necessary because SQL-only tenants are restricted from reading Range Metadata keys directly. Instead, the RangeLookup requests are proxied through existing KV nodes while being subject to additional validation (e.g. is the Range being requested owned by the requesting tenant?). In doing so, it satisfies the `RangeDescriptorDB` interface and can be used to delegate all DistSender/RangeCache descriptor lookups to KV nodes. With this commit, we can mostly run a SQL-only tenant process without joining the KV cluster's gossip network. This works if I comment out a few of the uses of gossip due to #49692 and #47150 in SQL. Notably, with the call to `DeprecatedRegisterSystemConfigChannel` in `sql.Server.Start` removed, I can remove `Gossip` from `makeSQLServerArgs` entirely and things "just work". --- c-deps/libroach/protos/roachpb/api.pb.cc | 1174 ++++++++++ c-deps/libroach/protos/roachpb/api.pb.h | 1042 ++++++++- pkg/gossip/gossip.go | 7 +- pkg/gossip/infostore.go | 1 + pkg/kv/kvclient/kvcoord/send_test.go | 12 + pkg/kv/kvclient/kvcoord/transport_test.go | 14 + pkg/kv/kvclient/kvtenant/proxy.go | 324 +++ pkg/kv/kvclient/kvtenant/proxy_test.go | 316 +++ pkg/roachpb/api.pb.go | 2350 +++++++++++++++------ pkg/roachpb/api.proto | 47 +- pkg/rpc/context.go | 129 +- pkg/rpc/context_test.go | 14 +- pkg/server/node.go | 109 +- pkg/server/server_sql.go | 19 + pkg/server/testserver.go | 44 +- 15 files changed, 4897 insertions(+), 705 deletions(-) create mode 100644 pkg/kv/kvclient/kvtenant/proxy.go create mode 100644 pkg/kv/kvclient/kvtenant/proxy_test.go diff --git a/c-deps/libroach/protos/roachpb/api.pb.cc b/c-deps/libroach/protos/roachpb/api.pb.cc index 89f34c318f84..b8af39cd38ef 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.cc +++ b/c-deps/libroach/protos/roachpb/api.pb.cc @@ -824,6 +824,16 @@ class BatchResponseDefaultTypeInternal { ::google::protobuf::internal::ExplicitlyConstructed _instance; } _BatchResponse_default_instance_; +class RangeLookupRequestDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _RangeLookupRequest_default_instance_; +class RangeLookupResponseDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _RangeLookupResponse_default_instance_; class RangeFeedRequestDefaultTypeInternal { public: ::google::protobuf::internal::ExplicitlyConstructed @@ -849,6 +859,16 @@ class RangeFeedEventDefaultTypeInternal { ::google::protobuf::internal::ExplicitlyConstructed _instance; } _RangeFeedEvent_default_instance_; +class GossipSubscriptionRequestDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _GossipSubscriptionRequest_default_instance_; +class GossipSubscriptionEventDefaultTypeInternal { + public: + ::google::protobuf::internal::ExplicitlyConstructed + _instance; +} _GossipSubscriptionEvent_default_instance_; } // namespace roachpb } // namespace cockroach namespace protobuf_roachpb_2fapi_2eproto { @@ -2716,6 +2736,36 @@ ::google::protobuf::internal::SCCInfo<2> scc_info_BatchResponse = &protobuf_roachpb_2fapi_2eproto::scc_info_BatchResponse_Header.base, &protobuf_roachpb_2fapi_2eproto::scc_info_ResponseUnion.base,}}; +static void InitDefaultsRangeLookupRequest() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::cockroach::roachpb::_RangeLookupRequest_default_instance_; + new (ptr) ::cockroach::roachpb::RangeLookupRequest(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::cockroach::roachpb::RangeLookupRequest::InitAsDefaultInstance(); +} + +::google::protobuf::internal::SCCInfo<0> scc_info_RangeLookupRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsRangeLookupRequest}, {}}; + +static void InitDefaultsRangeLookupResponse() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::cockroach::roachpb::_RangeLookupResponse_default_instance_; + new (ptr) ::cockroach::roachpb::RangeLookupResponse(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::cockroach::roachpb::RangeLookupResponse::InitAsDefaultInstance(); +} + +::google::protobuf::internal::SCCInfo<2> scc_info_RangeLookupResponse = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsRangeLookupResponse}, { + &protobuf_roachpb_2fmetadata_2eproto::scc_info_RangeDescriptor.base, + &protobuf_roachpb_2ferrors_2eproto::scc_info_AmbiguousResultError.base,}}; + static void InitDefaultsRangeFeedRequest() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -2795,6 +2845,36 @@ ::google::protobuf::internal::SCCInfo<3> scc_info_RangeFeedEvent = &protobuf_roachpb_2fapi_2eproto::scc_info_RangeFeedCheckpoint.base, &protobuf_roachpb_2fapi_2eproto::scc_info_RangeFeedError.base,}}; +static void InitDefaultsGossipSubscriptionRequest() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::cockroach::roachpb::_GossipSubscriptionRequest_default_instance_; + new (ptr) ::cockroach::roachpb::GossipSubscriptionRequest(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::cockroach::roachpb::GossipSubscriptionRequest::InitAsDefaultInstance(); +} + +::google::protobuf::internal::SCCInfo<0> scc_info_GossipSubscriptionRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsGossipSubscriptionRequest}, {}}; + +static void InitDefaultsGossipSubscriptionEvent() { + GOOGLE_PROTOBUF_VERIFY_VERSION; + + { + void* ptr = &::cockroach::roachpb::_GossipSubscriptionEvent_default_instance_; + new (ptr) ::cockroach::roachpb::GossipSubscriptionEvent(); + ::google::protobuf::internal::OnShutdownDestroyMessage(ptr); + } + ::cockroach::roachpb::GossipSubscriptionEvent::InitAsDefaultInstance(); +} + +::google::protobuf::internal::SCCInfo<2> scc_info_GossipSubscriptionEvent = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsGossipSubscriptionEvent}, { + &protobuf_roachpb_2fdata_2eproto::scc_info_Value.base, + &protobuf_roachpb_2ferrors_2eproto::scc_info_AmbiguousResultError.base,}}; + void InitDefaults() { ::google::protobuf::internal::InitSCC(&scc_info_RequestHeader.base); ::google::protobuf::internal::InitSCC(&scc_info_ResponseHeader.base); @@ -2910,11 +2990,15 @@ void InitDefaults() { ::google::protobuf::internal::InitSCC(&scc_info_BatchRequest.base); ::google::protobuf::internal::InitSCC(&scc_info_BatchResponse_Header.base); ::google::protobuf::internal::InitSCC(&scc_info_BatchResponse.base); + ::google::protobuf::internal::InitSCC(&scc_info_RangeLookupRequest.base); + ::google::protobuf::internal::InitSCC(&scc_info_RangeLookupResponse.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeFeedRequest.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeFeedValue.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeFeedCheckpoint.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeFeedError.base); ::google::protobuf::internal::InitSCC(&scc_info_RangeFeedEvent.base); + ::google::protobuf::internal::InitSCC(&scc_info_GossipSubscriptionRequest.base); + ::google::protobuf::internal::InitSCC(&scc_info_GossipSubscriptionEvent.base); } } // namespace protobuf_roachpb_2fapi_2eproto @@ -36819,6 +36903,560 @@ ::std::string BatchResponse::GetTypeName() const { } +// =================================================================== + +void RangeLookupRequest::InitAsDefaultInstance() { +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int RangeLookupRequest::kKeyFieldNumber; +const int RangeLookupRequest::kReadConsistencyFieldNumber; +const int RangeLookupRequest::kPrefetchNumFieldNumber; +const int RangeLookupRequest::kPrefetchReverseFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +RangeLookupRequest::RangeLookupRequest() + : ::google::protobuf::MessageLite(), _internal_metadata_(NULL) { + ::google::protobuf::internal::InitSCC( + &protobuf_roachpb_2fapi_2eproto::scc_info_RangeLookupRequest.base); + SharedCtor(); + // @@protoc_insertion_point(constructor:cockroach.roachpb.RangeLookupRequest) +} +RangeLookupRequest::RangeLookupRequest(const RangeLookupRequest& from) + : ::google::protobuf::MessageLite(), + _internal_metadata_(NULL) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + key_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (from.key().size() > 0) { + key_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.key_); + } + ::memcpy(&prefetch_num_, &from.prefetch_num_, + static_cast(reinterpret_cast(&prefetch_reverse_) - + reinterpret_cast(&prefetch_num_)) + sizeof(prefetch_reverse_)); + // @@protoc_insertion_point(copy_constructor:cockroach.roachpb.RangeLookupRequest) +} + +void RangeLookupRequest::SharedCtor() { + key_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(&prefetch_num_, 0, static_cast( + reinterpret_cast(&prefetch_reverse_) - + reinterpret_cast(&prefetch_num_)) + sizeof(prefetch_reverse_)); +} + +RangeLookupRequest::~RangeLookupRequest() { + // @@protoc_insertion_point(destructor:cockroach.roachpb.RangeLookupRequest) + SharedDtor(); +} + +void RangeLookupRequest::SharedDtor() { + key_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} + +void RangeLookupRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const RangeLookupRequest& RangeLookupRequest::default_instance() { + ::google::protobuf::internal::InitSCC(&protobuf_roachpb_2fapi_2eproto::scc_info_RangeLookupRequest.base); + return *internal_default_instance(); +} + + +void RangeLookupRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:cockroach.roachpb.RangeLookupRequest) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + key_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(&prefetch_num_, 0, static_cast( + reinterpret_cast(&prefetch_reverse_) - + reinterpret_cast(&prefetch_num_)) + sizeof(prefetch_reverse_)); + _internal_metadata_.Clear(); +} + +bool RangeLookupRequest::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter( + &_internal_metadata_); + ::google::protobuf::io::StringOutputStream unknown_fields_output( + unknown_fields_setter.buffer()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_output, false); + // @@protoc_insertion_point(parse_start:cockroach.roachpb.RangeLookupRequest) + for (;;) { + ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_key())); + } else { + goto handle_unusual; + } + break; + } + + // .cockroach.roachpb.ReadConsistencyType read_consistency = 2; + case 2: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(16u /* 16 & 0xFF */)) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + set_read_consistency(static_cast< ::cockroach::roachpb::ReadConsistencyType >(value)); + } else { + goto handle_unusual; + } + break; + } + + // int64 prefetch_num = 3; + case 3: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(24u /* 24 & 0xFF */)) { + + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &prefetch_num_))); + } else { + goto handle_unusual; + } + break; + } + + // bool prefetch_reverse = 4; + case 4: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(32u /* 32 & 0xFF */)) { + + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &prefetch_reverse_))); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:cockroach.roachpb.RangeLookupRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:cockroach.roachpb.RangeLookupRequest) + return false; +#undef DO_ +} + +void RangeLookupRequest::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:cockroach.roachpb.RangeLookupRequest) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (this->key().size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteBytesMaybeAliased( + 1, this->key(), output); + } + + // .cockroach.roachpb.ReadConsistencyType read_consistency = 2; + if (this->read_consistency() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 2, this->read_consistency(), output); + } + + // int64 prefetch_num = 3; + if (this->prefetch_num() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(3, this->prefetch_num(), output); + } + + // bool prefetch_reverse = 4; + if (this->prefetch_reverse() != 0) { + ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->prefetch_reverse(), output); + } + + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), + static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); + // @@protoc_insertion_point(serialize_end:cockroach.roachpb.RangeLookupRequest) +} + +size_t RangeLookupRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:cockroach.roachpb.RangeLookupRequest) + size_t total_size = 0; + + total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + + if (this->key().size() > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->key()); + } + + // int64 prefetch_num = 3; + if (this->prefetch_num() != 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->prefetch_num()); + } + + // .cockroach.roachpb.ReadConsistencyType read_consistency = 2; + if (this->read_consistency() != 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->read_consistency()); + } + + // bool prefetch_reverse = 4; + if (this->prefetch_reverse() != 0) { + total_size += 1 + 1; + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void RangeLookupRequest::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void RangeLookupRequest::MergeFrom(const RangeLookupRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:cockroach.roachpb.RangeLookupRequest) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.key().size() > 0) { + + key_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.key_); + } + if (from.prefetch_num() != 0) { + set_prefetch_num(from.prefetch_num()); + } + if (from.read_consistency() != 0) { + set_read_consistency(from.read_consistency()); + } + if (from.prefetch_reverse() != 0) { + set_prefetch_reverse(from.prefetch_reverse()); + } +} + +void RangeLookupRequest::CopyFrom(const RangeLookupRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:cockroach.roachpb.RangeLookupRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool RangeLookupRequest::IsInitialized() const { + return true; +} + +void RangeLookupRequest::Swap(RangeLookupRequest* other) { + if (other == this) return; + InternalSwap(other); +} +void RangeLookupRequest::InternalSwap(RangeLookupRequest* other) { + using std::swap; + key_.Swap(&other->key_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(prefetch_num_, other->prefetch_num_); + swap(read_consistency_, other->read_consistency_); + swap(prefetch_reverse_, other->prefetch_reverse_); + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::std::string RangeLookupRequest::GetTypeName() const { + return "cockroach.roachpb.RangeLookupRequest"; +} + + +// =================================================================== + +void RangeLookupResponse::InitAsDefaultInstance() { + ::cockroach::roachpb::_RangeLookupResponse_default_instance_._instance.get_mutable()->error_ = const_cast< ::cockroach::roachpb::Error*>( + ::cockroach::roachpb::Error::internal_default_instance()); +} +void RangeLookupResponse::clear_descriptors() { + descriptors_.Clear(); +} +void RangeLookupResponse::clear_prefetched_descriptors() { + prefetched_descriptors_.Clear(); +} +void RangeLookupResponse::clear_error() { + if (GetArenaNoVirtual() == NULL && error_ != NULL) { + delete error_; + } + error_ = NULL; +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int RangeLookupResponse::kDescriptorsFieldNumber; +const int RangeLookupResponse::kPrefetchedDescriptorsFieldNumber; +const int RangeLookupResponse::kErrorFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +RangeLookupResponse::RangeLookupResponse() + : ::google::protobuf::MessageLite(), _internal_metadata_(NULL) { + ::google::protobuf::internal::InitSCC( + &protobuf_roachpb_2fapi_2eproto::scc_info_RangeLookupResponse.base); + SharedCtor(); + // @@protoc_insertion_point(constructor:cockroach.roachpb.RangeLookupResponse) +} +RangeLookupResponse::RangeLookupResponse(const RangeLookupResponse& from) + : ::google::protobuf::MessageLite(), + _internal_metadata_(NULL), + descriptors_(from.descriptors_), + prefetched_descriptors_(from.prefetched_descriptors_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + if (from.has_error()) { + error_ = new ::cockroach::roachpb::Error(*from.error_); + } else { + error_ = NULL; + } + // @@protoc_insertion_point(copy_constructor:cockroach.roachpb.RangeLookupResponse) +} + +void RangeLookupResponse::SharedCtor() { + error_ = NULL; +} + +RangeLookupResponse::~RangeLookupResponse() { + // @@protoc_insertion_point(destructor:cockroach.roachpb.RangeLookupResponse) + SharedDtor(); +} + +void RangeLookupResponse::SharedDtor() { + if (this != internal_default_instance()) delete error_; +} + +void RangeLookupResponse::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const RangeLookupResponse& RangeLookupResponse::default_instance() { + ::google::protobuf::internal::InitSCC(&protobuf_roachpb_2fapi_2eproto::scc_info_RangeLookupResponse.base); + return *internal_default_instance(); +} + + +void RangeLookupResponse::Clear() { +// @@protoc_insertion_point(message_clear_start:cockroach.roachpb.RangeLookupResponse) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + descriptors_.Clear(); + prefetched_descriptors_.Clear(); + if (GetArenaNoVirtual() == NULL && error_ != NULL) { + delete error_; + } + error_ = NULL; + _internal_metadata_.Clear(); +} + +bool RangeLookupResponse::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter( + &_internal_metadata_); + ::google::protobuf::io::StringOutputStream unknown_fields_output( + unknown_fields_setter.buffer()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_output, false); + // @@protoc_insertion_point(parse_start:cockroach.roachpb.RangeLookupResponse) + for (;;) { + ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_descriptors())); + } else { + goto handle_unusual; + } + break; + } + + case 2: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_prefetched_descriptors())); + } else { + goto handle_unusual; + } + break; + } + + // .cockroach.roachpb.Error error = 3; + case 3: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_error())); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:cockroach.roachpb.RangeLookupResponse) + return true; +failure: + // @@protoc_insertion_point(parse_failure:cockroach.roachpb.RangeLookupResponse) + return false; +#undef DO_ +} + +void RangeLookupResponse::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:cockroach.roachpb.RangeLookupResponse) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + for (unsigned int i = 0, + n = static_cast(this->descriptors_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 1, + this->descriptors(static_cast(i)), + output); + } + + for (unsigned int i = 0, + n = static_cast(this->prefetched_descriptors_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, + this->prefetched_descriptors(static_cast(i)), + output); + } + + // .cockroach.roachpb.Error error = 3; + if (this->has_error()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 3, this->_internal_error(), output); + } + + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), + static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); + // @@protoc_insertion_point(serialize_end:cockroach.roachpb.RangeLookupResponse) +} + +size_t RangeLookupResponse::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:cockroach.roachpb.RangeLookupResponse) + size_t total_size = 0; + + total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + + { + unsigned int count = static_cast(this->descriptors_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->descriptors(static_cast(i))); + } + } + + { + unsigned int count = static_cast(this->prefetched_descriptors_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->prefetched_descriptors(static_cast(i))); + } + } + + // .cockroach.roachpb.Error error = 3; + if (this->has_error()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *error_); + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void RangeLookupResponse::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void RangeLookupResponse::MergeFrom(const RangeLookupResponse& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:cockroach.roachpb.RangeLookupResponse) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + descriptors_.MergeFrom(from.descriptors_); + prefetched_descriptors_.MergeFrom(from.prefetched_descriptors_); + if (from.has_error()) { + mutable_error()->::cockroach::roachpb::Error::MergeFrom(from.error()); + } +} + +void RangeLookupResponse::CopyFrom(const RangeLookupResponse& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:cockroach.roachpb.RangeLookupResponse) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool RangeLookupResponse::IsInitialized() const { + return true; +} + +void RangeLookupResponse::Swap(RangeLookupResponse* other) { + if (other == this) return; + InternalSwap(other); +} +void RangeLookupResponse::InternalSwap(RangeLookupResponse* other) { + using std::swap; + CastToBase(&descriptors_)->InternalSwap(CastToBase(&other->descriptors_)); + CastToBase(&prefetched_descriptors_)->InternalSwap(CastToBase(&other->prefetched_descriptors_)); + swap(error_, other->error_); + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::std::string RangeLookupResponse::GetTypeName() const { + return "cockroach.roachpb.RangeLookupResponse"; +} + + // =================================================================== void RangeFeedRequest::InitAsDefaultInstance() { @@ -38069,6 +38707,530 @@ ::std::string RangeFeedEvent::GetTypeName() const { } +// =================================================================== + +void GossipSubscriptionRequest::InitAsDefaultInstance() { +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int GossipSubscriptionRequest::kPatternsFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +GossipSubscriptionRequest::GossipSubscriptionRequest() + : ::google::protobuf::MessageLite(), _internal_metadata_(NULL) { + ::google::protobuf::internal::InitSCC( + &protobuf_roachpb_2fapi_2eproto::scc_info_GossipSubscriptionRequest.base); + SharedCtor(); + // @@protoc_insertion_point(constructor:cockroach.roachpb.GossipSubscriptionRequest) +} +GossipSubscriptionRequest::GossipSubscriptionRequest(const GossipSubscriptionRequest& from) + : ::google::protobuf::MessageLite(), + _internal_metadata_(NULL), + patterns_(from.patterns_) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + // @@protoc_insertion_point(copy_constructor:cockroach.roachpb.GossipSubscriptionRequest) +} + +void GossipSubscriptionRequest::SharedCtor() { +} + +GossipSubscriptionRequest::~GossipSubscriptionRequest() { + // @@protoc_insertion_point(destructor:cockroach.roachpb.GossipSubscriptionRequest) + SharedDtor(); +} + +void GossipSubscriptionRequest::SharedDtor() { +} + +void GossipSubscriptionRequest::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const GossipSubscriptionRequest& GossipSubscriptionRequest::default_instance() { + ::google::protobuf::internal::InitSCC(&protobuf_roachpb_2fapi_2eproto::scc_info_GossipSubscriptionRequest.base); + return *internal_default_instance(); +} + + +void GossipSubscriptionRequest::Clear() { +// @@protoc_insertion_point(message_clear_start:cockroach.roachpb.GossipSubscriptionRequest) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + patterns_.Clear(); + _internal_metadata_.Clear(); +} + +bool GossipSubscriptionRequest::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter( + &_internal_metadata_); + ::google::protobuf::io::StringOutputStream unknown_fields_output( + unknown_fields_setter.buffer()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_output, false); + // @@protoc_insertion_point(parse_start:cockroach.roachpb.GossipSubscriptionRequest) + for (;;) { + ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated string patterns = 1; + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_patterns())); + DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->patterns(this->patterns_size() - 1).data(), + static_cast(this->patterns(this->patterns_size() - 1).length()), + ::google::protobuf::internal::WireFormatLite::PARSE, + "cockroach.roachpb.GossipSubscriptionRequest.patterns")); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:cockroach.roachpb.GossipSubscriptionRequest) + return true; +failure: + // @@protoc_insertion_point(parse_failure:cockroach.roachpb.GossipSubscriptionRequest) + return false; +#undef DO_ +} + +void GossipSubscriptionRequest::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:cockroach.roachpb.GossipSubscriptionRequest) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // repeated string patterns = 1; + for (int i = 0, n = this->patterns_size(); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->patterns(i).data(), static_cast(this->patterns(i).length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, + "cockroach.roachpb.GossipSubscriptionRequest.patterns"); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->patterns(i), output); + } + + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), + static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); + // @@protoc_insertion_point(serialize_end:cockroach.roachpb.GossipSubscriptionRequest) +} + +size_t GossipSubscriptionRequest::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:cockroach.roachpb.GossipSubscriptionRequest) + size_t total_size = 0; + + total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + + // repeated string patterns = 1; + total_size += 1 * + ::google::protobuf::internal::FromIntSize(this->patterns_size()); + for (int i = 0, n = this->patterns_size(); i < n; i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->patterns(i)); + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void GossipSubscriptionRequest::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void GossipSubscriptionRequest::MergeFrom(const GossipSubscriptionRequest& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:cockroach.roachpb.GossipSubscriptionRequest) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + patterns_.MergeFrom(from.patterns_); +} + +void GossipSubscriptionRequest::CopyFrom(const GossipSubscriptionRequest& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:cockroach.roachpb.GossipSubscriptionRequest) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool GossipSubscriptionRequest::IsInitialized() const { + return true; +} + +void GossipSubscriptionRequest::Swap(GossipSubscriptionRequest* other) { + if (other == this) return; + InternalSwap(other); +} +void GossipSubscriptionRequest::InternalSwap(GossipSubscriptionRequest* other) { + using std::swap; + patterns_.InternalSwap(CastToBase(&other->patterns_)); + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::std::string GossipSubscriptionRequest::GetTypeName() const { + return "cockroach.roachpb.GossipSubscriptionRequest"; +} + + +// =================================================================== + +void GossipSubscriptionEvent::InitAsDefaultInstance() { + ::cockroach::roachpb::_GossipSubscriptionEvent_default_instance_._instance.get_mutable()->content_ = const_cast< ::cockroach::roachpb::Value*>( + ::cockroach::roachpb::Value::internal_default_instance()); + ::cockroach::roachpb::_GossipSubscriptionEvent_default_instance_._instance.get_mutable()->error_ = const_cast< ::cockroach::roachpb::Error*>( + ::cockroach::roachpb::Error::internal_default_instance()); +} +void GossipSubscriptionEvent::clear_content() { + if (GetArenaNoVirtual() == NULL && content_ != NULL) { + delete content_; + } + content_ = NULL; +} +void GossipSubscriptionEvent::clear_error() { + if (GetArenaNoVirtual() == NULL && error_ != NULL) { + delete error_; + } + error_ = NULL; +} +#if !defined(_MSC_VER) || _MSC_VER >= 1900 +const int GossipSubscriptionEvent::kKeyFieldNumber; +const int GossipSubscriptionEvent::kContentFieldNumber; +const int GossipSubscriptionEvent::kPatternMatchedFieldNumber; +const int GossipSubscriptionEvent::kErrorFieldNumber; +#endif // !defined(_MSC_VER) || _MSC_VER >= 1900 + +GossipSubscriptionEvent::GossipSubscriptionEvent() + : ::google::protobuf::MessageLite(), _internal_metadata_(NULL) { + ::google::protobuf::internal::InitSCC( + &protobuf_roachpb_2fapi_2eproto::scc_info_GossipSubscriptionEvent.base); + SharedCtor(); + // @@protoc_insertion_point(constructor:cockroach.roachpb.GossipSubscriptionEvent) +} +GossipSubscriptionEvent::GossipSubscriptionEvent(const GossipSubscriptionEvent& from) + : ::google::protobuf::MessageLite(), + _internal_metadata_(NULL) { + _internal_metadata_.MergeFrom(from._internal_metadata_); + key_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (from.key().size() > 0) { + key_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.key_); + } + pattern_matched_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (from.pattern_matched().size() > 0) { + pattern_matched_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.pattern_matched_); + } + if (from.has_content()) { + content_ = new ::cockroach::roachpb::Value(*from.content_); + } else { + content_ = NULL; + } + if (from.has_error()) { + error_ = new ::cockroach::roachpb::Error(*from.error_); + } else { + error_ = NULL; + } + // @@protoc_insertion_point(copy_constructor:cockroach.roachpb.GossipSubscriptionEvent) +} + +void GossipSubscriptionEvent::SharedCtor() { + key_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + pattern_matched_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + ::memset(&content_, 0, static_cast( + reinterpret_cast(&error_) - + reinterpret_cast(&content_)) + sizeof(error_)); +} + +GossipSubscriptionEvent::~GossipSubscriptionEvent() { + // @@protoc_insertion_point(destructor:cockroach.roachpb.GossipSubscriptionEvent) + SharedDtor(); +} + +void GossipSubscriptionEvent::SharedDtor() { + key_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + pattern_matched_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (this != internal_default_instance()) delete content_; + if (this != internal_default_instance()) delete error_; +} + +void GossipSubscriptionEvent::SetCachedSize(int size) const { + _cached_size_.Set(size); +} +const GossipSubscriptionEvent& GossipSubscriptionEvent::default_instance() { + ::google::protobuf::internal::InitSCC(&protobuf_roachpb_2fapi_2eproto::scc_info_GossipSubscriptionEvent.base); + return *internal_default_instance(); +} + + +void GossipSubscriptionEvent::Clear() { +// @@protoc_insertion_point(message_clear_start:cockroach.roachpb.GossipSubscriptionEvent) + ::google::protobuf::uint32 cached_has_bits = 0; + // Prevent compiler warnings about cached_has_bits being unused + (void) cached_has_bits; + + key_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + pattern_matched_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); + if (GetArenaNoVirtual() == NULL && content_ != NULL) { + delete content_; + } + content_ = NULL; + if (GetArenaNoVirtual() == NULL && error_ != NULL) { + delete error_; + } + error_ = NULL; + _internal_metadata_.Clear(); +} + +bool GossipSubscriptionEvent::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!GOOGLE_PREDICT_TRUE(EXPRESSION)) goto failure + ::google::protobuf::uint32 tag; + ::google::protobuf::internal::LiteUnknownFieldSetter unknown_fields_setter( + &_internal_metadata_); + ::google::protobuf::io::StringOutputStream unknown_fields_output( + unknown_fields_setter.buffer()); + ::google::protobuf::io::CodedOutputStream unknown_fields_stream( + &unknown_fields_output, false); + // @@protoc_insertion_point(parse_start:cockroach.roachpb.GossipSubscriptionEvent) + for (;;) { + ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u); + tag = p.first; + if (!p.second) goto handle_unusual; + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // string key = 1; + case 1: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(10u /* 10 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_key())); + DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->key().data(), static_cast(this->key().length()), + ::google::protobuf::internal::WireFormatLite::PARSE, + "cockroach.roachpb.GossipSubscriptionEvent.key")); + } else { + goto handle_unusual; + } + break; + } + + case 2: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(18u /* 18 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_content())); + } else { + goto handle_unusual; + } + break; + } + + // string pattern_matched = 3; + case 3: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(26u /* 26 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_pattern_matched())); + DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->pattern_matched().data(), static_cast(this->pattern_matched().length()), + ::google::protobuf::internal::WireFormatLite::PARSE, + "cockroach.roachpb.GossipSubscriptionEvent.pattern_matched")); + } else { + goto handle_unusual; + } + break; + } + + // .cockroach.roachpb.Error error = 4; + case 4: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(34u /* 34 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_error())); + } else { + goto handle_unusual; + } + break; + } + + default: { + handle_unusual: + if (tag == 0) { + goto success; + } + DO_(::google::protobuf::internal::WireFormatLite::SkipField( + input, tag, &unknown_fields_stream)); + break; + } + } + } +success: + // @@protoc_insertion_point(parse_success:cockroach.roachpb.GossipSubscriptionEvent) + return true; +failure: + // @@protoc_insertion_point(parse_failure:cockroach.roachpb.GossipSubscriptionEvent) + return false; +#undef DO_ +} + +void GossipSubscriptionEvent::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // @@protoc_insertion_point(serialize_start:cockroach.roachpb.GossipSubscriptionEvent) + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + // string key = 1; + if (this->key().size() > 0) { + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->key().data(), static_cast(this->key().length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, + "cockroach.roachpb.GossipSubscriptionEvent.key"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 1, this->key(), output); + } + + if (this->has_content()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 2, this->_internal_content(), output); + } + + // string pattern_matched = 3; + if (this->pattern_matched().size() > 0) { + ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( + this->pattern_matched().data(), static_cast(this->pattern_matched().length()), + ::google::protobuf::internal::WireFormatLite::SERIALIZE, + "cockroach.roachpb.GossipSubscriptionEvent.pattern_matched"); + ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased( + 3, this->pattern_matched(), output); + } + + // .cockroach.roachpb.Error error = 4; + if (this->has_error()) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 4, this->_internal_error(), output); + } + + output->WriteRaw((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).data(), + static_cast((::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size())); + // @@protoc_insertion_point(serialize_end:cockroach.roachpb.GossipSubscriptionEvent) +} + +size_t GossipSubscriptionEvent::ByteSizeLong() const { +// @@protoc_insertion_point(message_byte_size_start:cockroach.roachpb.GossipSubscriptionEvent) + size_t total_size = 0; + + total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + + // string key = 1; + if (this->key().size() > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->key()); + } + + // string pattern_matched = 3; + if (this->pattern_matched().size() > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->pattern_matched()); + } + + if (this->has_content()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *content_); + } + + // .cockroach.roachpb.Error error = 4; + if (this->has_error()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSize( + *error_); + } + + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); + SetCachedSize(cached_size); + return total_size; +} + +void GossipSubscriptionEvent::CheckTypeAndMergeFrom( + const ::google::protobuf::MessageLite& from) { + MergeFrom(*::google::protobuf::down_cast(&from)); +} + +void GossipSubscriptionEvent::MergeFrom(const GossipSubscriptionEvent& from) { +// @@protoc_insertion_point(class_specific_merge_from_start:cockroach.roachpb.GossipSubscriptionEvent) + GOOGLE_DCHECK_NE(&from, this); + _internal_metadata_.MergeFrom(from._internal_metadata_); + ::google::protobuf::uint32 cached_has_bits = 0; + (void) cached_has_bits; + + if (from.key().size() > 0) { + + key_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.key_); + } + if (from.pattern_matched().size() > 0) { + + pattern_matched_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.pattern_matched_); + } + if (from.has_content()) { + mutable_content()->::cockroach::roachpb::Value::MergeFrom(from.content()); + } + if (from.has_error()) { + mutable_error()->::cockroach::roachpb::Error::MergeFrom(from.error()); + } +} + +void GossipSubscriptionEvent::CopyFrom(const GossipSubscriptionEvent& from) { +// @@protoc_insertion_point(class_specific_copy_from_start:cockroach.roachpb.GossipSubscriptionEvent) + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool GossipSubscriptionEvent::IsInitialized() const { + return true; +} + +void GossipSubscriptionEvent::Swap(GossipSubscriptionEvent* other) { + if (other == this) return; + InternalSwap(other); +} +void GossipSubscriptionEvent::InternalSwap(GossipSubscriptionEvent* other) { + using std::swap; + key_.Swap(&other->key_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + pattern_matched_.Swap(&other->pattern_matched_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(), + GetArenaNoVirtual()); + swap(content_, other->content_); + swap(error_, other->error_); + _internal_metadata_.Swap(&other->_internal_metadata_); +} + +::std::string GossipSubscriptionEvent::GetTypeName() const { + return "cockroach.roachpb.GossipSubscriptionEvent"; +} + + // @@protoc_insertion_point(namespace_scope) } // namespace roachpb } // namespace cockroach @@ -38416,6 +39578,12 @@ template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::BatchRespons template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::BatchResponse* Arena::CreateMaybeMessage< ::cockroach::roachpb::BatchResponse >(Arena* arena) { return Arena::CreateInternal< ::cockroach::roachpb::BatchResponse >(arena); } +template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::RangeLookupRequest* Arena::CreateMaybeMessage< ::cockroach::roachpb::RangeLookupRequest >(Arena* arena) { + return Arena::CreateInternal< ::cockroach::roachpb::RangeLookupRequest >(arena); +} +template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::RangeLookupResponse* Arena::CreateMaybeMessage< ::cockroach::roachpb::RangeLookupResponse >(Arena* arena) { + return Arena::CreateInternal< ::cockroach::roachpb::RangeLookupResponse >(arena); +} template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::RangeFeedRequest* Arena::CreateMaybeMessage< ::cockroach::roachpb::RangeFeedRequest >(Arena* arena) { return Arena::CreateInternal< ::cockroach::roachpb::RangeFeedRequest >(arena); } @@ -38431,6 +39599,12 @@ template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::RangeFeedErr template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::RangeFeedEvent* Arena::CreateMaybeMessage< ::cockroach::roachpb::RangeFeedEvent >(Arena* arena) { return Arena::CreateInternal< ::cockroach::roachpb::RangeFeedEvent >(arena); } +template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::GossipSubscriptionRequest* Arena::CreateMaybeMessage< ::cockroach::roachpb::GossipSubscriptionRequest >(Arena* arena) { + return Arena::CreateInternal< ::cockroach::roachpb::GossipSubscriptionRequest >(arena); +} +template<> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE ::cockroach::roachpb::GossipSubscriptionEvent* Arena::CreateMaybeMessage< ::cockroach::roachpb::GossipSubscriptionEvent >(Arena* arena) { + return Arena::CreateInternal< ::cockroach::roachpb::GossipSubscriptionEvent >(arena); +} } // namespace protobuf } // namespace google diff --git a/c-deps/libroach/protos/roachpb/api.pb.h b/c-deps/libroach/protos/roachpb/api.pb.h index 84f637330b33..97f57436b081 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.h +++ b/c-deps/libroach/protos/roachpb/api.pb.h @@ -49,7 +49,7 @@ namespace protobuf_roachpb_2fapi_2eproto { struct TableStruct { static const ::google::protobuf::internal::ParseTableField entries[]; static const ::google::protobuf::internal::AuxillaryParseTableField aux[]; - static const ::google::protobuf::internal::ParseTable schema[119]; + static const ::google::protobuf::internal::ParseTable schema[123]; static const ::google::protobuf::internal::FieldMetadata field_metadata[]; static const ::google::protobuf::internal::SerializationTable serialization_table[]; static const ::google::protobuf::uint32 offsets[]; @@ -228,6 +228,12 @@ extern GetRequestDefaultTypeInternal _GetRequest_default_instance_; class GetResponse; class GetResponseDefaultTypeInternal; extern GetResponseDefaultTypeInternal _GetResponse_default_instance_; +class GossipSubscriptionEvent; +class GossipSubscriptionEventDefaultTypeInternal; +extern GossipSubscriptionEventDefaultTypeInternal _GossipSubscriptionEvent_default_instance_; +class GossipSubscriptionRequest; +class GossipSubscriptionRequestDefaultTypeInternal; +extern GossipSubscriptionRequestDefaultTypeInternal _GossipSubscriptionRequest_default_instance_; class Header; class HeaderDefaultTypeInternal; extern HeaderDefaultTypeInternal _Header_default_instance_; @@ -312,6 +318,12 @@ extern RangeFeedRequestDefaultTypeInternal _RangeFeedRequest_default_instance_; class RangeFeedValue; class RangeFeedValueDefaultTypeInternal; extern RangeFeedValueDefaultTypeInternal _RangeFeedValue_default_instance_; +class RangeLookupRequest; +class RangeLookupRequestDefaultTypeInternal; +extern RangeLookupRequestDefaultTypeInternal _RangeLookupRequest_default_instance_; +class RangeLookupResponse; +class RangeLookupResponseDefaultTypeInternal; +extern RangeLookupResponseDefaultTypeInternal _RangeLookupResponse_default_instance_; class RangeStatsRequest; class RangeStatsRequestDefaultTypeInternal; extern RangeStatsRequestDefaultTypeInternal _RangeStatsRequest_default_instance_; @@ -475,6 +487,8 @@ template<> ::cockroach::roachpb::GCRequest_GCKey* Arena::CreateMaybeMessage<::co template<> ::cockroach::roachpb::GCResponse* Arena::CreateMaybeMessage<::cockroach::roachpb::GCResponse>(Arena*); template<> ::cockroach::roachpb::GetRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::GetRequest>(Arena*); template<> ::cockroach::roachpb::GetResponse* Arena::CreateMaybeMessage<::cockroach::roachpb::GetResponse>(Arena*); +template<> ::cockroach::roachpb::GossipSubscriptionEvent* Arena::CreateMaybeMessage<::cockroach::roachpb::GossipSubscriptionEvent>(Arena*); +template<> ::cockroach::roachpb::GossipSubscriptionRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::GossipSubscriptionRequest>(Arena*); template<> ::cockroach::roachpb::Header* Arena::CreateMaybeMessage<::cockroach::roachpb::Header>(Arena*); template<> ::cockroach::roachpb::HeartbeatTxnRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::HeartbeatTxnRequest>(Arena*); template<> ::cockroach::roachpb::HeartbeatTxnResponse* Arena::CreateMaybeMessage<::cockroach::roachpb::HeartbeatTxnResponse>(Arena*); @@ -503,6 +517,8 @@ template<> ::cockroach::roachpb::RangeFeedError* Arena::CreateMaybeMessage<::coc template<> ::cockroach::roachpb::RangeFeedEvent* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeFeedEvent>(Arena*); template<> ::cockroach::roachpb::RangeFeedRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeFeedRequest>(Arena*); template<> ::cockroach::roachpb::RangeFeedValue* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeFeedValue>(Arena*); +template<> ::cockroach::roachpb::RangeLookupRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeLookupRequest>(Arena*); +template<> ::cockroach::roachpb::RangeLookupResponse* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeLookupResponse>(Arena*); template<> ::cockroach::roachpb::RangeStatsRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeStatsRequest>(Arena*); template<> ::cockroach::roachpb::RangeStatsResponse* Arena::CreateMaybeMessage<::cockroach::roachpb::RangeStatsResponse>(Arena*); template<> ::cockroach::roachpb::RecomputeStatsRequest* Arena::CreateMaybeMessage<::cockroach::roachpb::RecomputeStatsRequest>(Arena*); @@ -16244,6 +16260,266 @@ class BatchResponse : public ::google::protobuf::MessageLite /* @@protoc_inserti }; // ------------------------------------------------------------------- +class RangeLookupRequest : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.roachpb.RangeLookupRequest) */ { + public: + RangeLookupRequest(); + virtual ~RangeLookupRequest(); + + RangeLookupRequest(const RangeLookupRequest& from); + + inline RangeLookupRequest& operator=(const RangeLookupRequest& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + RangeLookupRequest(RangeLookupRequest&& from) noexcept + : RangeLookupRequest() { + *this = ::std::move(from); + } + + inline RangeLookupRequest& operator=(RangeLookupRequest&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const RangeLookupRequest& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const RangeLookupRequest* internal_default_instance() { + return reinterpret_cast( + &_RangeLookupRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 114; + + void Swap(RangeLookupRequest* other); + friend void swap(RangeLookupRequest& a, RangeLookupRequest& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline RangeLookupRequest* New() const final { + return CreateMaybeMessage(NULL); + } + + RangeLookupRequest* New(::google::protobuf::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from) + final; + void CopyFrom(const RangeLookupRequest& from); + void MergeFrom(const RangeLookupRequest& from); + void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) final; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const final; + void DiscardUnknownFields(); + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(RangeLookupRequest* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + void clear_key(); + static const int kKeyFieldNumber = 1; + const ::std::string& key() const; + void set_key(const ::std::string& value); + #if LANG_CXX11 + void set_key(::std::string&& value); + #endif + void set_key(const char* value); + void set_key(const void* value, size_t size); + ::std::string* mutable_key(); + ::std::string* release_key(); + void set_allocated_key(::std::string* key); + + // int64 prefetch_num = 3; + void clear_prefetch_num(); + static const int kPrefetchNumFieldNumber = 3; + ::google::protobuf::int64 prefetch_num() const; + void set_prefetch_num(::google::protobuf::int64 value); + + // .cockroach.roachpb.ReadConsistencyType read_consistency = 2; + void clear_read_consistency(); + static const int kReadConsistencyFieldNumber = 2; + ::cockroach::roachpb::ReadConsistencyType read_consistency() const; + void set_read_consistency(::cockroach::roachpb::ReadConsistencyType value); + + // bool prefetch_reverse = 4; + void clear_prefetch_reverse(); + static const int kPrefetchReverseFieldNumber = 4; + bool prefetch_reverse() const; + void set_prefetch_reverse(bool value); + + // @@protoc_insertion_point(class_scope:cockroach.roachpb.RangeLookupRequest) + private: + + ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::internal::ArenaStringPtr key_; + ::google::protobuf::int64 prefetch_num_; + int read_consistency_; + bool prefetch_reverse_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + friend struct ::protobuf_roachpb_2fapi_2eproto::TableStruct; +}; +// ------------------------------------------------------------------- + +class RangeLookupResponse : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.roachpb.RangeLookupResponse) */ { + public: + RangeLookupResponse(); + virtual ~RangeLookupResponse(); + + RangeLookupResponse(const RangeLookupResponse& from); + + inline RangeLookupResponse& operator=(const RangeLookupResponse& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + RangeLookupResponse(RangeLookupResponse&& from) noexcept + : RangeLookupResponse() { + *this = ::std::move(from); + } + + inline RangeLookupResponse& operator=(RangeLookupResponse&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const RangeLookupResponse& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const RangeLookupResponse* internal_default_instance() { + return reinterpret_cast( + &_RangeLookupResponse_default_instance_); + } + static constexpr int kIndexInFileMessages = + 115; + + void Swap(RangeLookupResponse* other); + friend void swap(RangeLookupResponse& a, RangeLookupResponse& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline RangeLookupResponse* New() const final { + return CreateMaybeMessage(NULL); + } + + RangeLookupResponse* New(::google::protobuf::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from) + final; + void CopyFrom(const RangeLookupResponse& from); + void MergeFrom(const RangeLookupResponse& from); + void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) final; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const final; + void DiscardUnknownFields(); + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(RangeLookupResponse* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + int descriptors_size() const; + void clear_descriptors(); + static const int kDescriptorsFieldNumber = 1; + ::cockroach::roachpb::RangeDescriptor* mutable_descriptors(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >* + mutable_descriptors(); + const ::cockroach::roachpb::RangeDescriptor& descriptors(int index) const; + ::cockroach::roachpb::RangeDescriptor* add_descriptors(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >& + descriptors() const; + + int prefetched_descriptors_size() const; + void clear_prefetched_descriptors(); + static const int kPrefetchedDescriptorsFieldNumber = 2; + ::cockroach::roachpb::RangeDescriptor* mutable_prefetched_descriptors(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >* + mutable_prefetched_descriptors(); + const ::cockroach::roachpb::RangeDescriptor& prefetched_descriptors(int index) const; + ::cockroach::roachpb::RangeDescriptor* add_prefetched_descriptors(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >& + prefetched_descriptors() const; + + // .cockroach.roachpb.Error error = 3; + bool has_error() const; + void clear_error(); + static const int kErrorFieldNumber = 3; + private: + const ::cockroach::roachpb::Error& _internal_error() const; + public: + const ::cockroach::roachpb::Error& error() const; + ::cockroach::roachpb::Error* release_error(); + ::cockroach::roachpb::Error* mutable_error(); + void set_allocated_error(::cockroach::roachpb::Error* error); + + // @@protoc_insertion_point(class_scope:cockroach.roachpb.RangeLookupResponse) + private: + + ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor > descriptors_; + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor > prefetched_descriptors_; + ::cockroach::roachpb::Error* error_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + friend struct ::protobuf_roachpb_2fapi_2eproto::TableStruct; +}; +// ------------------------------------------------------------------- + class RangeFeedRequest : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.roachpb.RangeFeedRequest) */ { public: RangeFeedRequest(); @@ -16278,7 +16554,7 @@ class RangeFeedRequest : public ::google::protobuf::MessageLite /* @@protoc_inse &_RangeFeedRequest_default_instance_); } static constexpr int kIndexInFileMessages = - 114; + 116; void Swap(RangeFeedRequest* other); friend void swap(RangeFeedRequest& a, RangeFeedRequest& b) { @@ -16403,7 +16679,7 @@ class RangeFeedValue : public ::google::protobuf::MessageLite /* @@protoc_insert &_RangeFeedValue_default_instance_); } static constexpr int kIndexInFileMessages = - 115; + 117; void Swap(RangeFeedValue* other); friend void swap(RangeFeedValue& a, RangeFeedValue& b) { @@ -16535,7 +16811,7 @@ class RangeFeedCheckpoint : public ::google::protobuf::MessageLite /* @@protoc_i &_RangeFeedCheckpoint_default_instance_); } static constexpr int kIndexInFileMessages = - 116; + 118; void Swap(RangeFeedCheckpoint* other); friend void swap(RangeFeedCheckpoint& a, RangeFeedCheckpoint& b) { @@ -16653,7 +16929,7 @@ class RangeFeedError : public ::google::protobuf::MessageLite /* @@protoc_insert &_RangeFeedError_default_instance_); } static constexpr int kIndexInFileMessages = - 117; + 119; void Swap(RangeFeedError* other); friend void swap(RangeFeedError& a, RangeFeedError& b) { @@ -16759,7 +17035,7 @@ class RangeFeedEvent : public ::google::protobuf::MessageLite /* @@protoc_insert &_RangeFeedEvent_default_instance_); } static constexpr int kIndexInFileMessages = - 118; + 120; void Swap(RangeFeedEvent* other); friend void swap(RangeFeedEvent& a, RangeFeedEvent& b) { @@ -16856,6 +17132,272 @@ class RangeFeedEvent : public ::google::protobuf::MessageLite /* @@protoc_insert mutable ::google::protobuf::internal::CachedSize _cached_size_; friend struct ::protobuf_roachpb_2fapi_2eproto::TableStruct; }; +// ------------------------------------------------------------------- + +class GossipSubscriptionRequest : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.roachpb.GossipSubscriptionRequest) */ { + public: + GossipSubscriptionRequest(); + virtual ~GossipSubscriptionRequest(); + + GossipSubscriptionRequest(const GossipSubscriptionRequest& from); + + inline GossipSubscriptionRequest& operator=(const GossipSubscriptionRequest& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + GossipSubscriptionRequest(GossipSubscriptionRequest&& from) noexcept + : GossipSubscriptionRequest() { + *this = ::std::move(from); + } + + inline GossipSubscriptionRequest& operator=(GossipSubscriptionRequest&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const GossipSubscriptionRequest& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const GossipSubscriptionRequest* internal_default_instance() { + return reinterpret_cast( + &_GossipSubscriptionRequest_default_instance_); + } + static constexpr int kIndexInFileMessages = + 121; + + void Swap(GossipSubscriptionRequest* other); + friend void swap(GossipSubscriptionRequest& a, GossipSubscriptionRequest& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline GossipSubscriptionRequest* New() const final { + return CreateMaybeMessage(NULL); + } + + GossipSubscriptionRequest* New(::google::protobuf::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from) + final; + void CopyFrom(const GossipSubscriptionRequest& from); + void MergeFrom(const GossipSubscriptionRequest& from); + void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) final; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const final; + void DiscardUnknownFields(); + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(GossipSubscriptionRequest* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated string patterns = 1; + int patterns_size() const; + void clear_patterns(); + static const int kPatternsFieldNumber = 1; + const ::std::string& patterns(int index) const; + ::std::string* mutable_patterns(int index); + void set_patterns(int index, const ::std::string& value); + #if LANG_CXX11 + void set_patterns(int index, ::std::string&& value); + #endif + void set_patterns(int index, const char* value); + void set_patterns(int index, const char* value, size_t size); + ::std::string* add_patterns(); + void add_patterns(const ::std::string& value); + #if LANG_CXX11 + void add_patterns(::std::string&& value); + #endif + void add_patterns(const char* value); + void add_patterns(const char* value, size_t size); + const ::google::protobuf::RepeatedPtrField< ::std::string>& patterns() const; + ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_patterns(); + + // @@protoc_insertion_point(class_scope:cockroach.roachpb.GossipSubscriptionRequest) + private: + + ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::std::string> patterns_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + friend struct ::protobuf_roachpb_2fapi_2eproto::TableStruct; +}; +// ------------------------------------------------------------------- + +class GossipSubscriptionEvent : public ::google::protobuf::MessageLite /* @@protoc_insertion_point(class_definition:cockroach.roachpb.GossipSubscriptionEvent) */ { + public: + GossipSubscriptionEvent(); + virtual ~GossipSubscriptionEvent(); + + GossipSubscriptionEvent(const GossipSubscriptionEvent& from); + + inline GossipSubscriptionEvent& operator=(const GossipSubscriptionEvent& from) { + CopyFrom(from); + return *this; + } + #if LANG_CXX11 + GossipSubscriptionEvent(GossipSubscriptionEvent&& from) noexcept + : GossipSubscriptionEvent() { + *this = ::std::move(from); + } + + inline GossipSubscriptionEvent& operator=(GossipSubscriptionEvent&& from) noexcept { + if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) { + if (this != &from) InternalSwap(&from); + } else { + CopyFrom(from); + } + return *this; + } + #endif + static const GossipSubscriptionEvent& default_instance(); + + static void InitAsDefaultInstance(); // FOR INTERNAL USE ONLY + static inline const GossipSubscriptionEvent* internal_default_instance() { + return reinterpret_cast( + &_GossipSubscriptionEvent_default_instance_); + } + static constexpr int kIndexInFileMessages = + 122; + + void Swap(GossipSubscriptionEvent* other); + friend void swap(GossipSubscriptionEvent& a, GossipSubscriptionEvent& b) { + a.Swap(&b); + } + + // implements Message ---------------------------------------------- + + inline GossipSubscriptionEvent* New() const final { + return CreateMaybeMessage(NULL); + } + + GossipSubscriptionEvent* New(::google::protobuf::Arena* arena) const final { + return CreateMaybeMessage(arena); + } + void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from) + final; + void CopyFrom(const GossipSubscriptionEvent& from); + void MergeFrom(const GossipSubscriptionEvent& from); + void Clear() final; + bool IsInitialized() const final; + + size_t ByteSizeLong() const final; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) final; + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const final; + void DiscardUnknownFields(); + int GetCachedSize() const final { return _cached_size_.Get(); } + + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + void InternalSwap(GossipSubscriptionEvent* other); + private: + inline ::google::protobuf::Arena* GetArenaNoVirtual() const { + return NULL; + } + inline void* MaybeArenaPtr() const { + return NULL; + } + public: + + ::std::string GetTypeName() const final; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // string key = 1; + void clear_key(); + static const int kKeyFieldNumber = 1; + const ::std::string& key() const; + void set_key(const ::std::string& value); + #if LANG_CXX11 + void set_key(::std::string&& value); + #endif + void set_key(const char* value); + void set_key(const char* value, size_t size); + ::std::string* mutable_key(); + ::std::string* release_key(); + void set_allocated_key(::std::string* key); + + // string pattern_matched = 3; + void clear_pattern_matched(); + static const int kPatternMatchedFieldNumber = 3; + const ::std::string& pattern_matched() const; + void set_pattern_matched(const ::std::string& value); + #if LANG_CXX11 + void set_pattern_matched(::std::string&& value); + #endif + void set_pattern_matched(const char* value); + void set_pattern_matched(const char* value, size_t size); + ::std::string* mutable_pattern_matched(); + ::std::string* release_pattern_matched(); + void set_allocated_pattern_matched(::std::string* pattern_matched); + + bool has_content() const; + void clear_content(); + static const int kContentFieldNumber = 2; + private: + const ::cockroach::roachpb::Value& _internal_content() const; + public: + const ::cockroach::roachpb::Value& content() const; + ::cockroach::roachpb::Value* release_content(); + ::cockroach::roachpb::Value* mutable_content(); + void set_allocated_content(::cockroach::roachpb::Value* content); + + // .cockroach.roachpb.Error error = 4; + bool has_error() const; + void clear_error(); + static const int kErrorFieldNumber = 4; + private: + const ::cockroach::roachpb::Error& _internal_error() const; + public: + const ::cockroach::roachpb::Error& error() const; + ::cockroach::roachpb::Error* release_error(); + ::cockroach::roachpb::Error* mutable_error(); + void set_allocated_error(::cockroach::roachpb::Error* error); + + // @@protoc_insertion_point(class_scope:cockroach.roachpb.GossipSubscriptionEvent) + private: + + ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::internal::ArenaStringPtr key_; + ::google::protobuf::internal::ArenaStringPtr pattern_matched_; + ::cockroach::roachpb::Value* content_; + ::cockroach::roachpb::Error* error_; + mutable ::google::protobuf::internal::CachedSize _cached_size_; + friend struct ::protobuf_roachpb_2fapi_2eproto::TableStruct; +}; // =================================================================== @@ -34086,6 +34628,208 @@ BatchResponse::responses() const { // ------------------------------------------------------------------- +// RangeLookupRequest + +inline void RangeLookupRequest::clear_key() { + key_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline const ::std::string& RangeLookupRequest::key() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupRequest.key) + return key_.GetNoArena(); +} +inline void RangeLookupRequest::set_key(const ::std::string& value) { + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:cockroach.roachpb.RangeLookupRequest.key) +} +#if LANG_CXX11 +inline void RangeLookupRequest::set_key(::std::string&& value) { + + key_.SetNoArena( + &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:cockroach.roachpb.RangeLookupRequest.key) +} +#endif +inline void RangeLookupRequest::set_key(const char* value) { + GOOGLE_DCHECK(value != NULL); + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:cockroach.roachpb.RangeLookupRequest.key) +} +inline void RangeLookupRequest::set_key(const void* value, size_t size) { + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:cockroach.roachpb.RangeLookupRequest.key) +} +inline ::std::string* RangeLookupRequest::mutable_key() { + + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.RangeLookupRequest.key) + return key_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline ::std::string* RangeLookupRequest::release_key() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.RangeLookupRequest.key) + + return key_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline void RangeLookupRequest::set_allocated_key(::std::string* key) { + if (key != NULL) { + + } else { + + } + key_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), key); + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.RangeLookupRequest.key) +} + +// .cockroach.roachpb.ReadConsistencyType read_consistency = 2; +inline void RangeLookupRequest::clear_read_consistency() { + read_consistency_ = 0; +} +inline ::cockroach::roachpb::ReadConsistencyType RangeLookupRequest::read_consistency() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupRequest.read_consistency) + return static_cast< ::cockroach::roachpb::ReadConsistencyType >(read_consistency_); +} +inline void RangeLookupRequest::set_read_consistency(::cockroach::roachpb::ReadConsistencyType value) { + + read_consistency_ = value; + // @@protoc_insertion_point(field_set:cockroach.roachpb.RangeLookupRequest.read_consistency) +} + +// int64 prefetch_num = 3; +inline void RangeLookupRequest::clear_prefetch_num() { + prefetch_num_ = GOOGLE_LONGLONG(0); +} +inline ::google::protobuf::int64 RangeLookupRequest::prefetch_num() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupRequest.prefetch_num) + return prefetch_num_; +} +inline void RangeLookupRequest::set_prefetch_num(::google::protobuf::int64 value) { + + prefetch_num_ = value; + // @@protoc_insertion_point(field_set:cockroach.roachpb.RangeLookupRequest.prefetch_num) +} + +// bool prefetch_reverse = 4; +inline void RangeLookupRequest::clear_prefetch_reverse() { + prefetch_reverse_ = false; +} +inline bool RangeLookupRequest::prefetch_reverse() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupRequest.prefetch_reverse) + return prefetch_reverse_; +} +inline void RangeLookupRequest::set_prefetch_reverse(bool value) { + + prefetch_reverse_ = value; + // @@protoc_insertion_point(field_set:cockroach.roachpb.RangeLookupRequest.prefetch_reverse) +} + +// ------------------------------------------------------------------- + +// RangeLookupResponse + +inline int RangeLookupResponse::descriptors_size() const { + return descriptors_.size(); +} +inline ::cockroach::roachpb::RangeDescriptor* RangeLookupResponse::mutable_descriptors(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.RangeLookupResponse.descriptors) + return descriptors_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >* +RangeLookupResponse::mutable_descriptors() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.RangeLookupResponse.descriptors) + return &descriptors_; +} +inline const ::cockroach::roachpb::RangeDescriptor& RangeLookupResponse::descriptors(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupResponse.descriptors) + return descriptors_.Get(index); +} +inline ::cockroach::roachpb::RangeDescriptor* RangeLookupResponse::add_descriptors() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.RangeLookupResponse.descriptors) + return descriptors_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >& +RangeLookupResponse::descriptors() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.RangeLookupResponse.descriptors) + return descriptors_; +} + +inline int RangeLookupResponse::prefetched_descriptors_size() const { + return prefetched_descriptors_.size(); +} +inline ::cockroach::roachpb::RangeDescriptor* RangeLookupResponse::mutable_prefetched_descriptors(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.RangeLookupResponse.prefetched_descriptors) + return prefetched_descriptors_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >* +RangeLookupResponse::mutable_prefetched_descriptors() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.RangeLookupResponse.prefetched_descriptors) + return &prefetched_descriptors_; +} +inline const ::cockroach::roachpb::RangeDescriptor& RangeLookupResponse::prefetched_descriptors(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupResponse.prefetched_descriptors) + return prefetched_descriptors_.Get(index); +} +inline ::cockroach::roachpb::RangeDescriptor* RangeLookupResponse::add_prefetched_descriptors() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.RangeLookupResponse.prefetched_descriptors) + return prefetched_descriptors_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::RangeDescriptor >& +RangeLookupResponse::prefetched_descriptors() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.RangeLookupResponse.prefetched_descriptors) + return prefetched_descriptors_; +} + +// .cockroach.roachpb.Error error = 3; +inline bool RangeLookupResponse::has_error() const { + return this != internal_default_instance() && error_ != NULL; +} +inline const ::cockroach::roachpb::Error& RangeLookupResponse::_internal_error() const { + return *error_; +} +inline const ::cockroach::roachpb::Error& RangeLookupResponse::error() const { + const ::cockroach::roachpb::Error* p = error_; + // @@protoc_insertion_point(field_get:cockroach.roachpb.RangeLookupResponse.error) + return p != NULL ? *p : *reinterpret_cast( + &::cockroach::roachpb::_Error_default_instance_); +} +inline ::cockroach::roachpb::Error* RangeLookupResponse::release_error() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.RangeLookupResponse.error) + + ::cockroach::roachpb::Error* temp = error_; + error_ = NULL; + return temp; +} +inline ::cockroach::roachpb::Error* RangeLookupResponse::mutable_error() { + + if (error_ == NULL) { + auto* p = CreateMaybeMessage<::cockroach::roachpb::Error>(GetArenaNoVirtual()); + error_ = p; + } + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.RangeLookupResponse.error) + return error_; +} +inline void RangeLookupResponse::set_allocated_error(::cockroach::roachpb::Error* error) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == NULL) { + delete reinterpret_cast< ::google::protobuf::MessageLite*>(error_); + } + if (error) { + ::google::protobuf::Arena* submessage_arena = NULL; + if (message_arena != submessage_arena) { + error = ::google::protobuf::internal::GetOwnedMessage( + message_arena, error, submessage_arena); + } + + } else { + + } + error_ = error; + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.RangeLookupResponse.error) +} + +// ------------------------------------------------------------------- + // RangeFeedRequest inline bool RangeFeedRequest::has_header() const { @@ -34667,6 +35411,284 @@ inline void RangeFeedEvent::set_allocated_error(::cockroach::roachpb::RangeFeedE // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.RangeFeedEvent.error) } +// ------------------------------------------------------------------- + +// GossipSubscriptionRequest + +// repeated string patterns = 1; +inline int GossipSubscriptionRequest::patterns_size() const { + return patterns_.size(); +} +inline void GossipSubscriptionRequest::clear_patterns() { + patterns_.Clear(); +} +inline const ::std::string& GossipSubscriptionRequest::patterns(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.GossipSubscriptionRequest.patterns) + return patterns_.Get(index); +} +inline ::std::string* GossipSubscriptionRequest::mutable_patterns(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.GossipSubscriptionRequest.patterns) + return patterns_.Mutable(index); +} +inline void GossipSubscriptionRequest::set_patterns(int index, const ::std::string& value) { + // @@protoc_insertion_point(field_set:cockroach.roachpb.GossipSubscriptionRequest.patterns) + patterns_.Mutable(index)->assign(value); +} +#if LANG_CXX11 +inline void GossipSubscriptionRequest::set_patterns(int index, ::std::string&& value) { + // @@protoc_insertion_point(field_set:cockroach.roachpb.GossipSubscriptionRequest.patterns) + patterns_.Mutable(index)->assign(std::move(value)); +} +#endif +inline void GossipSubscriptionRequest::set_patterns(int index, const char* value) { + GOOGLE_DCHECK(value != NULL); + patterns_.Mutable(index)->assign(value); + // @@protoc_insertion_point(field_set_char:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +inline void GossipSubscriptionRequest::set_patterns(int index, const char* value, size_t size) { + patterns_.Mutable(index)->assign( + reinterpret_cast(value), size); + // @@protoc_insertion_point(field_set_pointer:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +inline ::std::string* GossipSubscriptionRequest::add_patterns() { + // @@protoc_insertion_point(field_add_mutable:cockroach.roachpb.GossipSubscriptionRequest.patterns) + return patterns_.Add(); +} +inline void GossipSubscriptionRequest::add_patterns(const ::std::string& value) { + patterns_.Add()->assign(value); + // @@protoc_insertion_point(field_add:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +#if LANG_CXX11 +inline void GossipSubscriptionRequest::add_patterns(::std::string&& value) { + patterns_.Add(std::move(value)); + // @@protoc_insertion_point(field_add:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +#endif +inline void GossipSubscriptionRequest::add_patterns(const char* value) { + GOOGLE_DCHECK(value != NULL); + patterns_.Add()->assign(value); + // @@protoc_insertion_point(field_add_char:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +inline void GossipSubscriptionRequest::add_patterns(const char* value, size_t size) { + patterns_.Add()->assign(reinterpret_cast(value), size); + // @@protoc_insertion_point(field_add_pointer:cockroach.roachpb.GossipSubscriptionRequest.patterns) +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +GossipSubscriptionRequest::patterns() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.GossipSubscriptionRequest.patterns) + return patterns_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +GossipSubscriptionRequest::mutable_patterns() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.GossipSubscriptionRequest.patterns) + return &patterns_; +} + +// ------------------------------------------------------------------- + +// GossipSubscriptionEvent + +// string key = 1; +inline void GossipSubscriptionEvent::clear_key() { + key_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline const ::std::string& GossipSubscriptionEvent::key() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.GossipSubscriptionEvent.key) + return key_.GetNoArena(); +} +inline void GossipSubscriptionEvent::set_key(const ::std::string& value) { + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:cockroach.roachpb.GossipSubscriptionEvent.key) +} +#if LANG_CXX11 +inline void GossipSubscriptionEvent::set_key(::std::string&& value) { + + key_.SetNoArena( + &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:cockroach.roachpb.GossipSubscriptionEvent.key) +} +#endif +inline void GossipSubscriptionEvent::set_key(const char* value) { + GOOGLE_DCHECK(value != NULL); + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:cockroach.roachpb.GossipSubscriptionEvent.key) +} +inline void GossipSubscriptionEvent::set_key(const char* value, size_t size) { + + key_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:cockroach.roachpb.GossipSubscriptionEvent.key) +} +inline ::std::string* GossipSubscriptionEvent::mutable_key() { + + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.GossipSubscriptionEvent.key) + return key_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline ::std::string* GossipSubscriptionEvent::release_key() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.GossipSubscriptionEvent.key) + + return key_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline void GossipSubscriptionEvent::set_allocated_key(::std::string* key) { + if (key != NULL) { + + } else { + + } + key_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), key); + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.GossipSubscriptionEvent.key) +} + +inline bool GossipSubscriptionEvent::has_content() const { + return this != internal_default_instance() && content_ != NULL; +} +inline const ::cockroach::roachpb::Value& GossipSubscriptionEvent::_internal_content() const { + return *content_; +} +inline const ::cockroach::roachpb::Value& GossipSubscriptionEvent::content() const { + const ::cockroach::roachpb::Value* p = content_; + // @@protoc_insertion_point(field_get:cockroach.roachpb.GossipSubscriptionEvent.content) + return p != NULL ? *p : *reinterpret_cast( + &::cockroach::roachpb::_Value_default_instance_); +} +inline ::cockroach::roachpb::Value* GossipSubscriptionEvent::release_content() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.GossipSubscriptionEvent.content) + + ::cockroach::roachpb::Value* temp = content_; + content_ = NULL; + return temp; +} +inline ::cockroach::roachpb::Value* GossipSubscriptionEvent::mutable_content() { + + if (content_ == NULL) { + auto* p = CreateMaybeMessage<::cockroach::roachpb::Value>(GetArenaNoVirtual()); + content_ = p; + } + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.GossipSubscriptionEvent.content) + return content_; +} +inline void GossipSubscriptionEvent::set_allocated_content(::cockroach::roachpb::Value* content) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == NULL) { + delete reinterpret_cast< ::google::protobuf::MessageLite*>(content_); + } + if (content) { + ::google::protobuf::Arena* submessage_arena = NULL; + if (message_arena != submessage_arena) { + content = ::google::protobuf::internal::GetOwnedMessage( + message_arena, content, submessage_arena); + } + + } else { + + } + content_ = content; + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.GossipSubscriptionEvent.content) +} + +// string pattern_matched = 3; +inline void GossipSubscriptionEvent::clear_pattern_matched() { + pattern_matched_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline const ::std::string& GossipSubscriptionEvent::pattern_matched() const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) + return pattern_matched_.GetNoArena(); +} +inline void GossipSubscriptionEvent::set_pattern_matched(const ::std::string& value) { + + pattern_matched_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value); + // @@protoc_insertion_point(field_set:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) +} +#if LANG_CXX11 +inline void GossipSubscriptionEvent::set_pattern_matched(::std::string&& value) { + + pattern_matched_.SetNoArena( + &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value)); + // @@protoc_insertion_point(field_set_rvalue:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) +} +#endif +inline void GossipSubscriptionEvent::set_pattern_matched(const char* value) { + GOOGLE_DCHECK(value != NULL); + + pattern_matched_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value)); + // @@protoc_insertion_point(field_set_char:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) +} +inline void GossipSubscriptionEvent::set_pattern_matched(const char* value, size_t size) { + + pattern_matched_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), + ::std::string(reinterpret_cast(value), size)); + // @@protoc_insertion_point(field_set_pointer:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) +} +inline ::std::string* GossipSubscriptionEvent::mutable_pattern_matched() { + + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) + return pattern_matched_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline ::std::string* GossipSubscriptionEvent::release_pattern_matched() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) + + return pattern_matched_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited()); +} +inline void GossipSubscriptionEvent::set_allocated_pattern_matched(::std::string* pattern_matched) { + if (pattern_matched != NULL) { + + } else { + + } + pattern_matched_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), pattern_matched); + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.GossipSubscriptionEvent.pattern_matched) +} + +// .cockroach.roachpb.Error error = 4; +inline bool GossipSubscriptionEvent::has_error() const { + return this != internal_default_instance() && error_ != NULL; +} +inline const ::cockroach::roachpb::Error& GossipSubscriptionEvent::_internal_error() const { + return *error_; +} +inline const ::cockroach::roachpb::Error& GossipSubscriptionEvent::error() const { + const ::cockroach::roachpb::Error* p = error_; + // @@protoc_insertion_point(field_get:cockroach.roachpb.GossipSubscriptionEvent.error) + return p != NULL ? *p : *reinterpret_cast( + &::cockroach::roachpb::_Error_default_instance_); +} +inline ::cockroach::roachpb::Error* GossipSubscriptionEvent::release_error() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.GossipSubscriptionEvent.error) + + ::cockroach::roachpb::Error* temp = error_; + error_ = NULL; + return temp; +} +inline ::cockroach::roachpb::Error* GossipSubscriptionEvent::mutable_error() { + + if (error_ == NULL) { + auto* p = CreateMaybeMessage<::cockroach::roachpb::Error>(GetArenaNoVirtual()); + error_ = p; + } + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.GossipSubscriptionEvent.error) + return error_; +} +inline void GossipSubscriptionEvent::set_allocated_error(::cockroach::roachpb::Error* error) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == NULL) { + delete reinterpret_cast< ::google::protobuf::MessageLite*>(error_); + } + if (error) { + ::google::protobuf::Arena* submessage_arena = NULL; + if (message_arena != submessage_arena) { + error = ::google::protobuf::internal::GetOwnedMessage( + message_arena, error, submessage_arena); + } + + } else { + + } + error_ = error; + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.GossipSubscriptionEvent.error) +} + #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ @@ -34906,6 +35928,14 @@ inline void RangeFeedEvent::set_allocated_error(::cockroach::roachpb::RangeFeedE // ------------------------------------------------------------------- +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + +// ------------------------------------------------------------------- + // @@protoc_insertion_point(namespace_scope) diff --git a/pkg/gossip/gossip.go b/pkg/gossip/gossip.go index 278304c0e966..b84a9ac104c9 100644 --- a/pkg/gossip/gossip.go +++ b/pkg/gossip/gossip.go @@ -1151,19 +1151,18 @@ func (g *Gossip) GetSystemConfig() *config.SystemConfig { // system config. It is notified after registration (if a system config is // already set), and whenever a new system config is successfully unmarshaled. func (g *Gossip) RegisterSystemConfigChannel() <-chan struct{} { - g.systemConfigMu.Lock() - defer g.systemConfigMu.Unlock() - // Create channel that receives new system config notifications. // The channel has a size of 1 to prevent gossip from blocking on it. c := make(chan struct{}, 1) - g.systemConfigChannels = append(g.systemConfigChannels, c) // Notify the channel right away if we have a config. if g.systemConfig != nil { c <- struct{}{} } + g.systemConfigMu.Lock() + g.systemConfigChannels = append(g.systemConfigChannels, c) + g.systemConfigMu.Unlock() return c } diff --git a/pkg/gossip/infostore.go b/pkg/gossip/infostore.go index d1ec956fc459..85ca4f6895ec 100644 --- a/pkg/gossip/infostore.go +++ b/pkg/gossip/infostore.go @@ -310,6 +310,7 @@ func (is *infoStore) registerCallback( if targetCB == cb { numCBs := len(is.callbacks) is.callbacks[i] = is.callbacks[numCBs-1] + is.callbacks[numCBs-1] = nil // for GC is.callbacks = is.callbacks[:numCBs-1] break } diff --git a/pkg/kv/kvclient/kvcoord/send_test.go b/pkg/kv/kvclient/kvcoord/send_test.go index dbf02693a040..443dc28b8a21 100644 --- a/pkg/kv/kvclient/kvcoord/send_test.go +++ b/pkg/kv/kvclient/kvcoord/send_test.go @@ -45,10 +45,22 @@ func (n Node) Batch( return &roachpb.BatchResponse{}, nil } +func (n Node) RangeLookup( + _ context.Context, _ *roachpb.RangeLookupRequest, +) (*roachpb.RangeLookupResponse, error) { + panic("unimplemented") +} + func (n Node) RangeFeed(_ *roachpb.RangeFeedRequest, _ roachpb.Internal_RangeFeedServer) error { panic("unimplemented") } +func (n Node) GossipSubscription( + _ *roachpb.GossipSubscriptionRequest, _ roachpb.Internal_GossipSubscriptionServer, +) error { + panic("unimplemented") +} + // TestSendToOneClient verifies that Send correctly sends a request // to one server using the heartbeat RPC. func TestSendToOneClient(t *testing.T) { diff --git a/pkg/kv/kvclient/kvcoord/transport_test.go b/pkg/kv/kvclient/kvcoord/transport_test.go index 47d04ad3ef65..691dd597ada4 100644 --- a/pkg/kv/kvclient/kvcoord/transport_test.go +++ b/pkg/kv/kvclient/kvcoord/transport_test.go @@ -162,9 +162,23 @@ func (m *mockInternalClient) Batch( return br, nil } +// RangeLookup implements the roachpb.InternalClient interface. +func (m *mockInternalClient) RangeLookup( + ctx context.Context, rl *roachpb.RangeLookupRequest, _ ...grpc.CallOption, +) (*roachpb.RangeLookupResponse, error) { + return nil, fmt.Errorf("unsupported RangeLookup call") +} + // RangeFeed is part of the roachpb.InternalClient interface. func (m *mockInternalClient) RangeFeed( ctx context.Context, in *roachpb.RangeFeedRequest, opts ...grpc.CallOption, ) (roachpb.Internal_RangeFeedClient, error) { return nil, fmt.Errorf("unsupported RangeFeed call") } + +// GossipSubscription is part of the roachpb.InternalClient interface. +func (m *mockInternalClient) GossipSubscription( + ctx context.Context, args *roachpb.GossipSubscriptionRequest, _ ...grpc.CallOption, +) (roachpb.Internal_GossipSubscriptionClient, error) { + return nil, fmt.Errorf("unsupported GossipSubscripion call") +} diff --git a/pkg/kv/kvclient/kvtenant/proxy.go b/pkg/kv/kvclient/kvtenant/proxy.go new file mode 100644 index 000000000000..aeb15f6f9d4c --- /dev/null +++ b/pkg/kv/kvclient/kvtenant/proxy.go @@ -0,0 +1,324 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +// Package kvtenant provides utilities required by SQL-only tenant processes in +// order to interact with the key-value layer. +package kvtenant + +import ( + "context" + "io" + "math/rand" + "time" + + "github.com/cockroachdb/cockroach/pkg/gossip" + "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord" + "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/rpc" + "github.com/cockroachdb/cockroach/pkg/util/contextutil" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/retry" + "github.com/cockroachdb/cockroach/pkg/util/syncutil" + "github.com/cockroachdb/cockroach/pkg/util/syncutil/singleflight" + "github.com/cockroachdb/errors" + "google.golang.org/grpc" +) + +// Proxy mediates the communication of cluster-wide state to sandboxed SQL-only +// tenant processes through a restricted interface. A Proxy is seeded with a set +// of one or more network addresses that reference existing KV nodes in the +// cluster (or a load-balancer which fans out to some/all KV nodes). On startup, +// it establishes contact with one of these nodes to learn about the topology of +// the cluster and bootstrap the rest of SQL <-> KV network communication. +// +// See below for the Proxy's roles. +type Proxy struct { + log.AmbientContext + + rpcContext *rpc.Context + rpcRetryOptions retry.Options + rpcDialTimeout time.Duration // for testing + rpcDial singleflight.Group + addrs []string + startupC chan struct{} + + mu syncutil.RWMutex + client roachpb.InternalClient + nodeDescs map[roachpb.NodeID]*roachpb.NodeDescriptor +} + +// Proxy is capable of providing information on each of the KV nodes in the +// cluster in the form of NodeDescriptors. This obviates the need for SQL-only +// tenant processes to join the cluster-wide gossip network. +var _ kvcoord.NodeDescStore = (*Proxy)(nil) + +// Proxy is capable of providing Range addressing information in the form of +// RangeDescriptors through delegated RangeLookup requests. This is necessary +// because SQL-only tenants are restricted from reading Range Metadata keys +// directly. Instead, the RangeLookup requests are proxied through existing KV +// nodes while being subject to additional validation (e.g. is the Range being +// requested owned by the requesting tenant?). +var _ kvcoord.RangeDescriptorDB = (*Proxy)(nil) + +// NewProxy creates a new Proxy. +func NewProxy( + ac log.AmbientContext, rpcContext *rpc.Context, rpcRetryOptions retry.Options, addrs []string, +) *Proxy { + ac.AddLogTag("tenant-proxy", nil) + return &Proxy{ + AmbientContext: ac, + rpcContext: rpcContext, + rpcRetryOptions: rpcRetryOptions, + addrs: addrs, + startupC: make(chan struct{}), + nodeDescs: make(map[roachpb.NodeID]*roachpb.NodeDescriptor), + } +} + +// Start launches the proxy's worker thread and waits for it to receive an +// initial GossipSubscription event. +func (p *Proxy) Start(ctx context.Context) error { + startupC := p.startupC + p.rpcContext.Stopper.RunWorker(context.Background(), func(ctx context.Context) { + ctx = p.AnnotateCtx(ctx) + ctx, cancel := p.rpcContext.Stopper.WithCancelOnQuiesce(ctx) + defer cancel() + p.runGossipSubscription(ctx) + }) + // Synchronously block until the first GossipSubscription event. + select { + case <-startupC: + return nil + case <-ctx.Done(): + return ctx.Err() + } +} + +func (p *Proxy) runGossipSubscription(ctx context.Context) { + for ctx.Err() == nil { + client, err := p.getClient(ctx) + if err != nil { + continue + } + stream, err := client.GossipSubscription(ctx, &roachpb.GossipSubscriptionRequest{ + Patterns: gossipSubsPatterns, + }) + if err != nil { + log.Warningf(ctx, "error issuing GossipSubscription RPC: %v", err) + p.tryForgetClient(ctx, client) + continue + } + for { + e, err := stream.Recv() + if err != nil { + if err == io.EOF { + break + } + // Soft RPC error. Drop client and retry. + log.Warningf(ctx, "error consuming GossipSubscription RPC: %v", err) + p.tryForgetClient(ctx, client) + break + } + if e.Error != nil { + // Hard logical error. We expect io.EOF next. + log.Errorf(ctx, "error consuming GossipSubscription RPC: %v", e.Error) + continue + } + handler, ok := gossipSubsHandlers[e.PatternMatched] + if !ok { + log.Errorf(ctx, "unknown GossipSubscription pattern: %q", e.PatternMatched) + continue + } + handler(p, ctx, e.Key, e.Content) + if p.startupC != nil { + close(p.startupC) + p.startupC = nil + } + } + } +} + +var gossipSubsHandlers = map[string]func(*Proxy, context.Context, string, roachpb.Value){ + // Subscribe to all *NodeDescriptor updates in the gossip network. + gossip.MakePrefixPattern(gossip.KeyNodeIDPrefix): (*Proxy).updateNodeAddress, + // TODO(nvanbenschoten): subscribe to updates to the tenant zones key. +} + +var gossipSubsPatterns = func() []string { + patterns := make([]string, 0, len(gossipSubsHandlers)) + for pattern := range gossipSubsHandlers { + patterns = append(patterns, pattern) + } + return patterns +}() + +// updateNodeAddress handles updates to "node" gossip keys, performing the +// corresponding update to the Proxy's cached NodeDescriptor set. It contains +// similar logic to Gossip.updateNodeAddress. +func (p *Proxy) updateNodeAddress(ctx context.Context, key string, content roachpb.Value) { + var desc roachpb.NodeDescriptor + if err := content.GetProto(&desc); err != nil { + log.Errorf(ctx, "%v", err) + return + } + + p.mu.Lock() + defer p.mu.Unlock() + if desc.NodeID == 0 || desc.Address.IsEmpty() { + nodeID, err := gossip.NodeIDFromKey(key, gossip.KeyNodeIDPrefix) + if err != nil { + log.Errorf(ctx, "unable to update node address for removed node: %s", err) + return + } + delete(p.nodeDescs, nodeID) + } else { + p.nodeDescs[desc.NodeID] = &desc + } +} + +// GetNodeDescriptor implements the kvcoord.NodeDescStore interface. +func (p *Proxy) GetNodeDescriptor(nodeID roachpb.NodeID) (*roachpb.NodeDescriptor, error) { + p.mu.RLock() + defer p.mu.RUnlock() + desc, ok := p.nodeDescs[nodeID] + if !ok { + return nil, errors.Errorf("unable to look up descriptor for n%d", nodeID) + } + return desc, nil +} + +// RangeLookup implements the kvcoord.RangeDescriptorDB interface. +func (p *Proxy) RangeLookup( + ctx context.Context, key roachpb.RKey, useReverseScan bool, +) ([]roachpb.RangeDescriptor, []roachpb.RangeDescriptor, error) { + // Proxy range lookup requests through the Internal service. + ctx = p.AnnotateCtx(ctx) + for ctx.Err() == nil { + client, err := p.getClient(ctx) + if err != nil { + continue + } + resp, err := client.RangeLookup(ctx, &roachpb.RangeLookupRequest{ + Key: key, + // We perform the range lookup scan with a READ_UNCOMMITTED consistency + // level because we want the scan to return intents as well as committed + // values. The reason for this is because it's not clear whether the + // intent or the previous value points to the correct location of the + // Range. It gets even more complicated when there are split-related + // intents or a txn record co-located with a replica involved in the + // split. Since we cannot know the correct answer, we lookup both the + // pre- and post- transaction values. + ReadConsistency: roachpb.READ_UNCOMMITTED, + // Until we add protection in the Internal service implementation to + // prevent prefetching from traversing into RangeDescriptors owned by + // other tenants, we must disable prefetching. + PrefetchNum: 0, + PrefetchReverse: useReverseScan, + }) + if err != nil { + // Soft RPC error. Drop client and retry. + log.Warningf(ctx, "error issuing RangeLookup RPC: %v", err) + p.tryForgetClient(ctx, client) + continue + } + if resp.Error != nil { + // Hard logical error. + return nil, nil, resp.Error.GoError() + } + return resp.Descriptors, resp.PrefetchedDescriptors, nil + } + return nil, nil, ctx.Err() +} + +// FirstRange implements the kvcoord.RangeDescriptorDB interface. +func (p *Proxy) FirstRange() (*roachpb.RangeDescriptor, error) { + return nil, errors.New("kvtenant.Proxy does not have access to FirstRange") +} + +// getClient returns the singleton InternalClient if one is currently active. If +// not, the method attempts to dial one of the configured addresses. The method +// blocks until either a connection is successfully established or the provided +// context is canceled. +func (p *Proxy) getClient(ctx context.Context) (roachpb.InternalClient, error) { + p.mu.RLock() + if c := p.client; c != nil { + p.mu.RUnlock() + return c, nil + } + ch, _ := p.rpcDial.DoChan("dial", func() (interface{}, error) { + dialCtx := p.AnnotateCtx(context.Background()) + dialCtx, cancel := p.rpcContext.Stopper.WithCancelOnQuiesce(dialCtx) + defer cancel() + err := p.rpcContext.Stopper.RunTaskWithErr(dialCtx, "kvtenant.Proxy: dial", p.dialAddrs) + if err != nil { + return nil, err + } + // NB: read lock not needed. + return p.client, nil + }) + p.mu.RUnlock() + + select { + case res := <-ch: + if res.Err != nil { + return nil, res.Err + } + return res.Val.(roachpb.InternalClient), nil + case <-ctx.Done(): + return nil, ctx.Err() + } +} + +// dialAddrs attempts to dial each of the configured addresses in a retry loop. +// The method will only return a non-nil error on context cancellation. +func (p *Proxy) dialAddrs(ctx context.Context) error { + for r := retry.StartWithCtx(ctx, p.rpcRetryOptions); r.Next(); { + // Try each address on each retry iteration. + randStart := rand.Intn(len(p.addrs)) + for i := range p.addrs { + addr := p.addrs[(i+randStart)%len(p.addrs)] + conn, err := p.dialAddr(ctx, addr) + if err != nil { + log.Warningf(ctx, "error dialing tenant KV address %s: %v", addr, err) + continue + } + client := roachpb.NewInternalClient(conn) + p.mu.Lock() + p.client = client + p.mu.Unlock() + return nil + } + } + return ctx.Err() +} + +func (p *Proxy) dialAddr(ctx context.Context, addr string) (conn *grpc.ClientConn, err error) { + if p.rpcDialTimeout == 0 { + return p.rpcContext.GRPCUnvalidatedDial(addr).Connect(ctx) + } + err = contextutil.RunWithTimeout(ctx, "dial addr", p.rpcDialTimeout, func(ctx context.Context) error { + conn, err = p.rpcContext.GRPCUnvalidatedDial(addr).Connect(ctx) + return err + }) + return conn, err +} + +func (p *Proxy) tryForgetClient(ctx context.Context, c roachpb.InternalClient) { + if ctx.Err() != nil { + // Error (may be) due to context. Don't forget client. + return + } + // Compare-and-swap to avoid thrashing. + p.mu.Lock() + defer p.mu.Unlock() + if p.client == c { + p.client = nil + } +} diff --git a/pkg/kv/kvclient/kvtenant/proxy_test.go b/pkg/kv/kvclient/kvtenant/proxy_test.go new file mode 100644 index 000000000000..4238b16cd68c --- /dev/null +++ b/pkg/kv/kvclient/kvtenant/proxy_test.go @@ -0,0 +1,316 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package kvtenant + +import ( + "context" + "net" + "testing" + "time" + + "github.com/cockroachdb/cockroach/pkg/gossip" + "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/rpc" + "github.com/cockroachdb/cockroach/pkg/testutils" + "github.com/cockroachdb/cockroach/pkg/util" + "github.com/cockroachdb/cockroach/pkg/util/hlc" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/cockroachdb/cockroach/pkg/util/log" + "github.com/cockroachdb/cockroach/pkg/util/netutil" + "github.com/cockroachdb/cockroach/pkg/util/protoutil" + "github.com/cockroachdb/cockroach/pkg/util/retry" + "github.com/cockroachdb/cockroach/pkg/util/stop" + "github.com/cockroachdb/cockroach/pkg/util/tracing" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var rpcRetryOpts = retry.Options{ + InitialBackoff: 1 * time.Microsecond, + MaxBackoff: 4 * time.Microsecond, +} + +type mockServer struct { + rangeLookupFn func(context.Context, *roachpb.RangeLookupRequest) (*roachpb.RangeLookupResponse, error) + gossipSubFn func(*roachpb.GossipSubscriptionRequest, roachpb.Internal_GossipSubscriptionServer) error +} + +func (m *mockServer) RangeLookup( + ctx context.Context, req *roachpb.RangeLookupRequest, +) (*roachpb.RangeLookupResponse, error) { + return m.rangeLookupFn(ctx, req) +} + +func (m *mockServer) GossipSubscription( + req *roachpb.GossipSubscriptionRequest, stream roachpb.Internal_GossipSubscriptionServer, +) error { + return m.gossipSubFn(req, stream) +} + +func (*mockServer) Batch(context.Context, *roachpb.BatchRequest) (*roachpb.BatchResponse, error) { + panic("unimplemented") +} + +func (*mockServer) RangeFeed(*roachpb.RangeFeedRequest, roachpb.Internal_RangeFeedServer) error { + panic("unimplemented") +} + +func gossipEventForNodeDesc(desc *roachpb.NodeDescriptor) *roachpb.GossipSubscriptionEvent { + val, err := protoutil.Marshal(desc) + if err != nil { + panic(err) + } + return &roachpb.GossipSubscriptionEvent{ + Key: gossip.MakeNodeIDKey(desc.NodeID), + Content: roachpb.MakeValueFromBytesAndTimestamp(val, hlc.Timestamp{}), + PatternMatched: gossip.MakePrefixPattern(gossip.KeyNodeIDPrefix), + } +} + +func waitForNodeDesc(t *testing.T, p *Proxy, nodeID roachpb.NodeID) { + t.Helper() + testutils.SucceedsSoon(t, func() error { + _, err := p.GetNodeDescriptor(nodeID) + return err + }) +} + +// TestProxyGossipSubscription tests Proxy's role as a kvcoord.NodeDescStore. +func TestProxyGossipSubscription(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + stopper := stop.NewStopper() + defer stopper.Stop(ctx) + clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) + rpcContext := rpc.NewInsecureTestingContext(clock, stopper) + s := rpc.NewServer(rpcContext) + + gossipSubC := make(chan *roachpb.GossipSubscriptionEvent) + defer close(gossipSubC) + gossipSubFn := func(req *roachpb.GossipSubscriptionRequest, stream roachpb.Internal_GossipSubscriptionServer) error { + assert.Len(t, req.Patterns, 1) + assert.Equal(t, "node:.*", req.Patterns[0]) + for gossipSub := range gossipSubC { + if err := stream.Send(gossipSub); err != nil { + return err + } + } + return nil + } + roachpb.RegisterInternalServer(s, &mockServer{gossipSubFn: gossipSubFn}) + ln, err := netutil.ListenAndServeGRPC(stopper, s, util.TestAddr) + require.NoError(t, err) + + addrs := []string{ln.Addr().String()} + p := NewProxy(log.AmbientContext{Tracer: tracing.NewTracer()}, rpcContext, rpcRetryOpts, addrs) + + // Start should block until the first GossipSubscription response. + startedC := make(chan error) + go func() { + startedC <- p.Start(ctx) + }() + select { + case err := <-startedC: + t.Fatalf("Start unexpectedly completed with err=%v", err) + case <-time.After(10 * time.Millisecond): + } + + // Return first GossipSubscription response. + node1 := &roachpb.NodeDescriptor{NodeID: 1, Address: util.MakeUnresolvedAddr("tcp", "1.1.1.1")} + node2 := &roachpb.NodeDescriptor{NodeID: 2, Address: util.MakeUnresolvedAddr("tcp", "2.2.2.2")} + gossipSubC <- gossipEventForNodeDesc(node1) + gossipSubC <- gossipEventForNodeDesc(node2) + require.NoError(t, <-startedC) + + // Test kvcoord.NodeDescStore impl. Wait for full update first. + waitForNodeDesc(t, p, 2) + desc, err := p.GetNodeDescriptor(1) + require.Equal(t, node1, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(2) + require.Equal(t, node2, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(3) + require.Nil(t, desc) + require.Regexp(t, "unable to look up descriptor for n3", err) + + // Return updated GossipSubscription response. + node1Up := &roachpb.NodeDescriptor{NodeID: 1, Address: util.MakeUnresolvedAddr("tcp", "1.2.3.4")} + node3 := &roachpb.NodeDescriptor{NodeID: 3, Address: util.MakeUnresolvedAddr("tcp", "2.2.2.2")} + gossipSubC <- gossipEventForNodeDesc(node1Up) + gossipSubC <- gossipEventForNodeDesc(node3) + + // Test kvcoord.NodeDescStore impl. Wait for full update first. + waitForNodeDesc(t, p, 3) + desc, err = p.GetNodeDescriptor(1) + require.Equal(t, node1Up, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(2) + require.Equal(t, node2, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(3) + require.Equal(t, node3, desc) + require.NoError(t, err) +} + +// TestProxyGossipSubscription tests Proxy's role as a kvcoord.RangeDescriptorDB. +func TestProxyRangeLookup(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + stopper := stop.NewStopper() + defer stopper.Stop(ctx) + clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) + rpcContext := rpc.NewInsecureTestingContext(clock, stopper) + s := rpc.NewServer(rpcContext) + + rangeLookupRespC := make(chan *roachpb.RangeLookupResponse, 1) + rangeLookupFn := func(_ context.Context, req *roachpb.RangeLookupRequest) (*roachpb.RangeLookupResponse, error) { + // Validate request. + assert.Equal(t, roachpb.RKey("a"), req.Key) + assert.Equal(t, roachpb.READ_UNCOMMITTED, req.ReadConsistency) + assert.Equal(t, int64(0), req.PrefetchNum) + assert.Equal(t, false, req.PrefetchReverse) + + // Respond. + return <-rangeLookupRespC, nil + } + server := &mockServer{rangeLookupFn: rangeLookupFn} + roachpb.RegisterInternalServer(s, server) + ln, err := netutil.ListenAndServeGRPC(stopper, s, util.TestAddr) + require.NoError(t, err) + + addrs := []string{ln.Addr().String()} + p := NewProxy(log.AmbientContext{Tracer: tracing.NewTracer()}, rpcContext, rpcRetryOpts, addrs) + // NOTE: we don't actually start the proxy worker. That's ok, as + // RangeDescriptorDB methods don't require it to be running. + + // Success case. + descs := []roachpb.RangeDescriptor{{RangeID: 1}, {RangeID: 2}} + preDescs := []roachpb.RangeDescriptor{{RangeID: 3}, {RangeID: 4}} + rangeLookupRespC <- &roachpb.RangeLookupResponse{ + Descriptors: descs, PrefetchedDescriptors: preDescs, + } + resDescs, resPreDescs, err := p.RangeLookup(ctx, roachpb.RKey("a"), false /* useReverseScan */) + require.Equal(t, descs, resDescs) + require.Equal(t, preDescs, resPreDescs) + require.NoError(t, err) + + // Error case. + rangeLookupRespC <- &roachpb.RangeLookupResponse{ + Error: roachpb.NewErrorf("hit error"), + } + resDescs, resPreDescs, err = p.RangeLookup(ctx, roachpb.RKey("a"), false /* useReverseScan */) + require.Nil(t, resDescs) + require.Nil(t, resPreDescs) + require.Regexp(t, "hit error", err) + + // Context cancelation. + canceledCtx, cancel := context.WithCancel(ctx) + blockingC := make(chan struct{}) + server.rangeLookupFn = func(ctx context.Context, _ *roachpb.RangeLookupRequest) (*roachpb.RangeLookupResponse, error) { + <-blockingC + <-ctx.Done() + return nil, ctx.Err() + } + go func() { + blockingC <- struct{}{} + cancel() + }() + resDescs, resPreDescs, err = p.RangeLookup(canceledCtx, roachpb.RKey("a"), false /* useReverseScan */) + require.Nil(t, resDescs) + require.Nil(t, resPreDescs) + require.Regexp(t, context.Canceled.Error(), err) + + // FirstRange always returns error. + desc, err := p.FirstRange() + require.Nil(t, desc) + require.Regexp(t, "does not have access to FirstRange", err) +} + +// TestProxyRetriesUnreachable tests that Proxy iterates over each of its +// provided addresses and retries until it is able to establish a connection on +// one of them. +func TestProxyRetriesUnreachable(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + stopper := stop.NewStopper() + defer stopper.Stop(ctx) + + clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) + rpcContext := rpc.NewInsecureTestingContext(clock, stopper) + s := rpc.NewServer(rpcContext) + + node1 := &roachpb.NodeDescriptor{NodeID: 1, Address: util.MakeUnresolvedAddr("tcp", "1.1.1.1")} + node2 := &roachpb.NodeDescriptor{NodeID: 2, Address: util.MakeUnresolvedAddr("tcp", "2.2.2.2")} + gossipSubEvents := []*roachpb.GossipSubscriptionEvent{ + gossipEventForNodeDesc(node1), + gossipEventForNodeDesc(node2), + } + gossipSubFn := func(req *roachpb.GossipSubscriptionRequest, stream roachpb.Internal_GossipSubscriptionServer) error { + assert.Len(t, req.Patterns, 1) + assert.Equal(t, "node:.*", req.Patterns[0]) + for _, event := range gossipSubEvents { + if err := stream.Send(event); err != nil { + return err + } + } + <-stream.Context().Done() + return stream.Context().Err() + } + roachpb.RegisterInternalServer(s, &mockServer{gossipSubFn: gossipSubFn}) + // Decompose netutil.ListenAndServeGRPC so we can listen before serving. + ln, err := net.Listen(util.TestAddr.Network(), util.TestAddr.String()) + require.NoError(t, err) + stopper.RunWorker(ctx, func(context.Context) { + <-stopper.ShouldQuiesce() + netutil.FatalIfUnexpected(ln.Close()) + <-stopper.ShouldStop() + s.Stop() + }) + + // Add listen address into list of other bogus addresses. + addrs := []string{"1.1.1.1:9999", ln.Addr().String(), "2.2.2.2:9999"} + p := NewProxy(log.AmbientContext{Tracer: tracing.NewTracer()}, rpcContext, rpcRetryOpts, addrs) + p.rpcDialTimeout = 5 * time.Millisecond // speed up test + + // Start should block until the first GossipSubscription response. + startedC := make(chan error) + go func() { + startedC <- p.Start(ctx) + }() + select { + case err := <-startedC: + t.Fatalf("Start unexpectedly completed with err=%v", err) + case <-time.After(25 * time.Millisecond): + } + + // Begin serving on gRPC server. Proxy should quickly connect + // and complete startup. + stopper.RunWorker(ctx, func(context.Context) { + netutil.FatalIfUnexpected(s.Serve(ln)) + }) + require.NoError(t, <-startedC) + + // Test kvcoord.NodeDescStore impl. Wait for full update first. + waitForNodeDesc(t, p, 2) + desc, err := p.GetNodeDescriptor(1) + require.Equal(t, node1, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(2) + require.Equal(t, node2, desc) + require.NoError(t, err) + desc, err = p.GetNodeDescriptor(3) + require.Nil(t, desc) + require.Regexp(t, "unable to look up descriptor for n3", err) +} diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go index 464e61c1b59a..03639205313e 100644 --- a/pkg/roachpb/api.pb.go +++ b/pkg/roachpb/api.pb.go @@ -72,7 +72,7 @@ func (x ReadConsistencyType) String() string { return proto.EnumName(ReadConsistencyType_name, int32(x)) } func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{0} } // ScanFormat is an enumeration of the available response formats for MVCCScan @@ -100,7 +100,7 @@ func (x ScanFormat) String() string { return proto.EnumName(ScanFormat_name, int32(x)) } func (ScanFormat) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{1} + return fileDescriptor_api_a5b93ff81643c6e6, []int{1} } type ChecksumMode int32 @@ -147,7 +147,7 @@ func (x ChecksumMode) String() string { return proto.EnumName(ChecksumMode_name, int32(x)) } func (ChecksumMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{2} + return fileDescriptor_api_a5b93ff81643c6e6, []int{2} } // PushTxnType determines what action to take when pushing a transaction. @@ -178,7 +178,7 @@ func (x PushTxnType) String() string { return proto.EnumName(PushTxnType_name, int32(x)) } func (PushTxnType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{3} + return fileDescriptor_api_a5b93ff81643c6e6, []int{3} } type ExternalStorageProvider int32 @@ -219,7 +219,7 @@ func (x ExternalStorageProvider) String() string { return proto.EnumName(ExternalStorageProvider_name, int32(x)) } func (ExternalStorageProvider) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{4} + return fileDescriptor_api_a5b93ff81643c6e6, []int{4} } type MVCCFilter int32 @@ -242,7 +242,7 @@ func (x MVCCFilter) String() string { return proto.EnumName(MVCCFilter_name, int32(x)) } func (MVCCFilter) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{5} + return fileDescriptor_api_a5b93ff81643c6e6, []int{5} } type ResponseHeader_ResumeReason int32 @@ -268,7 +268,7 @@ func (x ResponseHeader_ResumeReason) String() string { return proto.EnumName(ResponseHeader_ResumeReason_name, int32(x)) } func (ResponseHeader_ResumeReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{1, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{1, 0} } type CheckConsistencyResponse_Status int32 @@ -310,7 +310,7 @@ func (x CheckConsistencyResponse_Status) String() string { return proto.EnumName(CheckConsistencyResponse_Status_name, int32(x)) } func (CheckConsistencyResponse_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{25, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{25, 0} } // RequestHeader is supplied with every storage node request. @@ -331,7 +331,7 @@ func (m *RequestHeader) Reset() { *m = RequestHeader{} } func (m *RequestHeader) String() string { return proto.CompactTextString(m) } func (*RequestHeader) ProtoMessage() {} func (*RequestHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{0} } func (m *RequestHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -398,7 +398,7 @@ func (m *ResponseHeader) Reset() { *m = ResponseHeader{} } func (m *ResponseHeader) String() string { return proto.CompactTextString(m) } func (*ResponseHeader) ProtoMessage() {} func (*ResponseHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{1} + return fileDescriptor_api_a5b93ff81643c6e6, []int{1} } func (m *ResponseHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -432,7 +432,7 @@ func (m *GetRequest) Reset() { *m = GetRequest{} } func (m *GetRequest) String() string { return proto.CompactTextString(m) } func (*GetRequest) ProtoMessage() {} func (*GetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{2} + return fileDescriptor_api_a5b93ff81643c6e6, []int{2} } func (m *GetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -475,7 +475,7 @@ func (m *GetResponse) Reset() { *m = GetResponse{} } func (m *GetResponse) String() string { return proto.CompactTextString(m) } func (*GetResponse) ProtoMessage() {} func (*GetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{3} + return fileDescriptor_api_a5b93ff81643c6e6, []int{3} } func (m *GetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -518,7 +518,7 @@ func (m *PutRequest) Reset() { *m = PutRequest{} } func (m *PutRequest) String() string { return proto.CompactTextString(m) } func (*PutRequest) ProtoMessage() {} func (*PutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{4} + return fileDescriptor_api_a5b93ff81643c6e6, []int{4} } func (m *PutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -552,7 +552,7 @@ func (m *PutResponse) Reset() { *m = PutResponse{} } func (m *PutResponse) String() string { return proto.CompactTextString(m) } func (*PutResponse) ProtoMessage() {} func (*PutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{5} + return fileDescriptor_api_a5b93ff81643c6e6, []int{5} } func (m *PutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +634,7 @@ func (m *ConditionalPutRequest) Reset() { *m = ConditionalPutRequest{} } func (m *ConditionalPutRequest) String() string { return proto.CompactTextString(m) } func (*ConditionalPutRequest) ProtoMessage() {} func (*ConditionalPutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{6} + return fileDescriptor_api_a5b93ff81643c6e6, []int{6} } func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -669,7 +669,7 @@ func (m *ConditionalPutResponse) Reset() { *m = ConditionalPutResponse{} func (m *ConditionalPutResponse) String() string { return proto.CompactTextString(m) } func (*ConditionalPutResponse) ProtoMessage() {} func (*ConditionalPutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{7} + return fileDescriptor_api_a5b93ff81643c6e6, []int{7} } func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -715,7 +715,7 @@ func (m *InitPutRequest) Reset() { *m = InitPutRequest{} } func (m *InitPutRequest) String() string { return proto.CompactTextString(m) } func (*InitPutRequest) ProtoMessage() {} func (*InitPutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{8} + return fileDescriptor_api_a5b93ff81643c6e6, []int{8} } func (m *InitPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -749,7 +749,7 @@ func (m *InitPutResponse) Reset() { *m = InitPutResponse{} } func (m *InitPutResponse) String() string { return proto.CompactTextString(m) } func (*InitPutResponse) ProtoMessage() {} func (*InitPutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{9} + return fileDescriptor_api_a5b93ff81643c6e6, []int{9} } func (m *InitPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -789,7 +789,7 @@ func (m *IncrementRequest) Reset() { *m = IncrementRequest{} } func (m *IncrementRequest) String() string { return proto.CompactTextString(m) } func (*IncrementRequest) ProtoMessage() {} func (*IncrementRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{10} + return fileDescriptor_api_a5b93ff81643c6e6, []int{10} } func (m *IncrementRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -826,7 +826,7 @@ func (m *IncrementResponse) Reset() { *m = IncrementResponse{} } func (m *IncrementResponse) String() string { return proto.CompactTextString(m) } func (*IncrementResponse) ProtoMessage() {} func (*IncrementResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{11} + return fileDescriptor_api_a5b93ff81643c6e6, []int{11} } func (m *IncrementResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -860,7 +860,7 @@ func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRequest) ProtoMessage() {} func (*DeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{12} + return fileDescriptor_api_a5b93ff81643c6e6, []int{12} } func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -894,7 +894,7 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } func (*DeleteResponse) ProtoMessage() {} func (*DeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{13} + return fileDescriptor_api_a5b93ff81643c6e6, []int{13} } func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -946,7 +946,7 @@ func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRangeRequest) ProtoMessage() {} func (*DeleteRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{14} + return fileDescriptor_api_a5b93ff81643c6e6, []int{14} } func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -983,7 +983,7 @@ func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) } func (*DeleteRangeResponse) ProtoMessage() {} func (*DeleteRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{15} + return fileDescriptor_api_a5b93ff81643c6e6, []int{15} } func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1030,7 +1030,7 @@ func (m *ClearRangeRequest) Reset() { *m = ClearRangeRequest{} } func (m *ClearRangeRequest) String() string { return proto.CompactTextString(m) } func (*ClearRangeRequest) ProtoMessage() {} func (*ClearRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{16} + return fileDescriptor_api_a5b93ff81643c6e6, []int{16} } func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1064,7 +1064,7 @@ func (m *ClearRangeResponse) Reset() { *m = ClearRangeResponse{} } func (m *ClearRangeResponse) String() string { return proto.CompactTextString(m) } func (*ClearRangeResponse) ProtoMessage() {} func (*ClearRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{17} + return fileDescriptor_api_a5b93ff81643c6e6, []int{17} } func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1105,7 +1105,7 @@ func (m *RevertRangeRequest) Reset() { *m = RevertRangeRequest{} } func (m *RevertRangeRequest) String() string { return proto.CompactTextString(m) } func (*RevertRangeRequest) ProtoMessage() {} func (*RevertRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{18} + return fileDescriptor_api_a5b93ff81643c6e6, []int{18} } func (m *RevertRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1139,7 +1139,7 @@ func (m *RevertRangeResponse) Reset() { *m = RevertRangeResponse{} } func (m *RevertRangeResponse) String() string { return proto.CompactTextString(m) } func (*RevertRangeResponse) ProtoMessage() {} func (*RevertRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{19} + return fileDescriptor_api_a5b93ff81643c6e6, []int{19} } func (m *RevertRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1190,7 +1190,7 @@ func (m *ScanRequest) Reset() { *m = ScanRequest{} } func (m *ScanRequest) String() string { return proto.CompactTextString(m) } func (*ScanRequest) ProtoMessage() {} func (*ScanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{20} + return fileDescriptor_api_a5b93ff81643c6e6, []int{20} } func (m *ScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1242,7 +1242,7 @@ func (m *ScanResponse) Reset() { *m = ScanResponse{} } func (m *ScanResponse) String() string { return proto.CompactTextString(m) } func (*ScanResponse) ProtoMessage() {} func (*ScanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{21} + return fileDescriptor_api_a5b93ff81643c6e6, []int{21} } func (m *ScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1293,7 @@ func (m *ReverseScanRequest) Reset() { *m = ReverseScanRequest{} } func (m *ReverseScanRequest) String() string { return proto.CompactTextString(m) } func (*ReverseScanRequest) ProtoMessage() {} func (*ReverseScanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{22} + return fileDescriptor_api_a5b93ff81643c6e6, []int{22} } func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1345,7 +1345,7 @@ func (m *ReverseScanResponse) Reset() { *m = ReverseScanResponse{} } func (m *ReverseScanResponse) String() string { return proto.CompactTextString(m) } func (*ReverseScanResponse) ProtoMessage() {} func (*ReverseScanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{23} + return fileDescriptor_api_a5b93ff81643c6e6, []int{23} } func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1398,7 +1398,7 @@ func (m *CheckConsistencyRequest) Reset() { *m = CheckConsistencyRequest func (m *CheckConsistencyRequest) String() string { return proto.CompactTextString(m) } func (*CheckConsistencyRequest) ProtoMessage() {} func (*CheckConsistencyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{24} + return fileDescriptor_api_a5b93ff81643c6e6, []int{24} } func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1435,7 +1435,7 @@ func (m *CheckConsistencyResponse) Reset() { *m = CheckConsistencyRespon func (m *CheckConsistencyResponse) String() string { return proto.CompactTextString(m) } func (*CheckConsistencyResponse) ProtoMessage() {} func (*CheckConsistencyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{25} + return fileDescriptor_api_a5b93ff81643c6e6, []int{25} } func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1479,7 +1479,7 @@ func (m *CheckConsistencyResponse_Result) Reset() { *m = CheckConsistenc func (m *CheckConsistencyResponse_Result) String() string { return proto.CompactTextString(m) } func (*CheckConsistencyResponse_Result) ProtoMessage() {} func (*CheckConsistencyResponse_Result) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{25, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{25, 0} } func (m *CheckConsistencyResponse_Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1527,7 +1527,7 @@ func (m *RecomputeStatsRequest) Reset() { *m = RecomputeStatsRequest{} } func (m *RecomputeStatsRequest) String() string { return proto.CompactTextString(m) } func (*RecomputeStatsRequest) ProtoMessage() {} func (*RecomputeStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{26} + return fileDescriptor_api_a5b93ff81643c6e6, []int{26} } func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1563,7 +1563,7 @@ func (m *RecomputeStatsResponse) Reset() { *m = RecomputeStatsResponse{} func (m *RecomputeStatsResponse) String() string { return proto.CompactTextString(m) } func (*RecomputeStatsResponse) ProtoMessage() {} func (*RecomputeStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{27} + return fileDescriptor_api_a5b93ff81643c6e6, []int{27} } func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1660,7 +1660,7 @@ func (m *EndTxnRequest) Reset() { *m = EndTxnRequest{} } func (m *EndTxnRequest) String() string { return proto.CompactTextString(m) } func (*EndTxnRequest) ProtoMessage() {} func (*EndTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{28} + return fileDescriptor_api_a5b93ff81643c6e6, []int{28} } func (m *EndTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1706,7 +1706,7 @@ func (m *EndTxnResponse) Reset() { *m = EndTxnResponse{} } func (m *EndTxnResponse) String() string { return proto.CompactTextString(m) } func (*EndTxnResponse) ProtoMessage() {} func (*EndTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{29} + return fileDescriptor_api_a5b93ff81643c6e6, []int{29} } func (m *EndTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1767,7 +1767,7 @@ func (m *AdminSplitRequest) Reset() { *m = AdminSplitRequest{} } func (m *AdminSplitRequest) String() string { return proto.CompactTextString(m) } func (*AdminSplitRequest) ProtoMessage() {} func (*AdminSplitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{30} + return fileDescriptor_api_a5b93ff81643c6e6, []int{30} } func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1802,7 +1802,7 @@ func (m *AdminSplitResponse) Reset() { *m = AdminSplitResponse{} } func (m *AdminSplitResponse) String() string { return proto.CompactTextString(m) } func (*AdminSplitResponse) ProtoMessage() {} func (*AdminSplitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{31} + return fileDescriptor_api_a5b93ff81643c6e6, []int{31} } func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1841,7 +1841,7 @@ func (m *AdminUnsplitRequest) Reset() { *m = AdminUnsplitRequest{} } func (m *AdminUnsplitRequest) String() string { return proto.CompactTextString(m) } func (*AdminUnsplitRequest) ProtoMessage() {} func (*AdminUnsplitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{32} + return fileDescriptor_api_a5b93ff81643c6e6, []int{32} } func (m *AdminUnsplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1876,7 @@ func (m *AdminUnsplitResponse) Reset() { *m = AdminUnsplitResponse{} } func (m *AdminUnsplitResponse) String() string { return proto.CompactTextString(m) } func (*AdminUnsplitResponse) ProtoMessage() {} func (*AdminUnsplitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{33} + return fileDescriptor_api_a5b93ff81643c6e6, []int{33} } func (m *AdminUnsplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1919,7 @@ func (m *AdminMergeRequest) Reset() { *m = AdminMergeRequest{} } func (m *AdminMergeRequest) String() string { return proto.CompactTextString(m) } func (*AdminMergeRequest) ProtoMessage() {} func (*AdminMergeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{34} + return fileDescriptor_api_a5b93ff81643c6e6, []int{34} } func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1954,7 +1954,7 @@ func (m *AdminMergeResponse) Reset() { *m = AdminMergeResponse{} } func (m *AdminMergeResponse) String() string { return proto.CompactTextString(m) } func (*AdminMergeResponse) ProtoMessage() {} func (*AdminMergeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{35} + return fileDescriptor_api_a5b93ff81643c6e6, []int{35} } func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1992,7 +1992,7 @@ func (m *AdminTransferLeaseRequest) Reset() { *m = AdminTransferLeaseReq func (m *AdminTransferLeaseRequest) String() string { return proto.CompactTextString(m) } func (*AdminTransferLeaseRequest) ProtoMessage() {} func (*AdminTransferLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{36} + return fileDescriptor_api_a5b93ff81643c6e6, []int{36} } func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2025,7 +2025,7 @@ func (m *AdminTransferLeaseResponse) Reset() { *m = AdminTransferLeaseRe func (m *AdminTransferLeaseResponse) String() string { return proto.CompactTextString(m) } func (*AdminTransferLeaseResponse) ProtoMessage() {} func (*AdminTransferLeaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{37} + return fileDescriptor_api_a5b93ff81643c6e6, []int{37} } func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2060,7 +2060,7 @@ func (m *ReplicationChange) Reset() { *m = ReplicationChange{} } func (m *ReplicationChange) String() string { return proto.CompactTextString(m) } func (*ReplicationChange) ProtoMessage() {} func (*ReplicationChange) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{38} + return fileDescriptor_api_a5b93ff81643c6e6, []int{38} } func (m *ReplicationChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2118,7 +2118,7 @@ func (m *AdminChangeReplicasRequest) Reset() { *m = AdminChangeReplicasR func (m *AdminChangeReplicasRequest) String() string { return proto.CompactTextString(m) } func (*AdminChangeReplicasRequest) ProtoMessage() {} func (*AdminChangeReplicasRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{39} + return fileDescriptor_api_a5b93ff81643c6e6, []int{39} } func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2153,7 +2153,7 @@ func (m *AdminChangeReplicasResponse) Reset() { *m = AdminChangeReplicas func (m *AdminChangeReplicasResponse) String() string { return proto.CompactTextString(m) } func (*AdminChangeReplicasResponse) ProtoMessage() {} func (*AdminChangeReplicasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{40} + return fileDescriptor_api_a5b93ff81643c6e6, []int{40} } func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2190,7 +2190,7 @@ func (m *AdminRelocateRangeRequest) Reset() { *m = AdminRelocateRangeReq func (m *AdminRelocateRangeRequest) String() string { return proto.CompactTextString(m) } func (*AdminRelocateRangeRequest) ProtoMessage() {} func (*AdminRelocateRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{41} + return fileDescriptor_api_a5b93ff81643c6e6, []int{41} } func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2223,7 +2223,7 @@ func (m *AdminRelocateRangeResponse) Reset() { *m = AdminRelocateRangeRe func (m *AdminRelocateRangeResponse) String() string { return proto.CompactTextString(m) } func (*AdminRelocateRangeResponse) ProtoMessage() {} func (*AdminRelocateRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{42} + return fileDescriptor_api_a5b93ff81643c6e6, []int{42} } func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2262,7 +2262,7 @@ func (m *HeartbeatTxnRequest) Reset() { *m = HeartbeatTxnRequest{} } func (m *HeartbeatTxnRequest) String() string { return proto.CompactTextString(m) } func (*HeartbeatTxnRequest) ProtoMessage() {} func (*HeartbeatTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{43} + return fileDescriptor_api_a5b93ff81643c6e6, []int{43} } func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2299,7 +2299,7 @@ func (m *HeartbeatTxnResponse) Reset() { *m = HeartbeatTxnResponse{} } func (m *HeartbeatTxnResponse) String() string { return proto.CompactTextString(m) } func (*HeartbeatTxnResponse) ProtoMessage() {} func (*HeartbeatTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{44} + return fileDescriptor_api_a5b93ff81643c6e6, []int{44} } func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2337,7 +2337,7 @@ func (m *GCRequest) Reset() { *m = GCRequest{} } func (m *GCRequest) String() string { return proto.CompactTextString(m) } func (*GCRequest) ProtoMessage() {} func (*GCRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{45} + return fileDescriptor_api_a5b93ff81643c6e6, []int{45} } func (m *GCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2371,7 +2371,7 @@ func (m *GCRequest_GCKey) Reset() { *m = GCRequest_GCKey{} } func (m *GCRequest_GCKey) String() string { return proto.CompactTextString(m) } func (*GCRequest_GCKey) ProtoMessage() {} func (*GCRequest_GCKey) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{45, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{45, 0} } func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2405,7 +2405,7 @@ func (m *GCResponse) Reset() { *m = GCResponse{} } func (m *GCResponse) String() string { return proto.CompactTextString(m) } func (*GCResponse) ProtoMessage() {} func (*GCResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{46} + return fileDescriptor_api_a5b93ff81643c6e6, []int{46} } func (m *GCResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2474,7 +2474,7 @@ func (m *PushTxnRequest) Reset() { *m = PushTxnRequest{} } func (m *PushTxnRequest) String() string { return proto.CompactTextString(m) } func (*PushTxnRequest) ProtoMessage() {} func (*PushTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{47} + return fileDescriptor_api_a5b93ff81643c6e6, []int{47} } func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2517,7 +2517,7 @@ func (m *PushTxnResponse) Reset() { *m = PushTxnResponse{} } func (m *PushTxnResponse) String() string { return proto.CompactTextString(m) } func (*PushTxnResponse) ProtoMessage() {} func (*PushTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{48} + return fileDescriptor_api_a5b93ff81643c6e6, []int{48} } func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2564,7 +2564,7 @@ func (m *RecoverTxnRequest) Reset() { *m = RecoverTxnRequest{} } func (m *RecoverTxnRequest) String() string { return proto.CompactTextString(m) } func (*RecoverTxnRequest) ProtoMessage() {} func (*RecoverTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{49} + return fileDescriptor_api_a5b93ff81643c6e6, []int{49} } func (m *RecoverTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2600,7 @@ func (m *RecoverTxnResponse) Reset() { *m = RecoverTxnResponse{} } func (m *RecoverTxnResponse) String() string { return proto.CompactTextString(m) } func (*RecoverTxnResponse) ProtoMessage() {} func (*RecoverTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{50} + return fileDescriptor_api_a5b93ff81643c6e6, []int{50} } func (m *RecoverTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2644,7 +2644,7 @@ func (m *QueryTxnRequest) Reset() { *m = QueryTxnRequest{} } func (m *QueryTxnRequest) String() string { return proto.CompactTextString(m) } func (*QueryTxnRequest) ProtoMessage() {} func (*QueryTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{51} + return fileDescriptor_api_a5b93ff81643c6e6, []int{51} } func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2683,7 +2683,7 @@ func (m *QueryTxnResponse) Reset() { *m = QueryTxnResponse{} } func (m *QueryTxnResponse) String() string { return proto.CompactTextString(m) } func (*QueryTxnResponse) ProtoMessage() {} func (*QueryTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{52} + return fileDescriptor_api_a5b93ff81643c6e6, []int{52} } func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2743,7 +2743,7 @@ func (m *QueryIntentRequest) Reset() { *m = QueryIntentRequest{} } func (m *QueryIntentRequest) String() string { return proto.CompactTextString(m) } func (*QueryIntentRequest) ProtoMessage() {} func (*QueryIntentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{53} + return fileDescriptor_api_a5b93ff81643c6e6, []int{53} } func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2779,7 +2779,7 @@ func (m *QueryIntentResponse) Reset() { *m = QueryIntentResponse{} } func (m *QueryIntentResponse) String() string { return proto.CompactTextString(m) } func (*QueryIntentResponse) ProtoMessage() {} func (*QueryIntentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{54} + return fileDescriptor_api_a5b93ff81643c6e6, []int{54} } func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2825,7 +2825,7 @@ func (m *ResolveIntentRequest) Reset() { *m = ResolveIntentRequest{} } func (m *ResolveIntentRequest) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRequest) ProtoMessage() {} func (*ResolveIntentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{55} + return fileDescriptor_api_a5b93ff81643c6e6, []int{55} } func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2860,7 +2860,7 @@ func (m *ResolveIntentResponse) Reset() { *m = ResolveIntentResponse{} } func (m *ResolveIntentResponse) String() string { return proto.CompactTextString(m) } func (*ResolveIntentResponse) ProtoMessage() {} func (*ResolveIntentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{56} + return fileDescriptor_api_a5b93ff81643c6e6, []int{56} } func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2910,7 +2910,7 @@ func (m *ResolveIntentRangeRequest) Reset() { *m = ResolveIntentRangeReq func (m *ResolveIntentRangeRequest) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRangeRequest) ProtoMessage() {} func (*ResolveIntentRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{57} + return fileDescriptor_api_a5b93ff81643c6e6, []int{57} } func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2945,7 +2945,7 @@ func (m *ResolveIntentRangeResponse) Reset() { *m = ResolveIntentRangeRe func (m *ResolveIntentRangeResponse) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRangeResponse) ProtoMessage() {} func (*ResolveIntentRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{58} + return fileDescriptor_api_a5b93ff81643c6e6, []int{58} } func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2982,7 +2982,7 @@ func (m *MergeRequest) Reset() { *m = MergeRequest{} } func (m *MergeRequest) String() string { return proto.CompactTextString(m) } func (*MergeRequest) ProtoMessage() {} func (*MergeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{59} + return fileDescriptor_api_a5b93ff81643c6e6, []int{59} } func (m *MergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3016,7 +3016,7 @@ func (m *MergeResponse) Reset() { *m = MergeResponse{} } func (m *MergeResponse) String() string { return proto.CompactTextString(m) } func (*MergeResponse) ProtoMessage() {} func (*MergeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{60} + return fileDescriptor_api_a5b93ff81643c6e6, []int{60} } func (m *MergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3061,7 +3061,7 @@ func (m *TruncateLogRequest) Reset() { *m = TruncateLogRequest{} } func (m *TruncateLogRequest) String() string { return proto.CompactTextString(m) } func (*TruncateLogRequest) ProtoMessage() {} func (*TruncateLogRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{61} + return fileDescriptor_api_a5b93ff81643c6e6, []int{61} } func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3095,7 +3095,7 @@ func (m *TruncateLogResponse) Reset() { *m = TruncateLogResponse{} } func (m *TruncateLogResponse) String() string { return proto.CompactTextString(m) } func (*TruncateLogResponse) ProtoMessage() {} func (*TruncateLogResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{62} + return fileDescriptor_api_a5b93ff81643c6e6, []int{62} } func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3139,7 +3139,7 @@ func (m *RequestLeaseRequest) Reset() { *m = RequestLeaseRequest{} } func (m *RequestLeaseRequest) String() string { return proto.CompactTextString(m) } func (*RequestLeaseRequest) ProtoMessage() {} func (*RequestLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{63} + return fileDescriptor_api_a5b93ff81643c6e6, []int{63} } func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3188,7 +3188,7 @@ func (m *TransferLeaseRequest) Reset() { *m = TransferLeaseRequest{} } func (m *TransferLeaseRequest) String() string { return proto.CompactTextString(m) } func (*TransferLeaseRequest) ProtoMessage() {} func (*TransferLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{64} + return fileDescriptor_api_a5b93ff81643c6e6, []int{64} } func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3225,7 +3225,7 @@ func (m *LeaseInfoRequest) Reset() { *m = LeaseInfoRequest{} } func (m *LeaseInfoRequest) String() string { return proto.CompactTextString(m) } func (*LeaseInfoRequest) ProtoMessage() {} func (*LeaseInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{65} + return fileDescriptor_api_a5b93ff81643c6e6, []int{65} } func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3262,7 +3262,7 @@ func (m *LeaseInfoResponse) Reset() { *m = LeaseInfoResponse{} } func (m *LeaseInfoResponse) String() string { return proto.CompactTextString(m) } func (*LeaseInfoResponse) ProtoMessage() {} func (*LeaseInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{66} + return fileDescriptor_api_a5b93ff81643c6e6, []int{66} } func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3297,7 +3297,7 @@ func (m *RequestLeaseResponse) Reset() { *m = RequestLeaseResponse{} } func (m *RequestLeaseResponse) String() string { return proto.CompactTextString(m) } func (*RequestLeaseResponse) ProtoMessage() {} func (*RequestLeaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{67} + return fileDescriptor_api_a5b93ff81643c6e6, []int{67} } func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3352,7 +3352,7 @@ func (m *ComputeChecksumRequest) Reset() { *m = ComputeChecksumRequest{} func (m *ComputeChecksumRequest) String() string { return proto.CompactTextString(m) } func (*ComputeChecksumRequest) ProtoMessage() {} func (*ComputeChecksumRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{68} + return fileDescriptor_api_a5b93ff81643c6e6, []int{68} } func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3389,7 +3389,7 @@ func (m *ComputeChecksumResponse) Reset() { *m = ComputeChecksumResponse func (m *ComputeChecksumResponse) String() string { return proto.CompactTextString(m) } func (*ComputeChecksumResponse) ProtoMessage() {} func (*ComputeChecksumResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{69} + return fileDescriptor_api_a5b93ff81643c6e6, []int{69} } func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3429,7 +3429,7 @@ func (m *ExternalStorage) Reset() { *m = ExternalStorage{} } func (m *ExternalStorage) String() string { return proto.CompactTextString(m) } func (*ExternalStorage) ProtoMessage() {} func (*ExternalStorage) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70} } func (m *ExternalStorage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3463,7 +3463,7 @@ func (m *ExternalStorage_LocalFilePath) Reset() { *m = ExternalStorage_L func (m *ExternalStorage_LocalFilePath) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_LocalFilePath) ProtoMessage() {} func (*ExternalStorage_LocalFilePath) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 0} } func (m *ExternalStorage_LocalFilePath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3496,7 +3496,7 @@ func (m *ExternalStorage_Http) Reset() { *m = ExternalStorage_Http{} } func (m *ExternalStorage_Http) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_Http) ProtoMessage() {} func (*ExternalStorage_Http) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 1} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 1} } func (m *ExternalStorage_Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3536,7 +3536,7 @@ func (m *ExternalStorage_S3) Reset() { *m = ExternalStorage_S3{} } func (m *ExternalStorage_S3) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_S3) ProtoMessage() {} func (*ExternalStorage_S3) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 2} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 2} } func (m *ExternalStorage_S3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3575,7 +3575,7 @@ func (m *ExternalStorage_GCS) Reset() { *m = ExternalStorage_GCS{} } func (m *ExternalStorage_GCS) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_GCS) ProtoMessage() {} func (*ExternalStorage_GCS) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 3} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 3} } func (m *ExternalStorage_GCS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3611,7 @@ func (m *ExternalStorage_Azure) Reset() { *m = ExternalStorage_Azure{} } func (m *ExternalStorage_Azure) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_Azure) ProtoMessage() {} func (*ExternalStorage_Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 4} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 4} } func (m *ExternalStorage_Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3650,7 +3650,7 @@ func (m *ExternalStorage_Workload) Reset() { *m = ExternalStorage_Worklo func (m *ExternalStorage_Workload) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_Workload) ProtoMessage() {} func (*ExternalStorage_Workload) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 5} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 5} } func (m *ExternalStorage_Workload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3690,7 +3690,7 @@ func (m *ExternalStorage_FileTable) Reset() { *m = ExternalStorage_FileT func (m *ExternalStorage_FileTable) String() string { return proto.CompactTextString(m) } func (*ExternalStorage_FileTable) ProtoMessage() {} func (*ExternalStorage_FileTable) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{70, 6} + return fileDescriptor_api_a5b93ff81643c6e6, []int{70, 6} } func (m *ExternalStorage_FileTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3730,7 +3730,7 @@ func (m *WriteBatchRequest) Reset() { *m = WriteBatchRequest{} } func (m *WriteBatchRequest) String() string { return proto.CompactTextString(m) } func (*WriteBatchRequest) ProtoMessage() {} func (*WriteBatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{71} + return fileDescriptor_api_a5b93ff81643c6e6, []int{71} } func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3764,7 +3764,7 @@ func (m *WriteBatchResponse) Reset() { *m = WriteBatchResponse{} } func (m *WriteBatchResponse) String() string { return proto.CompactTextString(m) } func (*WriteBatchResponse) ProtoMessage() {} func (*WriteBatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{72} + return fileDescriptor_api_a5b93ff81643c6e6, []int{72} } func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3798,7 +3798,7 @@ func (m *FileEncryptionOptions) Reset() { *m = FileEncryptionOptions{} } func (m *FileEncryptionOptions) String() string { return proto.CompactTextString(m) } func (*FileEncryptionOptions) ProtoMessage() {} func (*FileEncryptionOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{73} + return fileDescriptor_api_a5b93ff81643c6e6, []int{73} } func (m *FileEncryptionOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3868,7 +3868,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} } func (m *ExportRequest) String() string { return proto.CompactTextString(m) } func (*ExportRequest) ProtoMessage() {} func (*ExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{74} + return fileDescriptor_api_a5b93ff81643c6e6, []int{74} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3920,7 +3920,7 @@ func (m *BulkOpSummary) Reset() { *m = BulkOpSummary{} } func (m *BulkOpSummary) String() string { return proto.CompactTextString(m) } func (*BulkOpSummary) ProtoMessage() {} func (*BulkOpSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{75} + return fileDescriptor_api_a5b93ff81643c6e6, []int{75} } func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3956,7 +3956,7 @@ func (m *ExportResponse) Reset() { *m = ExportResponse{} } func (m *ExportResponse) String() string { return proto.CompactTextString(m) } func (*ExportResponse) ProtoMessage() {} func (*ExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{76} + return fileDescriptor_api_a5b93ff81643c6e6, []int{76} } func (m *ExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3996,7 +3996,7 @@ func (m *ExportResponse_File) Reset() { *m = ExportResponse_File{} } func (m *ExportResponse_File) String() string { return proto.CompactTextString(m) } func (*ExportResponse_File) ProtoMessage() {} func (*ExportResponse_File) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{76, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{76, 0} } func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4047,7 +4047,7 @@ func (m *ImportRequest) Reset() { *m = ImportRequest{} } func (m *ImportRequest) String() string { return proto.CompactTextString(m) } func (*ImportRequest) ProtoMessage() {} func (*ImportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{77} + return fileDescriptor_api_a5b93ff81643c6e6, []int{77} } func (m *ImportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4082,7 +4082,7 @@ func (m *ImportRequest_File) Reset() { *m = ImportRequest_File{} } func (m *ImportRequest_File) String() string { return proto.CompactTextString(m) } func (*ImportRequest_File) ProtoMessage() {} func (*ImportRequest_File) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{77, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{77, 0} } func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4118,7 +4118,7 @@ func (m *ImportRequest_TableRekey) Reset() { *m = ImportRequest_TableRek func (m *ImportRequest_TableRekey) String() string { return proto.CompactTextString(m) } func (*ImportRequest_TableRekey) ProtoMessage() {} func (*ImportRequest_TableRekey) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{77, 1} + return fileDescriptor_api_a5b93ff81643c6e6, []int{77, 1} } func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4153,7 +4153,7 @@ func (m *ImportResponse) Reset() { *m = ImportResponse{} } func (m *ImportResponse) String() string { return proto.CompactTextString(m) } func (*ImportResponse) ProtoMessage() {} func (*ImportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{78} + return fileDescriptor_api_a5b93ff81643c6e6, []int{78} } func (m *ImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4191,7 +4191,7 @@ func (m *AdminScatterRequest) Reset() { *m = AdminScatterRequest{} } func (m *AdminScatterRequest) String() string { return proto.CompactTextString(m) } func (*AdminScatterRequest) ProtoMessage() {} func (*AdminScatterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{79} + return fileDescriptor_api_a5b93ff81643c6e6, []int{79} } func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4226,7 +4226,7 @@ func (m *AdminScatterResponse) Reset() { *m = AdminScatterResponse{} } func (m *AdminScatterResponse) String() string { return proto.CompactTextString(m) } func (*AdminScatterResponse) ProtoMessage() {} func (*AdminScatterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{80} + return fileDescriptor_api_a5b93ff81643c6e6, []int{80} } func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4259,7 +4259,7 @@ func (m *AdminScatterResponse_Range) Reset() { *m = AdminScatterResponse func (m *AdminScatterResponse_Range) String() string { return proto.CompactTextString(m) } func (*AdminScatterResponse_Range) ProtoMessage() {} func (*AdminScatterResponse_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{80, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{80, 0} } func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4304,7 +4304,7 @@ func (m *AdminVerifyProtectedTimestampRequest) Reset() { *m = AdminVerif func (m *AdminVerifyProtectedTimestampRequest) String() string { return proto.CompactTextString(m) } func (*AdminVerifyProtectedTimestampRequest) ProtoMessage() {} func (*AdminVerifyProtectedTimestampRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{81} + return fileDescriptor_api_a5b93ff81643c6e6, []int{81} } func (m *AdminVerifyProtectedTimestampRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4342,7 +4342,7 @@ func (m *AdminVerifyProtectedTimestampResponse) Reset() { *m = AdminVeri func (m *AdminVerifyProtectedTimestampResponse) String() string { return proto.CompactTextString(m) } func (*AdminVerifyProtectedTimestampResponse) ProtoMessage() {} func (*AdminVerifyProtectedTimestampResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{82} + return fileDescriptor_api_a5b93ff81643c6e6, []int{82} } func (m *AdminVerifyProtectedTimestampResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4395,7 +4395,7 @@ func (m *AddSSTableRequest) Reset() { *m = AddSSTableRequest{} } func (m *AddSSTableRequest) String() string { return proto.CompactTextString(m) } func (*AddSSTableRequest) ProtoMessage() {} func (*AddSSTableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{83} + return fileDescriptor_api_a5b93ff81643c6e6, []int{83} } func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4429,7 +4429,7 @@ func (m *AddSSTableResponse) Reset() { *m = AddSSTableResponse{} } func (m *AddSSTableResponse) String() string { return proto.CompactTextString(m) } func (*AddSSTableResponse) ProtoMessage() {} func (*AddSSTableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{84} + return fileDescriptor_api_a5b93ff81643c6e6, []int{84} } func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4473,7 +4473,7 @@ func (m *RefreshRequest) Reset() { *m = RefreshRequest{} } func (m *RefreshRequest) String() string { return proto.CompactTextString(m) } func (*RefreshRequest) ProtoMessage() {} func (*RefreshRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{85} + return fileDescriptor_api_a5b93ff81643c6e6, []int{85} } func (m *RefreshRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4507,7 +4507,7 @@ func (m *RefreshResponse) Reset() { *m = RefreshResponse{} } func (m *RefreshResponse) String() string { return proto.CompactTextString(m) } func (*RefreshResponse) ProtoMessage() {} func (*RefreshResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{86} + return fileDescriptor_api_a5b93ff81643c6e6, []int{86} } func (m *RefreshResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4546,7 +4546,7 @@ func (m *RefreshRangeRequest) Reset() { *m = RefreshRangeRequest{} } func (m *RefreshRangeRequest) String() string { return proto.CompactTextString(m) } func (*RefreshRangeRequest) ProtoMessage() {} func (*RefreshRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{87} + return fileDescriptor_api_a5b93ff81643c6e6, []int{87} } func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4580,7 +4580,7 @@ func (m *RefreshRangeResponse) Reset() { *m = RefreshRangeResponse{} } func (m *RefreshRangeResponse) String() string { return proto.CompactTextString(m) } func (*RefreshRangeResponse) ProtoMessage() {} func (*RefreshRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{88} + return fileDescriptor_api_a5b93ff81643c6e6, []int{88} } func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4629,7 +4629,7 @@ func (m *SubsumeRequest) Reset() { *m = SubsumeRequest{} } func (m *SubsumeRequest) String() string { return proto.CompactTextString(m) } func (*SubsumeRequest) ProtoMessage() {} func (*SubsumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{89} + return fileDescriptor_api_a5b93ff81643c6e6, []int{89} } func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4678,7 +4678,7 @@ func (m *SubsumeResponse) Reset() { *m = SubsumeResponse{} } func (m *SubsumeResponse) String() string { return proto.CompactTextString(m) } func (*SubsumeResponse) ProtoMessage() {} func (*SubsumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{90} + return fileDescriptor_api_a5b93ff81643c6e6, []int{90} } func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4713,7 +4713,7 @@ func (m *RangeStatsRequest) Reset() { *m = RangeStatsRequest{} } func (m *RangeStatsRequest) String() string { return proto.CompactTextString(m) } func (*RangeStatsRequest) ProtoMessage() {} func (*RangeStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{91} + return fileDescriptor_api_a5b93ff81643c6e6, []int{91} } func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4752,7 +4752,7 @@ func (m *RangeStatsResponse) Reset() { *m = RangeStatsResponse{} } func (m *RangeStatsResponse) String() string { return proto.CompactTextString(m) } func (*RangeStatsResponse) ProtoMessage() {} func (*RangeStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{92} + return fileDescriptor_api_a5b93ff81643c6e6, []int{92} } func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4835,7 +4835,7 @@ func (m *RequestUnion) Reset() { *m = RequestUnion{} } func (m *RequestUnion) String() string { return proto.CompactTextString(m) } func (*RequestUnion) ProtoMessage() {} func (*RequestUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{93} + return fileDescriptor_api_a5b93ff81643c6e6, []int{93} } func (m *RequestUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6285,7 +6285,7 @@ func (m *ResponseUnion) Reset() { *m = ResponseUnion{} } func (m *ResponseUnion) String() string { return proto.CompactTextString(m) } func (*ResponseUnion) ProtoMessage() {} func (*ResponseUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{94} + return fileDescriptor_api_a5b93ff81643c6e6, []int{94} } func (m *ResponseUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7800,7 +7800,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{95} + return fileDescriptor_api_a5b93ff81643c6e6, []int{95} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7836,7 +7836,7 @@ type BatchRequest struct { func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (*BatchRequest) ProtoMessage() {} func (*BatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{96} + return fileDescriptor_api_a5b93ff81643c6e6, []int{96} } func (m *BatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7873,7 +7873,7 @@ type BatchResponse struct { func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (*BatchResponse) ProtoMessage() {} func (*BatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{97} + return fileDescriptor_api_a5b93ff81643c6e6, []int{97} } func (m *BatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7931,7 +7931,7 @@ func (m *BatchResponse_Header) Reset() { *m = BatchResponse_Header{} } func (m *BatchResponse_Header) String() string { return proto.CompactTextString(m) } func (*BatchResponse_Header) ProtoMessage() {} func (*BatchResponse_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{97, 0} + return fileDescriptor_api_a5b93ff81643c6e6, []int{97, 0} } func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7956,6 +7956,82 @@ func (m *BatchResponse_Header) XXX_DiscardUnknown() { var xxx_messageInfo_BatchResponse_Header proto.InternalMessageInfo +// RangeLookupRequest is a request to proxy a RangeLookup through a Tenant +// service. Its fields correspond to a subset of the args of kv.RangeLookup. +type RangeLookupRequest struct { + Key RKey `protobuf:"bytes,1,opt,name=key,proto3,casttype=RKey" json:"key,omitempty"` + ReadConsistency ReadConsistencyType `protobuf:"varint,2,opt,name=read_consistency,json=readConsistency,proto3,enum=cockroach.roachpb.ReadConsistencyType" json:"read_consistency,omitempty"` + PrefetchNum int64 `protobuf:"varint,3,opt,name=prefetch_num,json=prefetchNum,proto3" json:"prefetch_num,omitempty"` + PrefetchReverse bool `protobuf:"varint,4,opt,name=prefetch_reverse,json=prefetchReverse,proto3" json:"prefetch_reverse,omitempty"` +} + +func (m *RangeLookupRequest) Reset() { *m = RangeLookupRequest{} } +func (m *RangeLookupRequest) String() string { return proto.CompactTextString(m) } +func (*RangeLookupRequest) ProtoMessage() {} +func (*RangeLookupRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_api_a5b93ff81643c6e6, []int{98} +} +func (m *RangeLookupRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RangeLookupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *RangeLookupRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RangeLookupRequest.Merge(dst, src) +} +func (m *RangeLookupRequest) XXX_Size() int { + return m.Size() +} +func (m *RangeLookupRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RangeLookupRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RangeLookupRequest proto.InternalMessageInfo + +// RangeLookupResponse is returned from a RangeLookup request proxied through a +// Tenant service. Its fields correspond to the return values of kv.RangeLookup. +type RangeLookupResponse struct { + Descriptors []RangeDescriptor `protobuf:"bytes,1,rep,name=descriptors,proto3" json:"descriptors"` + PrefetchedDescriptors []RangeDescriptor `protobuf:"bytes,2,rep,name=prefetched_descriptors,json=prefetchedDescriptors,proto3" json:"prefetched_descriptors"` + // If non-nil, the other fields will be empty. + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *RangeLookupResponse) Reset() { *m = RangeLookupResponse{} } +func (m *RangeLookupResponse) String() string { return proto.CompactTextString(m) } +func (*RangeLookupResponse) ProtoMessage() {} +func (*RangeLookupResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_api_a5b93ff81643c6e6, []int{99} +} +func (m *RangeLookupResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RangeLookupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *RangeLookupResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_RangeLookupResponse.Merge(dst, src) +} +func (m *RangeLookupResponse) XXX_Size() int { + return m.Size() +} +func (m *RangeLookupResponse) XXX_DiscardUnknown() { + xxx_messageInfo_RangeLookupResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_RangeLookupResponse proto.InternalMessageInfo + // RangeFeedRequest is a request that expresses the intention to establish a // RangeFeed stream over the provided span, starting at the specified timestamp. type RangeFeedRequest struct { @@ -7970,7 +8046,7 @@ func (m *RangeFeedRequest) Reset() { *m = RangeFeedRequest{} } func (m *RangeFeedRequest) String() string { return proto.CompactTextString(m) } func (*RangeFeedRequest) ProtoMessage() {} func (*RangeFeedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{98} + return fileDescriptor_api_a5b93ff81643c6e6, []int{100} } func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8011,7 +8087,7 @@ func (m *RangeFeedValue) Reset() { *m = RangeFeedValue{} } func (m *RangeFeedValue) String() string { return proto.CompactTextString(m) } func (*RangeFeedValue) ProtoMessage() {} func (*RangeFeedValue) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{99} + return fileDescriptor_api_a5b93ff81643c6e6, []int{101} } func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8052,7 +8128,7 @@ func (m *RangeFeedCheckpoint) Reset() { *m = RangeFeedCheckpoint{} } func (m *RangeFeedCheckpoint) String() string { return proto.CompactTextString(m) } func (*RangeFeedCheckpoint) ProtoMessage() {} func (*RangeFeedCheckpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{100} + return fileDescriptor_api_a5b93ff81643c6e6, []int{102} } func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8089,7 +8165,7 @@ func (m *RangeFeedError) Reset() { *m = RangeFeedError{} } func (m *RangeFeedError) String() string { return proto.CompactTextString(m) } func (*RangeFeedError) ProtoMessage() {} func (*RangeFeedError) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{101} + return fileDescriptor_api_a5b93ff81643c6e6, []int{103} } func (m *RangeFeedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8126,7 +8202,7 @@ func (m *RangeFeedEvent) Reset() { *m = RangeFeedEvent{} } func (m *RangeFeedEvent) String() string { return proto.CompactTextString(m) } func (*RangeFeedEvent) ProtoMessage() {} func (*RangeFeedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_api_f43a565490f66766, []int{102} + return fileDescriptor_api_a5b93ff81643c6e6, []int{104} } func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8151,6 +8227,87 @@ func (m *RangeFeedEvent) XXX_DiscardUnknown() { var xxx_messageInfo_RangeFeedEvent proto.InternalMessageInfo +// GossipSubscriptionRequest initiates a game of telephone. It establishes an +// indefinite stream that proxies gossip information overheard by the recipient +// node back to the caller. Gossip information is filtered down to just those +// identified by a key matching any of the specified patterns. +// +// Upon establishment of the stream, all existing information that matches one +// or more of the patterns is returned. After this point, only new information +// matching the patterns is returned. +type GossipSubscriptionRequest struct { + Patterns []string `protobuf:"bytes,1,rep,name=patterns,proto3" json:"patterns,omitempty"` +} + +func (m *GossipSubscriptionRequest) Reset() { *m = GossipSubscriptionRequest{} } +func (m *GossipSubscriptionRequest) String() string { return proto.CompactTextString(m) } +func (*GossipSubscriptionRequest) ProtoMessage() {} +func (*GossipSubscriptionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_api_a5b93ff81643c6e6, []int{105} +} +func (m *GossipSubscriptionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GossipSubscriptionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *GossipSubscriptionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipSubscriptionRequest.Merge(dst, src) +} +func (m *GossipSubscriptionRequest) XXX_Size() int { + return m.Size() +} +func (m *GossipSubscriptionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GossipSubscriptionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GossipSubscriptionRequest proto.InternalMessageInfo + +// GossipSubscriptionEvent is a single piece of proxied gossip information. +type GossipSubscriptionEvent struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Content Value `protobuf:"bytes,2,opt,name=content,proto3" json:"content"` + // Which pattern does this gossip information match? + PatternMatched string `protobuf:"bytes,3,opt,name=pattern_matched,json=patternMatched,proto3" json:"pattern_matched,omitempty"` + // If non-nil, the other fields will be empty and this will be the final event + // send on the stream before it is terminated. + Error *Error `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` +} + +func (m *GossipSubscriptionEvent) Reset() { *m = GossipSubscriptionEvent{} } +func (m *GossipSubscriptionEvent) String() string { return proto.CompactTextString(m) } +func (*GossipSubscriptionEvent) ProtoMessage() {} +func (*GossipSubscriptionEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_api_a5b93ff81643c6e6, []int{106} +} +func (m *GossipSubscriptionEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GossipSubscriptionEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *GossipSubscriptionEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_GossipSubscriptionEvent.Merge(dst, src) +} +func (m *GossipSubscriptionEvent) XXX_Size() int { + return m.Size() +} +func (m *GossipSubscriptionEvent) XXX_DiscardUnknown() { + xxx_messageInfo_GossipSubscriptionEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_GossipSubscriptionEvent proto.InternalMessageInfo + func init() { proto.RegisterType((*RequestHeader)(nil), "cockroach.roachpb.RequestHeader") proto.RegisterType((*ResponseHeader)(nil), "cockroach.roachpb.ResponseHeader") @@ -8266,11 +8423,15 @@ func init() { proto.RegisterType((*BatchRequest)(nil), "cockroach.roachpb.BatchRequest") proto.RegisterType((*BatchResponse)(nil), "cockroach.roachpb.BatchResponse") proto.RegisterType((*BatchResponse_Header)(nil), "cockroach.roachpb.BatchResponse.Header") + proto.RegisterType((*RangeLookupRequest)(nil), "cockroach.roachpb.RangeLookupRequest") + proto.RegisterType((*RangeLookupResponse)(nil), "cockroach.roachpb.RangeLookupResponse") proto.RegisterType((*RangeFeedRequest)(nil), "cockroach.roachpb.RangeFeedRequest") proto.RegisterType((*RangeFeedValue)(nil), "cockroach.roachpb.RangeFeedValue") proto.RegisterType((*RangeFeedCheckpoint)(nil), "cockroach.roachpb.RangeFeedCheckpoint") proto.RegisterType((*RangeFeedError)(nil), "cockroach.roachpb.RangeFeedError") proto.RegisterType((*RangeFeedEvent)(nil), "cockroach.roachpb.RangeFeedEvent") + proto.RegisterType((*GossipSubscriptionRequest)(nil), "cockroach.roachpb.GossipSubscriptionRequest") + proto.RegisterType((*GossipSubscriptionEvent)(nil), "cockroach.roachpb.GossipSubscriptionEvent") proto.RegisterEnum("cockroach.roachpb.ReadConsistencyType", ReadConsistencyType_name, ReadConsistencyType_value) proto.RegisterEnum("cockroach.roachpb.ScanFormat", ScanFormat_name, ScanFormat_value) proto.RegisterEnum("cockroach.roachpb.ChecksumMode", ChecksumMode_name, ChecksumMode_value) @@ -10187,7 +10348,9 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type InternalClient interface { Batch(ctx context.Context, in *BatchRequest, opts ...grpc.CallOption) (*BatchResponse, error) + RangeLookup(ctx context.Context, in *RangeLookupRequest, opts ...grpc.CallOption) (*RangeLookupResponse, error) RangeFeed(ctx context.Context, in *RangeFeedRequest, opts ...grpc.CallOption) (Internal_RangeFeedClient, error) + GossipSubscription(ctx context.Context, in *GossipSubscriptionRequest, opts ...grpc.CallOption) (Internal_GossipSubscriptionClient, error) } type internalClient struct { @@ -10207,6 +10370,15 @@ func (c *internalClient) Batch(ctx context.Context, in *BatchRequest, opts ...gr return out, nil } +func (c *internalClient) RangeLookup(ctx context.Context, in *RangeLookupRequest, opts ...grpc.CallOption) (*RangeLookupResponse, error) { + out := new(RangeLookupResponse) + err := c.cc.Invoke(ctx, "/cockroach.roachpb.Internal/RangeLookup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *internalClient) RangeFeed(ctx context.Context, in *RangeFeedRequest, opts ...grpc.CallOption) (Internal_RangeFeedClient, error) { stream, err := c.cc.NewStream(ctx, &_Internal_serviceDesc.Streams[0], "/cockroach.roachpb.Internal/RangeFeed", opts...) if err != nil { @@ -10239,10 +10411,44 @@ func (x *internalRangeFeedClient) Recv() (*RangeFeedEvent, error) { return m, nil } +func (c *internalClient) GossipSubscription(ctx context.Context, in *GossipSubscriptionRequest, opts ...grpc.CallOption) (Internal_GossipSubscriptionClient, error) { + stream, err := c.cc.NewStream(ctx, &_Internal_serviceDesc.Streams[1], "/cockroach.roachpb.Internal/GossipSubscription", opts...) + if err != nil { + return nil, err + } + x := &internalGossipSubscriptionClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Internal_GossipSubscriptionClient interface { + Recv() (*GossipSubscriptionEvent, error) + grpc.ClientStream +} + +type internalGossipSubscriptionClient struct { + grpc.ClientStream +} + +func (x *internalGossipSubscriptionClient) Recv() (*GossipSubscriptionEvent, error) { + m := new(GossipSubscriptionEvent) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // InternalServer is the server API for Internal service. type InternalServer interface { Batch(context.Context, *BatchRequest) (*BatchResponse, error) + RangeLookup(context.Context, *RangeLookupRequest) (*RangeLookupResponse, error) RangeFeed(*RangeFeedRequest, Internal_RangeFeedServer) error + GossipSubscription(*GossipSubscriptionRequest, Internal_GossipSubscriptionServer) error } func RegisterInternalServer(s *grpc.Server, srv InternalServer) { @@ -10267,6 +10473,24 @@ func _Internal_Batch_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Internal_RangeLookup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RangeLookupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(InternalServer).RangeLookup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cockroach.roachpb.Internal/RangeLookup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(InternalServer).RangeLookup(ctx, req.(*RangeLookupRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Internal_RangeFeed_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(RangeFeedRequest) if err := stream.RecvMsg(m); err != nil { @@ -10288,6 +10512,27 @@ func (x *internalRangeFeedServer) Send(m *RangeFeedEvent) error { return x.ServerStream.SendMsg(m) } +func _Internal_GossipSubscription_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GossipSubscriptionRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(InternalServer).GossipSubscription(m, &internalGossipSubscriptionServer{stream}) +} + +type Internal_GossipSubscriptionServer interface { + Send(*GossipSubscriptionEvent) error + grpc.ServerStream +} + +type internalGossipSubscriptionServer struct { + grpc.ServerStream +} + +func (x *internalGossipSubscriptionServer) Send(m *GossipSubscriptionEvent) error { + return x.ServerStream.SendMsg(m) +} + var _Internal_serviceDesc = grpc.ServiceDesc{ ServiceName: "cockroach.roachpb.Internal", HandlerType: (*InternalServer)(nil), @@ -10296,6 +10541,10 @@ var _Internal_serviceDesc = grpc.ServiceDesc{ MethodName: "Batch", Handler: _Internal_Batch_Handler, }, + { + MethodName: "RangeLookup", + Handler: _Internal_RangeLookup_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -10303,6 +10552,11 @@ var _Internal_serviceDesc = grpc.ServiceDesc{ Handler: _Internal_RangeFeed_Handler, ServerStreams: true, }, + { + StreamName: "GossipSubscription", + Handler: _Internal_GossipSubscription_Handler, + ServerStreams: true, + }, }, Metadata: "roachpb/api.proto", } @@ -16282,6 +16536,102 @@ func (m *BatchResponse_Header) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *RangeLookupRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RangeLookupRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + if m.ReadConsistency != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.ReadConsistency)) + } + if m.PrefetchNum != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.PrefetchNum)) + } + if m.PrefetchReverse { + dAtA[i] = 0x20 + i++ + if m.PrefetchReverse { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + return i, nil +} + +func (m *RangeLookupResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RangeLookupResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Descriptors) > 0 { + for _, msg := range m.Descriptors { + dAtA[i] = 0xa + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if len(m.PrefetchedDescriptors) > 0 { + for _, msg := range m.PrefetchedDescriptors { + dAtA[i] = 0x12 + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + if m.Error != nil { + dAtA[i] = 0x1a + i++ + i = encodeVarintApi(dAtA, i, uint64(m.Error.Size())) + n258, err := m.Error.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n258 + } + return i, nil +} + func (m *RangeFeedRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -16300,19 +16650,19 @@ func (m *RangeFeedRequest) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Header.Size())) - n258, err := m.Header.MarshalTo(dAtA[i:]) + n259, err := m.Header.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n258 + i += n259 dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.Span.Size())) - n259, err := m.Span.MarshalTo(dAtA[i:]) + n260, err := m.Span.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n259 + i += n260 if m.WithDiff { dAtA[i] = 0x18 i++ @@ -16350,19 +16700,19 @@ func (m *RangeFeedValue) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.Value.Size())) - n260, err := m.Value.MarshalTo(dAtA[i:]) + n261, err := m.Value.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n260 + i += n261 dAtA[i] = 0x1a i++ i = encodeVarintApi(dAtA, i, uint64(m.PrevValue.Size())) - n261, err := m.PrevValue.MarshalTo(dAtA[i:]) + n262, err := m.PrevValue.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n261 + i += n262 return i, nil } @@ -16384,19 +16734,19 @@ func (m *RangeFeedCheckpoint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Span.Size())) - n262, err := m.Span.MarshalTo(dAtA[i:]) + n263, err := m.Span.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n262 + i += n263 dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.ResolvedTS.Size())) - n263, err := m.ResolvedTS.MarshalTo(dAtA[i:]) + n264, err := m.ResolvedTS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n263 + i += n264 return i, nil } @@ -16418,11 +16768,11 @@ func (m *RangeFeedError) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Error.Size())) - n264, err := m.Error.MarshalTo(dAtA[i:]) + n265, err := m.Error.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n264 + i += n265 return i, nil } @@ -16445,31 +16795,112 @@ func (m *RangeFeedEvent) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintApi(dAtA, i, uint64(m.Val.Size())) - n265, err := m.Val.MarshalTo(dAtA[i:]) + n266, err := m.Val.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n265 + i += n266 } if m.Checkpoint != nil { dAtA[i] = 0x12 i++ i = encodeVarintApi(dAtA, i, uint64(m.Checkpoint.Size())) - n266, err := m.Checkpoint.MarshalTo(dAtA[i:]) + n267, err := m.Checkpoint.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n266 + i += n267 } if m.Error != nil { dAtA[i] = 0x1a i++ i = encodeVarintApi(dAtA, i, uint64(m.Error.Size())) - n267, err := m.Error.MarshalTo(dAtA[i:]) + n268, err := m.Error.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n267 + i += n268 + } + return i, nil +} + +func (m *GossipSubscriptionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GossipSubscriptionRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Patterns) > 0 { + for _, s := range m.Patterns { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + return i, nil +} + +func (m *GossipSubscriptionEvent) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GossipSubscriptionEvent) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + } + dAtA[i] = 0x12 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.Content.Size())) + n269, err := m.Content.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n269 + if len(m.PatternMatched) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintApi(dAtA, i, uint64(len(m.PatternMatched))) + i += copy(dAtA[i:], m.PatternMatched) + } + if m.Error != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintApi(dAtA, i, uint64(m.Error.Size())) + n270, err := m.Error.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n270 } return i, nil } @@ -19515,6 +19946,53 @@ func (m *BatchResponse_Header) Size() (n int) { return n } +func (m *RangeLookupRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.ReadConsistency != 0 { + n += 1 + sovApi(uint64(m.ReadConsistency)) + } + if m.PrefetchNum != 0 { + n += 1 + sovApi(uint64(m.PrefetchNum)) + } + if m.PrefetchReverse { + n += 2 + } + return n +} + +func (m *RangeLookupResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Descriptors) > 0 { + for _, e := range m.Descriptors { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.PrefetchedDescriptors) > 0 { + for _, e := range m.PrefetchedDescriptors { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovApi(uint64(l)) + } + return n +} + func (m *RangeFeedRequest) Size() (n int) { if m == nil { return 0 @@ -19593,6 +20071,44 @@ func (m *RangeFeedEvent) Size() (n int) { return n } +func (m *GossipSubscriptionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Patterns) > 0 { + for _, s := range m.Patterns { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + return n +} + +func (m *GossipSubscriptionEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + l = m.Content.Size() + n += 1 + l + sovApi(uint64(l)) + l = len(m.PatternMatched) + if l > 0 { + n += 1 + l + sovApi(uint64(l)) + } + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovApi(uint64(l)) + } + return n +} + func sovApi(x uint64) (n int) { for { n++ @@ -36923,38 +37439,322 @@ func (m *BatchResponse_Header) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Now.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CollectedSpans", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.Now.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CollectedSpans", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CollectedSpans = append(m.CollectedSpans, tracing.RecordedSpan{}) + if err := m.CollectedSpans[len(m.CollectedSpans)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RangeLookupRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeLookupRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeLookupRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadConsistency", wireType) + } + m.ReadConsistency = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ReadConsistency |= (ReadConsistencyType(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrefetchNum", wireType) + } + m.PrefetchNum = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PrefetchNum |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrefetchReverse", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.PrefetchReverse = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RangeLookupResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RangeLookupResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RangeLookupResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Descriptors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Descriptors = append(m.Descriptors, RangeDescriptor{}) + if err := m.Descriptors[len(m.Descriptors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PrefetchedDescriptors", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PrefetchedDescriptors = append(m.PrefetchedDescriptors, RangeDescriptor{}) + if err := m.PrefetchedDescriptors[len(m.PrefetchedDescriptors)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &Error{} } - m.CollectedSpans = append(m.CollectedSpans, tracing.RecordedSpan{}) - if err := m.CollectedSpans[len(m.CollectedSpans)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -37589,6 +38389,256 @@ func (m *RangeFeedEvent) Unmarshal(dAtA []byte) error { } return nil } +func (m *GossipSubscriptionRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GossipSubscriptionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GossipSubscriptionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Patterns", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Patterns = append(m.Patterns, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GossipSubscriptionEvent) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GossipSubscriptionEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GossipSubscriptionEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Content", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Content.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PatternMatched", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PatternMatched = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &Error{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipApi(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 @@ -37694,473 +38744,487 @@ var ( ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_f43a565490f66766) } +func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_a5b93ff81643c6e6) } -var fileDescriptor_api_f43a565490f66766 = []byte{ - // 7429 bytes of a gzipped FileDescriptorProto +var fileDescriptor_api_a5b93ff81643c6e6 = []byte{ + // 7655 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5d, 0x68, 0x24, 0xd9, - 0x75, 0xbf, 0xaa, 0xbb, 0xd5, 0xea, 0x3e, 0xdd, 0x6a, 0x95, 0xae, 0x34, 0x33, 0x3d, 0x9a, 0x59, - 0x49, 0xd3, 0x3b, 0x5f, 0x3b, 0xde, 0x95, 0x76, 0x66, 0x76, 0xff, 0xbb, 0xde, 0x59, 0xaf, 0x2d, - 0xb5, 0x7a, 0xa6, 0x25, 0x8d, 0x34, 0x9a, 0xea, 0xd6, 0xac, 0x77, 0xed, 0xa5, 0x5c, 0xaa, 0xba, - 0x6a, 0x95, 0xd5, 0x5d, 0xd5, 0x53, 0x55, 0xad, 0x8f, 0x81, 0x3f, 0x38, 0xc9, 0x83, 0x83, 0x09, - 0x4b, 0x1e, 0x42, 0x08, 0x71, 0x82, 0x17, 0x12, 0x70, 0xc0, 0x38, 0x24, 0x79, 0x4b, 0x70, 0x70, - 0x1e, 0x12, 0xd8, 0x18, 0x07, 0x4c, 0x20, 0xb1, 0x09, 0x44, 0xd8, 0x63, 0x30, 0xc6, 0x0f, 0x81, - 0xbc, 0x24, 0xb0, 0x90, 0x10, 0xee, 0x47, 0x7d, 0x74, 0x77, 0xf5, 0x87, 0xc6, 0xb5, 0xc9, 0x82, - 0x5f, 0x9a, 0xae, 0x53, 0xf7, 0x9c, 0xba, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, 0xbf, 0x5b, 0xe7, 0xde, - 0x82, 0x49, 0xcb, 0x54, 0xd4, 0xbd, 0xe6, 0xce, 0xa2, 0xd2, 0xd4, 0x17, 0x9a, 0x96, 0xe9, 0x98, - 0x68, 0x52, 0x35, 0xd5, 0x7d, 0x4a, 0x5e, 0xe0, 0x37, 0x67, 0x6e, 0xec, 0x1f, 0x2c, 0xee, 0x1f, - 0xd8, 0xd8, 0x3a, 0xc0, 0xd6, 0xa2, 0x6a, 0x1a, 0x6a, 0xcb, 0xb2, 0xb0, 0xa1, 0x1e, 0x2f, 0xd6, - 0x4d, 0x75, 0x9f, 0xfe, 0xe8, 0x46, 0x8d, 0xb1, 0xcf, 0x20, 0x57, 0xa2, 0xa6, 0x38, 0x0a, 0xa7, - 0x4d, 0xbb, 0x34, 0x6c, 0x59, 0xa6, 0x65, 0x73, 0xea, 0x59, 0x97, 0xda, 0xc0, 0x8e, 0x12, 0x28, - 0x7d, 0xc1, 0x76, 0x4c, 0x4b, 0xa9, 0xe1, 0x45, 0x6c, 0xd4, 0x74, 0x03, 0x93, 0x02, 0x07, 0xaa, - 0xca, 0x6f, 0x5e, 0x0c, 0xbd, 0x79, 0x9b, 0xdf, 0xcd, 0xb7, 0x1c, 0xbd, 0xbe, 0xb8, 0x57, 0x57, - 0x17, 0x1d, 0xbd, 0x81, 0x6d, 0x47, 0x69, 0x34, 0xf9, 0x9d, 0x79, 0x7a, 0xc7, 0xb1, 0x14, 0x55, - 0x37, 0x6a, 0x8b, 0x16, 0x56, 0x4d, 0x4b, 0xc3, 0x9a, 0x6c, 0x37, 0x15, 0xc3, 0xad, 0x64, 0xcd, - 0xac, 0x99, 0xf4, 0xef, 0x22, 0xf9, 0xc7, 0xa8, 0x85, 0xef, 0x08, 0x30, 0x2e, 0xe1, 0xc7, 0x2d, - 0x6c, 0x3b, 0x65, 0xac, 0x68, 0xd8, 0x42, 0xe7, 0x21, 0xbe, 0x8f, 0x8f, 0xf3, 0xf1, 0x79, 0xe1, - 0x7a, 0x76, 0x79, 0xec, 0xa3, 0x93, 0xb9, 0xf8, 0x3a, 0x3e, 0x96, 0x08, 0x0d, 0xcd, 0xc3, 0x18, - 0x36, 0x34, 0x99, 0xdc, 0x4e, 0xb4, 0xdf, 0x4e, 0x62, 0x43, 0x5b, 0xc7, 0xc7, 0xe8, 0x8b, 0x90, - 0xb2, 0x89, 0x34, 0x43, 0xc5, 0xf9, 0xd1, 0x79, 0xe1, 0xfa, 0xe8, 0xf2, 0xe7, 0x3e, 0x3a, 0x99, - 0x7b, 0xb3, 0xa6, 0x3b, 0x7b, 0xad, 0x9d, 0x05, 0xd5, 0x6c, 0x2c, 0x7a, 0xda, 0xd7, 0x76, 0xfc, - 0xff, 0x8b, 0xcd, 0xfd, 0xda, 0x62, 0x67, 0xcb, 0x17, 0xaa, 0x47, 0x46, 0x05, 0x3f, 0x96, 0x3c, - 0x89, 0x6f, 0x24, 0x7e, 0xfe, 0xc1, 0x9c, 0xb0, 0x96, 0x48, 0x09, 0x62, 0x6c, 0x2d, 0x91, 0x8a, - 0x89, 0xf1, 0xc2, 0xfb, 0x71, 0xc8, 0x49, 0xd8, 0x6e, 0x9a, 0x86, 0x8d, 0x79, 0xfd, 0x5f, 0x86, - 0xb8, 0x73, 0x64, 0xd0, 0xfa, 0x67, 0x6e, 0xcd, 0x2e, 0x74, 0xf5, 0xf6, 0x42, 0xd5, 0x52, 0x0c, - 0x5b, 0x51, 0x1d, 0xdd, 0x34, 0x24, 0x52, 0x14, 0xbd, 0x0e, 0x19, 0x0b, 0xdb, 0xad, 0x06, 0xa6, - 0xea, 0xa2, 0x4d, 0xcb, 0xdc, 0x3a, 0x17, 0xc2, 0x59, 0x69, 0x2a, 0x86, 0x04, 0xac, 0x2c, 0xf9, - 0x8f, 0xce, 0x43, 0xca, 0x68, 0x35, 0x88, 0x42, 0x6c, 0xda, 0xdc, 0xb8, 0x34, 0x66, 0xb4, 0x1a, - 0xeb, 0xf8, 0xd8, 0x46, 0x45, 0xc8, 0x58, 0x8a, 0x51, 0xc3, 0xb2, 0x6e, 0xec, 0x9a, 0x76, 0x3e, - 0x39, 0x1f, 0xbf, 0x9e, 0xb9, 0x75, 0x31, 0x44, 0xa8, 0x44, 0x4a, 0xad, 0x1a, 0xbb, 0xe6, 0x72, - 0xe2, 0xc3, 0x93, 0xb9, 0x11, 0x09, 0x2c, 0x97, 0x60, 0xa3, 0x0a, 0x8c, 0xf3, 0x9a, 0x59, 0x58, - 0xb1, 0x4d, 0x23, 0x3f, 0x36, 0x2f, 0x5c, 0xcf, 0xdd, 0x5a, 0x08, 0x13, 0xd3, 0xa6, 0x05, 0x72, - 0xd9, 0x6a, 0x60, 0x89, 0x72, 0x49, 0x59, 0x2b, 0x70, 0x85, 0x2e, 0x40, 0x9a, 0x54, 0x7a, 0xe7, - 0xd8, 0xc1, 0x76, 0x3e, 0x45, 0x6b, 0x4d, 0x5a, 0xb1, 0x4c, 0xae, 0x0b, 0x6f, 0x41, 0x36, 0xc8, - 0x8a, 0x10, 0xe4, 0xa4, 0x52, 0x65, 0x7b, 0xa3, 0x24, 0x6f, 0x6f, 0xae, 0x6f, 0x3e, 0x78, 0x7b, - 0x53, 0x1c, 0x41, 0xd3, 0x20, 0x72, 0xda, 0x7a, 0xe9, 0x1d, 0xf9, 0xfe, 0xea, 0xc6, 0x6a, 0x55, - 0x14, 0x66, 0x12, 0xbf, 0xf9, 0x47, 0xb3, 0x23, 0x85, 0x47, 0x00, 0xf7, 0xb0, 0xc3, 0x2d, 0x0a, - 0x2d, 0x43, 0x72, 0x8f, 0xd6, 0x27, 0x2f, 0x50, 0xa5, 0xce, 0x87, 0x56, 0x3c, 0x60, 0x7d, 0xcb, - 0x29, 0xa2, 0x83, 0x1f, 0x9c, 0xcc, 0x09, 0x12, 0xe7, 0x64, 0x9d, 0x5e, 0xf8, 0xae, 0x00, 0x19, - 0x2a, 0x98, 0xb5, 0x12, 0x15, 0x3b, 0x24, 0x5f, 0x1a, 0xa8, 0x92, 0x6e, 0xd1, 0x68, 0x01, 0x46, - 0x0f, 0x94, 0x7a, 0x0b, 0xe7, 0x63, 0x54, 0x46, 0x3e, 0x44, 0xc6, 0x23, 0x72, 0x5f, 0x62, 0xc5, - 0xd0, 0x1d, 0xc8, 0xea, 0x86, 0x83, 0x0d, 0x47, 0x66, 0x6c, 0xf1, 0x01, 0x6c, 0x19, 0x56, 0x9a, - 0x5e, 0x14, 0xfe, 0x4a, 0x00, 0xd8, 0x6a, 0x45, 0xa9, 0x1a, 0xf4, 0xca, 0x90, 0xf5, 0xe7, 0x96, - 0xc5, 0x5b, 0x71, 0x16, 0x92, 0xba, 0x51, 0xd7, 0x0d, 0x56, 0xff, 0x94, 0xc4, 0xaf, 0xd0, 0x34, - 0x8c, 0xee, 0xd4, 0x75, 0x43, 0xa3, 0x03, 0x20, 0x25, 0xb1, 0x0b, 0xae, 0x7e, 0x09, 0x32, 0xb4, - 0xee, 0x11, 0x6a, 0xbf, 0xf0, 0xfd, 0x18, 0x9c, 0x29, 0x9a, 0x86, 0xa6, 0x93, 0x91, 0xa8, 0xd4, - 0x3f, 0x11, 0xba, 0x59, 0x83, 0x69, 0x0d, 0x37, 0x2d, 0xac, 0x2a, 0x0e, 0xd6, 0x64, 0x7c, 0xd4, - 0x1c, 0xb2, 0xa7, 0x91, 0xcf, 0x55, 0x3a, 0x6a, 0x52, 0x5a, 0xb8, 0x3e, 0xd1, 0x2b, 0x70, 0x4e, - 0xa9, 0xd7, 0xcd, 0x43, 0x59, 0xdf, 0x95, 0x35, 0x13, 0xdb, 0xb2, 0x61, 0x3a, 0x32, 0x3e, 0xd2, - 0x6d, 0x87, 0x7a, 0x90, 0x94, 0x34, 0x45, 0x6f, 0xaf, 0xee, 0xae, 0x98, 0xd8, 0xde, 0x34, 0x9d, - 0x12, 0xb9, 0x45, 0xc6, 0x2c, 0xa9, 0x0c, 0x1b, 0xb3, 0x49, 0xe2, 0x7b, 0xa5, 0x14, 0x3e, 0x6a, - 0xd2, 0x31, 0xcb, 0xbb, 0xe8, 0x3d, 0x38, 0xdb, 0xa9, 0xcd, 0x28, 0x7b, 0xeb, 0x1f, 0x05, 0xc8, - 0xad, 0x1a, 0xba, 0xf3, 0x89, 0xe8, 0x26, 0x4f, 0xb5, 0xf1, 0xa0, 0x6a, 0x6f, 0x80, 0xb8, 0xab, - 0xe8, 0xf5, 0x07, 0x46, 0xd5, 0x6c, 0xec, 0xd8, 0x8e, 0x69, 0x60, 0x9b, 0xeb, 0xbe, 0x8b, 0xce, - 0x75, 0xf6, 0x08, 0x26, 0xbc, 0x36, 0x45, 0xa9, 0xac, 0x27, 0x20, 0xae, 0x1a, 0xaa, 0x85, 0x1b, - 0xd8, 0x88, 0x54, 0x5b, 0x17, 0x21, 0xad, 0xbb, 0x72, 0xa9, 0xc6, 0xe2, 0x92, 0x4f, 0xe0, 0x6d, - 0x6a, 0xc1, 0x64, 0xe0, 0xd9, 0x51, 0xba, 0x4b, 0x32, 0x71, 0xe0, 0x43, 0xd9, 0xef, 0x2f, 0x32, - 0x71, 0xe0, 0x43, 0xe6, 0xde, 0xde, 0x81, 0xf1, 0x15, 0x5c, 0xc7, 0x0e, 0x8e, 0xde, 0xf7, 0x6f, - 0x43, 0xce, 0x15, 0x1d, 0x65, 0x27, 0xfd, 0xa1, 0x00, 0x88, 0xcb, 0x25, 0x33, 0x6e, 0x94, 0xfd, - 0x34, 0x47, 0x22, 0x0a, 0xa7, 0x65, 0x19, 0x2c, 0x34, 0x60, 0x56, 0x0a, 0x8c, 0x44, 0xa3, 0x03, - 0xdf, 0x07, 0x27, 0x82, 0x3e, 0xd8, 0x8b, 0x70, 0x48, 0x6c, 0x73, 0x08, 0x53, 0x6d, 0xd5, 0x8b, - 0xb6, 0x2b, 0x13, 0xb4, 0x66, 0xb1, 0xf9, 0x78, 0x30, 0x8c, 0xa3, 0xc4, 0xc2, 0x7b, 0x30, 0x59, - 0xac, 0x63, 0xc5, 0x8a, 0x5a, 0x2d, 0xbc, 0x3b, 0xdf, 0x01, 0x14, 0x14, 0x1f, 0x65, 0x97, 0xfe, - 0xb1, 0x00, 0x48, 0xc2, 0x07, 0xd8, 0x72, 0x22, 0xef, 0xd2, 0x15, 0xc8, 0x38, 0x8a, 0x55, 0xc3, - 0x8e, 0x4c, 0x42, 0x6f, 0xee, 0xae, 0x9e, 0x0b, 0x08, 0x22, 0x01, 0xf8, 0xc2, 0x5e, 0x5d, 0x5d, - 0xa8, 0xba, 0xa1, 0xb9, 0x1b, 0xd0, 0x31, 0x3e, 0x42, 0xe6, 0x1a, 0x78, 0x17, 0xa6, 0xda, 0x6a, - 0x19, 0xa5, 0x0a, 0xfe, 0x43, 0x80, 0x4c, 0x45, 0x55, 0x8c, 0x28, 0xdb, 0xfe, 0x16, 0x64, 0x6c, - 0x55, 0x31, 0xe4, 0x5d, 0xd3, 0x6a, 0x28, 0x0e, 0x35, 0xd9, 0x5c, 0x5b, 0xdb, 0xbd, 0x00, 0x59, - 0x55, 0x8c, 0xbb, 0xb4, 0x90, 0x04, 0xb6, 0xf7, 0x1f, 0x3d, 0x84, 0xcc, 0x3e, 0x3e, 0x96, 0x39, - 0x90, 0xa2, 0xf3, 0x5c, 0xee, 0xd6, 0xcb, 0x01, 0xfe, 0xfd, 0x83, 0x05, 0x17, 0x7f, 0x2d, 0x04, - 0xf0, 0xd7, 0x02, 0xe1, 0x58, 0xa8, 0x38, 0x16, 0x36, 0x6a, 0xce, 0x9e, 0x04, 0xfb, 0xf8, 0xf8, - 0x3e, 0x93, 0x11, 0x1c, 0x28, 0x6b, 0x89, 0x54, 0x5c, 0x4c, 0x14, 0xfe, 0x53, 0x80, 0x2c, 0x6b, - 0x78, 0x94, 0x03, 0xe5, 0x55, 0x48, 0x58, 0xe6, 0x21, 0x1b, 0x28, 0x99, 0x5b, 0x17, 0x42, 0x44, - 0xac, 0xe3, 0xe3, 0xe0, 0x0c, 0x45, 0x8b, 0xa3, 0x65, 0xe0, 0xb1, 0x9f, 0x4c, 0xb9, 0xe3, 0xc3, - 0x72, 0x03, 0xe3, 0x92, 0x88, 0x8c, 0x6b, 0x30, 0xb1, 0xa3, 0x38, 0xea, 0x9e, 0x6c, 0xf1, 0x4a, - 0x92, 0xd9, 0x2c, 0x7e, 0x3d, 0x2b, 0xe5, 0x28, 0xd9, 0xad, 0xba, 0x5d, 0xf8, 0x2f, 0xd7, 0xea, - 0x6d, 0xfc, 0x2b, 0xd9, 0xf3, 0xff, 0x2d, 0xf0, 0xf1, 0xe4, 0xb6, 0xff, 0x57, 0xcd, 0x00, 0xbe, - 0x11, 0x83, 0x73, 0xc5, 0x3d, 0xac, 0xee, 0x17, 0x4d, 0xc3, 0xd6, 0x6d, 0x87, 0x68, 0x30, 0x4a, - 0x2b, 0xb8, 0x00, 0xe9, 0x43, 0xdd, 0xd9, 0x93, 0x35, 0x7d, 0x77, 0x97, 0x7a, 0xbe, 0x94, 0x94, - 0x22, 0x84, 0x15, 0x7d, 0x77, 0x17, 0xdd, 0x86, 0x44, 0xc3, 0xd4, 0x58, 0x88, 0x9c, 0xbb, 0x35, - 0x17, 0x22, 0x9e, 0x56, 0xcd, 0x6e, 0x35, 0x36, 0x4c, 0x0d, 0x4b, 0xb4, 0x30, 0x9a, 0x05, 0x50, - 0x09, 0xb5, 0x69, 0xea, 0x86, 0xc3, 0xe7, 0xc0, 0x00, 0x05, 0x95, 0x21, 0xed, 0x60, 0xab, 0xa1, - 0x1b, 0x8a, 0x83, 0xf3, 0xa3, 0x54, 0x79, 0x97, 0x43, 0x2b, 0xde, 0xac, 0xeb, 0xaa, 0xb2, 0x82, - 0x6d, 0xd5, 0xd2, 0x9b, 0x8e, 0x69, 0x71, 0x2d, 0xfa, 0xcc, 0xdc, 0xe3, 0xbe, 0x9f, 0x80, 0x7c, - 0xb7, 0x86, 0xa2, 0xb4, 0x93, 0x2d, 0x48, 0x12, 0x94, 0x5d, 0x77, 0xb8, 0xa5, 0xdc, 0xea, 0xa5, - 0x88, 0x90, 0x1a, 0x50, 0xb4, 0x5e, 0x77, 0x78, 0xe5, 0xb9, 0x9c, 0x99, 0xef, 0x08, 0x90, 0x64, - 0x37, 0xd0, 0x4d, 0x48, 0xf1, 0xc5, 0x04, 0x8d, 0xd6, 0x31, 0xbe, 0x7c, 0xf6, 0xe9, 0xc9, 0xdc, - 0x18, 0x5b, 0x3a, 0x58, 0xf9, 0xc8, 0xff, 0x2b, 0x8d, 0xb1, 0xd5, 0x03, 0x8d, 0xf4, 0x99, 0xed, - 0x28, 0x96, 0x43, 0x57, 0x6b, 0x62, 0x0c, 0x31, 0x50, 0xc2, 0x3a, 0x3e, 0x46, 0x6b, 0x90, 0xb4, - 0x1d, 0xc5, 0x69, 0xd9, 0xbc, 0xd7, 0x4e, 0x55, 0xd9, 0x0a, 0xe5, 0x94, 0xb8, 0x04, 0x12, 0xca, - 0x68, 0xd8, 0x51, 0xf4, 0x3a, 0xed, 0xc6, 0xb4, 0xc4, 0xaf, 0x0a, 0x5f, 0x17, 0x20, 0xc9, 0x8a, - 0xa2, 0x73, 0x30, 0x25, 0x2d, 0x6d, 0xde, 0x2b, 0xc9, 0xab, 0x9b, 0x2b, 0xa5, 0x6a, 0x49, 0xda, - 0x58, 0xdd, 0x5c, 0xaa, 0x96, 0xc4, 0x11, 0x74, 0x16, 0x90, 0x7b, 0xa3, 0xf8, 0x60, 0xb3, 0xb2, - 0x5a, 0xa9, 0x96, 0x36, 0xab, 0xa2, 0x40, 0x57, 0x18, 0x28, 0x3d, 0x40, 0x8d, 0xa1, 0xcb, 0x30, - 0xdf, 0x49, 0x95, 0x2b, 0xd5, 0xa5, 0x6a, 0x45, 0x2e, 0x55, 0xaa, 0xab, 0x1b, 0x4b, 0xd5, 0xd2, - 0x8a, 0x18, 0xef, 0x53, 0x8a, 0x3c, 0x44, 0x92, 0x4a, 0xc5, 0xaa, 0x98, 0x28, 0x3c, 0x81, 0x33, - 0x12, 0x56, 0xcd, 0x46, 0xb3, 0xe5, 0x60, 0x52, 0x4b, 0x3b, 0xca, 0xf1, 0x72, 0x0e, 0xc6, 0x34, - 0xeb, 0x58, 0xb6, 0x5a, 0x06, 0x1f, 0x2d, 0x49, 0xcd, 0x3a, 0x96, 0x5a, 0x06, 0x37, 0xc6, 0x3f, - 0x13, 0xe0, 0x6c, 0xe7, 0xc3, 0xa3, 0x34, 0xc5, 0x87, 0x90, 0x51, 0x34, 0x0d, 0x6b, 0xb2, 0x86, - 0xeb, 0x8e, 0xc2, 0x43, 0x95, 0x1b, 0x01, 0x49, 0x7c, 0xa5, 0x6d, 0xc1, 0x5b, 0x69, 0xdb, 0x78, - 0x54, 0x2c, 0xd2, 0x8a, 0xac, 0x10, 0x0e, 0xd7, 0x15, 0x51, 0x21, 0x94, 0x52, 0xf8, 0x8b, 0x04, - 0x8c, 0x97, 0x0c, 0xad, 0x7a, 0x14, 0xe9, 0xec, 0x72, 0x16, 0x92, 0xaa, 0xd9, 0x68, 0xe8, 0x8e, - 0xab, 0x26, 0x76, 0x85, 0x3e, 0x0d, 0x29, 0x0d, 0x2b, 0x9a, 0xb7, 0x46, 0x31, 0x28, 0xd0, 0x92, - 0xbc, 0xe2, 0xe8, 0x4b, 0x70, 0x8e, 0x78, 0x50, 0xcb, 0x50, 0xea, 0x32, 0x93, 0x26, 0x3b, 0x96, - 0x5e, 0xab, 0x61, 0x8b, 0xaf, 0xeb, 0x5d, 0x0f, 0xa9, 0xe7, 0x2a, 0xe7, 0x28, 0x52, 0x86, 0x2a, - 0x2b, 0x2f, 0x9d, 0xd1, 0xc3, 0xc8, 0xe8, 0x4d, 0x00, 0x32, 0x39, 0xd1, 0xb5, 0x42, 0x9b, 0xfb, - 0xa6, 0x5e, 0x8b, 0x85, 0xae, 0x3b, 0x22, 0x0c, 0xe4, 0xda, 0x46, 0x8b, 0x04, 0x19, 0x3c, 0x6e, - 0xe9, 0x16, 0x96, 0x6f, 0x36, 0x55, 0x0a, 0xe5, 0x53, 0xcb, 0xb9, 0xa7, 0x27, 0x73, 0x20, 0x31, - 0xf2, 0xcd, 0xad, 0x22, 0x41, 0x0a, 0xec, 0x7f, 0x53, 0x45, 0xcb, 0x30, 0x4b, 0x26, 0x60, 0xde, - 0x16, 0xc5, 0x91, 0xf7, 0xf4, 0xda, 0x1e, 0xb6, 0x64, 0x6f, 0x01, 0x98, 0x2e, 0xe1, 0xa5, 0xa4, - 0x19, 0x55, 0x31, 0x58, 0x45, 0x97, 0x9c, 0x32, 0x2d, 0xe2, 0xa9, 0x87, 0xe8, 0xb9, 0x69, 0xea, - 0xb6, 0x69, 0xe4, 0xd3, 0x4c, 0xcf, 0xec, 0x0a, 0x3d, 0x04, 0x51, 0x37, 0xe4, 0xdd, 0xba, 0x5e, - 0xdb, 0x73, 0xe4, 0x43, 0x4b, 0x77, 0xb0, 0x9d, 0x9f, 0xa4, 0x0d, 0x0a, 0xb3, 0xbb, 0x0a, 0x5f, - 0x86, 0xd5, 0xde, 0x26, 0x25, 0x79, 0xd3, 0x72, 0xba, 0x71, 0x97, 0xf2, 0x53, 0xa2, 0xed, 0xcd, - 0xce, 0x63, 0x62, 0xaa, 0xf0, 0xaf, 0x02, 0xe4, 0x5c, 0xa3, 0x89, 0xd2, 0xbe, 0xaf, 0x83, 0x68, - 0x1a, 0x58, 0x6e, 0xee, 0x29, 0x36, 0xe6, 0x8a, 0xe1, 0x53, 0x48, 0xce, 0x34, 0xf0, 0x16, 0x21, - 0x33, 0x4d, 0xa0, 0x2d, 0x98, 0xb4, 0x1d, 0xa5, 0xa6, 0x1b, 0xb5, 0x80, 0xbe, 0x46, 0x87, 0x0f, - 0xdd, 0x45, 0xce, 0xed, 0xd1, 0xdb, 0xe2, 0x8e, 0x1f, 0x0a, 0x30, 0xb9, 0xa4, 0x35, 0x74, 0xa3, - 0xd2, 0xac, 0xeb, 0x91, 0xe2, 0xfc, 0xcb, 0x90, 0xb6, 0x89, 0x4c, 0xdf, 0x79, 0xfb, 0x18, 0x2d, - 0x45, 0xef, 0x10, 0x2f, 0x7e, 0x1f, 0x26, 0xf0, 0x51, 0x53, 0xb7, 0x14, 0x47, 0x37, 0x0d, 0x06, - 0x4b, 0x12, 0xc3, 0xb7, 0x2d, 0xe7, 0xf3, 0xfa, 0xd0, 0x84, 0xb7, 0xec, 0x1d, 0x40, 0xc1, 0x86, - 0x45, 0x89, 0x4f, 0x64, 0x98, 0xa2, 0xa2, 0xb7, 0x0d, 0x3b, 0x62, 0xad, 0x71, 0xef, 0xfa, 0x05, - 0x98, 0x6e, 0x7f, 0x40, 0x94, 0xb5, 0x7f, 0x8f, 0xf7, 0xf8, 0x06, 0xb6, 0x3e, 0x26, 0x68, 0x1c, - 0x14, 0x1f, 0x65, 0xcd, 0xbf, 0x26, 0xc0, 0x79, 0x2a, 0x9b, 0xbe, 0xfe, 0xd8, 0xc5, 0xd6, 0x7d, - 0xac, 0xd8, 0x91, 0x22, 0xe4, 0xe7, 0x21, 0xc9, 0x90, 0x2e, 0xb5, 0xd8, 0xd1, 0xe5, 0x0c, 0x89, - 0x4b, 0x2a, 0x8e, 0x69, 0x91, 0xb8, 0x84, 0xdf, 0xe2, 0xed, 0x54, 0x60, 0x26, 0xac, 0x2e, 0x11, - 0x2f, 0x05, 0x4c, 0xf2, 0xf0, 0x90, 0x98, 0x78, 0x71, 0x8f, 0xc4, 0x45, 0xa8, 0x04, 0x19, 0x95, - 0xfe, 0x93, 0x9d, 0xe3, 0x26, 0xa6, 0xf2, 0x73, 0xfd, 0x22, 0x4b, 0xc6, 0x56, 0x3d, 0x6e, 0x62, - 0x12, 0x9e, 0xba, 0xff, 0x89, 0xba, 0x02, 0x4d, 0xed, 0x1b, 0x9b, 0xd2, 0xf1, 0x45, 0xcb, 0xba, - 0xe1, 0x5d, 0x9b, 0x26, 0xfe, 0x32, 0xce, 0x55, 0xc1, 0x9e, 0xc4, 0x99, 0x22, 0x8d, 0x46, 0xde, - 0x85, 0xb3, 0x81, 0x35, 0xed, 0x60, 0xf3, 0x63, 0xa7, 0x68, 0x7e, 0x60, 0x5d, 0xdc, 0xa7, 0xa2, - 0x77, 0x20, 0xb0, 0xf2, 0x2d, 0xb3, 0x96, 0xb9, 0x68, 0xe7, 0x34, 0x4a, 0x99, 0xf4, 0xa5, 0x30, - 0xba, 0x8d, 0x8a, 0x90, 0xc2, 0x47, 0x4d, 0x59, 0xc3, 0xb6, 0xca, 0xdd, 0x5a, 0xa1, 0xd7, 0xdb, - 0xb3, 0xae, 0xf8, 0x7f, 0x0c, 0x1f, 0x35, 0x09, 0x11, 0x6d, 0x93, 0x19, 0xce, 0x0d, 0x07, 0x68, - 0xb5, 0xed, 0xc1, 0x70, 0xc2, 0xb7, 0x17, 0x2e, 0x6e, 0xc2, 0x8b, 0x04, 0x98, 0x08, 0xde, 0x77, - 0x1f, 0x08, 0x70, 0x21, 0xb4, 0xef, 0xa2, 0x9c, 0xec, 0xde, 0x84, 0x04, 0x55, 0x41, 0xec, 0x94, - 0x2a, 0xa0, 0x5c, 0x85, 0x6f, 0xb9, 0xa3, 0x5e, 0xc2, 0x75, 0x93, 0xa8, 0xf7, 0x63, 0x58, 0x17, - 0x1b, 0x73, 0xbb, 0x3d, 0x76, 0xea, 0x6e, 0x77, 0x59, 0x3b, 0xdc, 0x42, 0x47, 0x65, 0xa3, 0x74, - 0x0b, 0xbf, 0x2b, 0xc0, 0x54, 0x19, 0x2b, 0x96, 0xb3, 0x83, 0x15, 0x27, 0xe2, 0x70, 0xf6, 0x55, - 0x88, 0x1b, 0xe6, 0xe1, 0x69, 0x96, 0x06, 0x49, 0x79, 0x7f, 0xda, 0x6a, 0xaf, 0x57, 0x94, 0xad, - 0xfe, 0xfb, 0x18, 0xa4, 0xef, 0x15, 0xa3, 0x6c, 0xeb, 0x9b, 0x7c, 0x01, 0x99, 0x0d, 0xf5, 0x30, - 0xb3, 0xf4, 0x9e, 0xb7, 0x70, 0xaf, 0xb8, 0x8e, 0x8f, 0x5d, 0xb3, 0x24, 0x5c, 0x68, 0x09, 0xd2, - 0xce, 0x9e, 0x85, 0xed, 0x3d, 0xb3, 0xae, 0x9d, 0x26, 0x66, 0xf1, 0xb9, 0x66, 0xf6, 0x61, 0x94, - 0xca, 0x75, 0xf3, 0x15, 0x84, 0x90, 0x7c, 0x05, 0xf2, 0x18, 0x2f, 0xec, 0x8b, 0x9d, 0xe6, 0x31, - 0x2e, 0x81, 0x75, 0x8e, 0x17, 0x1b, 0x8d, 0x8a, 0xc9, 0xc2, 0x43, 0x00, 0xd2, 0xb4, 0x28, 0xbb, - 0xe7, 0xb7, 0xe2, 0x90, 0xdb, 0x6a, 0xd9, 0x7b, 0x11, 0xdb, 0x63, 0x11, 0xa0, 0xd9, 0xb2, 0x29, - 0x58, 0x38, 0x32, 0x78, 0xfb, 0x07, 0x24, 0x44, 0xb8, 0x0a, 0x60, 0x7c, 0xd5, 0x23, 0x03, 0x95, - 0xb9, 0x10, 0x2c, 0xfb, 0x59, 0x15, 0xcf, 0xf7, 0xc3, 0x92, 0xd5, 0x23, 0x63, 0x03, 0x7b, 0x20, - 0x92, 0x49, 0xc2, 0x44, 0xd2, 0x9b, 0x30, 0x46, 0x2e, 0x64, 0xc7, 0x3c, 0x4d, 0x97, 0x27, 0x09, - 0x4f, 0xd5, 0x44, 0x77, 0x20, 0xcd, 0xb8, 0xc9, 0xc4, 0x95, 0xa4, 0x13, 0x57, 0x58, 0x5b, 0xb8, - 0x1a, 0xe9, 0x94, 0x95, 0xa2, 0xac, 0x64, 0x9a, 0x9a, 0x86, 0xd1, 0x5d, 0xd3, 0x52, 0x31, 0xcd, - 0x9f, 0x48, 0x49, 0xec, 0x22, 0xd8, 0xab, 0x6b, 0x89, 0x54, 0x4a, 0x4c, 0xaf, 0x25, 0x52, 0x69, - 0x11, 0x0a, 0x5f, 0x17, 0x60, 0xc2, 0xeb, 0x8e, 0x28, 0x7d, 0x79, 0xb1, 0x4d, 0x97, 0xa7, 0xef, - 0x10, 0xa2, 0xc6, 0xc2, 0x3f, 0xd0, 0xc0, 0x46, 0x35, 0x0f, 0x68, 0xff, 0x44, 0x69, 0x2f, 0x77, - 0x58, 0xe6, 0x4c, 0xec, 0xb4, 0x7d, 0x4c, 0x93, 0x68, 0x6e, 0xc2, 0xb4, 0xde, 0x20, 0x5e, 0x5e, - 0x77, 0xea, 0xc7, 0x1c, 0x95, 0x39, 0xd8, 0x7d, 0x43, 0x3b, 0xe5, 0xdf, 0x2b, 0xba, 0xb7, 0xb8, - 0xe3, 0x63, 0xef, 0x6c, 0xfc, 0xf6, 0x44, 0xa9, 0xf0, 0x55, 0x18, 0xb7, 0x98, 0x68, 0x12, 0x9d, - 0x9c, 0x52, 0xe7, 0x59, 0x8f, 0x95, 0xa8, 0xfd, 0x9b, 0x31, 0x98, 0x78, 0xd8, 0xc2, 0xd6, 0xf1, - 0x27, 0x49, 0xe9, 0x57, 0x61, 0xe2, 0x50, 0xd1, 0x1d, 0x79, 0xd7, 0xb4, 0xe4, 0x56, 0x53, 0x53, - 0x1c, 0x37, 0xa7, 0x63, 0x9c, 0x90, 0xef, 0x9a, 0xd6, 0x36, 0x25, 0x22, 0x0c, 0x68, 0xdf, 0x30, - 0x0f, 0x0d, 0x99, 0x90, 0x29, 0x1a, 0x3e, 0x32, 0xf8, 0x62, 0xf2, 0xf2, 0x6b, 0xff, 0x72, 0x32, - 0x77, 0x7b, 0xa8, 0x04, 0x2d, 0x9a, 0x62, 0xd6, 0x6a, 0xe9, 0xda, 0xc2, 0xf6, 0xf6, 0xea, 0x8a, - 0x24, 0x52, 0x91, 0x6f, 0x33, 0x89, 0xd5, 0x23, 0xc3, 0x9d, 0xc5, 0x3f, 0x12, 0x40, 0xf4, 0x35, - 0x15, 0x65, 0x77, 0x96, 0x20, 0xf3, 0xb8, 0x85, 0x2d, 0xfd, 0x19, 0x3a, 0x13, 0x38, 0x23, 0x71, - 0x44, 0xef, 0x42, 0xb6, 0x4d, 0x0f, 0xf1, 0x5f, 0x4e, 0x0f, 0x99, 0x43, 0x5f, 0x05, 0x85, 0xbf, - 0x13, 0x00, 0xd1, 0xc6, 0xaf, 0xb2, 0x75, 0xfc, 0x4f, 0x8a, 0xa5, 0x5c, 0x07, 0x91, 0x26, 0x27, - 0xca, 0xfa, 0xae, 0xdc, 0xd0, 0x6d, 0x5b, 0x37, 0x6a, 0xdc, 0x54, 0x72, 0x94, 0xbe, 0xba, 0xbb, - 0xc1, 0xa8, 0xbc, 0x13, 0xff, 0x3f, 0x4c, 0xb5, 0x35, 0x23, 0xca, 0x6e, 0xbc, 0x04, 0xd9, 0x5d, - 0xb3, 0x65, 0x68, 0x32, 0x7b, 0xd7, 0xc1, 0x17, 0xff, 0x32, 0x94, 0xc6, 0x9e, 0x57, 0xf8, 0xf7, - 0x18, 0x4c, 0x4b, 0xd8, 0x36, 0xeb, 0x07, 0x38, 0x7a, 0x45, 0x96, 0x81, 0xbf, 0x65, 0x91, 0x9f, - 0x49, 0x9f, 0x69, 0xc6, 0xcc, 0xa6, 0xb4, 0xf6, 0x75, 0xf4, 0xcb, 0xfd, 0x6d, 0xb1, 0x7b, 0xe5, - 0x9c, 0x2f, 0xcb, 0x25, 0xda, 0x96, 0xe5, 0x4c, 0x98, 0xd0, 0x6b, 0x86, 0x49, 0x7c, 0x96, 0x8d, - 0x1f, 0x1b, 0xad, 0x86, 0x8b, 0x59, 0x16, 0xfa, 0x55, 0x72, 0x95, 0xb1, 0x54, 0xf0, 0xe3, 0xcd, - 0x56, 0x83, 0x46, 0xce, 0xcb, 0x67, 0x49, 0x7d, 0x9f, 0x9e, 0xcc, 0xe5, 0xda, 0xee, 0xd9, 0x52, - 0x4e, 0xf7, 0xae, 0x89, 0x74, 0xde, 0xe5, 0x5f, 0x84, 0x33, 0x1d, 0x2a, 0x8f, 0x32, 0xc6, 0xf9, - 0x9b, 0x38, 0x9c, 0x6f, 0x17, 0x1f, 0x35, 0x12, 0xf9, 0xa4, 0x77, 0x6b, 0x19, 0xc6, 0x1b, 0xba, - 0xf1, 0x6c, 0x0b, 0x91, 0xd9, 0x86, 0x6e, 0xf8, 0xeb, 0xb9, 0x21, 0x06, 0x92, 0xfc, 0x5f, 0x30, - 0x10, 0x05, 0x66, 0xc2, 0x7a, 0x30, 0x4a, 0x2b, 0x79, 0x5f, 0x80, 0x6c, 0xd4, 0x6b, 0x6b, 0xcf, - 0x96, 0x63, 0xc6, 0xdb, 0x5c, 0x85, 0xf1, 0x8f, 0x61, 0x31, 0xee, 0x9b, 0x02, 0xa0, 0xaa, 0xd5, - 0x32, 0x08, 0xc8, 0xbd, 0x6f, 0xd6, 0xa2, 0x6c, 0xec, 0x34, 0x8c, 0xea, 0x86, 0x86, 0x8f, 0x68, - 0x63, 0x13, 0x12, 0xbb, 0x68, 0x7b, 0x81, 0x18, 0x1f, 0xea, 0x05, 0xa2, 0x9f, 0xaa, 0xd2, 0x56, - 0xd1, 0x28, 0xb5, 0xf0, 0xa7, 0x31, 0x98, 0xe2, 0xcd, 0x89, 0x7c, 0x31, 0xf2, 0x15, 0x18, 0xad, - 0x13, 0x99, 0x7d, 0xfa, 0x9c, 0x3e, 0xd3, 0xed, 0x73, 0x5a, 0x18, 0x7d, 0x06, 0xa0, 0x69, 0xe1, - 0x03, 0x99, 0xb1, 0xc6, 0x87, 0x62, 0x4d, 0x13, 0x0e, 0x4a, 0x40, 0x9f, 0x87, 0x09, 0x32, 0xc2, - 0x9b, 0x96, 0xd9, 0x34, 0x6d, 0x12, 0xa4, 0xd8, 0xc3, 0x21, 0x9d, 0xc9, 0xa7, 0x27, 0x73, 0xe3, - 0x1b, 0xba, 0xb1, 0xc5, 0x19, 0xab, 0x15, 0x89, 0xb8, 0x0a, 0xef, 0xd2, 0x1d, 0x80, 0xff, 0x24, - 0xc0, 0xf4, 0xc7, 0xb6, 0x7c, 0xfb, 0x7f, 0xa1, 0x31, 0x6f, 0xe6, 0x11, 0xe9, 0xe5, 0xaa, 0xb1, - 0x6b, 0x46, 0xbf, 0xa8, 0xfe, 0xbe, 0x00, 0x93, 0x01, 0xf1, 0x51, 0x46, 0x32, 0xcf, 0xa4, 0xb3, - 0xc2, 0x17, 0x48, 0x6c, 0x13, 0x34, 0xfb, 0x28, 0x07, 0xd5, 0x5f, 0xc7, 0xe0, 0x6c, 0x91, 0xbd, - 0x5a, 0x76, 0xf3, 0x2e, 0xa2, 0xb4, 0x92, 0x3c, 0x8c, 0x1d, 0x60, 0xcb, 0xd6, 0x4d, 0x36, 0xc3, - 0x8e, 0x4b, 0xee, 0x25, 0x9a, 0x81, 0x94, 0x6d, 0x28, 0x4d, 0x7b, 0xcf, 0x74, 0xdf, 0xc6, 0x79, - 0xd7, 0x5e, 0x8e, 0xc8, 0xe8, 0xb3, 0xe7, 0x88, 0x24, 0xfb, 0xe7, 0x88, 0x8c, 0xfd, 0xd2, 0x39, - 0x22, 0xfc, 0xd5, 0xd7, 0xf7, 0x04, 0x38, 0xd7, 0xa5, 0xbf, 0x28, 0x6d, 0xe6, 0xcb, 0x90, 0x51, - 0xb9, 0x60, 0xe2, 0x8d, 0xd9, 0xdb, 0xbd, 0x55, 0x52, 0xec, 0x19, 0x01, 0xc8, 0xd3, 0x93, 0x39, - 0x70, 0xab, 0xba, 0xba, 0xc2, 0x55, 0x44, 0xfe, 0x6b, 0x85, 0x7f, 0xce, 0xc2, 0x44, 0xe9, 0x88, - 0xad, 0x5d, 0x57, 0x58, 0x3c, 0x80, 0xee, 0x42, 0xaa, 0x69, 0x99, 0x07, 0xba, 0xdb, 0x8c, 0x5c, - 0x5b, 0x6a, 0x80, 0xdb, 0x8c, 0x0e, 0xae, 0x2d, 0xce, 0x21, 0x79, 0xbc, 0xa8, 0x0a, 0xe9, 0xfb, - 0xa6, 0xaa, 0xd4, 0xef, 0xea, 0x75, 0xd7, 0xfe, 0x5f, 0x1e, 0x2c, 0x68, 0xc1, 0xe3, 0xd9, 0x52, - 0x9c, 0x3d, 0xb7, 0x2b, 0x3c, 0x22, 0x5a, 0x85, 0x54, 0xd9, 0x71, 0x9a, 0xe4, 0x26, 0xf7, 0x26, - 0xd7, 0x86, 0x10, 0x4a, 0x58, 0xb8, 0x2c, 0x8f, 0x1d, 0x55, 0x61, 0xf2, 0x9e, 0x69, 0xd6, 0xea, - 0xb8, 0x58, 0x37, 0x5b, 0x5a, 0xd1, 0x34, 0x76, 0xf5, 0x1a, 0xf7, 0xc7, 0x57, 0x87, 0x90, 0x79, - 0xaf, 0x58, 0x91, 0xba, 0x05, 0xa0, 0x25, 0x48, 0x55, 0x6e, 0x73, 0x61, 0x2c, 0x80, 0xbb, 0x32, - 0x84, 0xb0, 0xca, 0x6d, 0xc9, 0x63, 0x43, 0x6b, 0x90, 0x59, 0x7a, 0xd2, 0xb2, 0x30, 0x97, 0x92, - 0xec, 0x99, 0x97, 0xd0, 0x29, 0x85, 0x72, 0x49, 0x41, 0x66, 0x54, 0x81, 0xdc, 0xdb, 0xa6, 0xb5, - 0x5f, 0x37, 0x15, 0xb7, 0x85, 0x63, 0x54, 0xdc, 0xa7, 0x86, 0x10, 0xe7, 0x32, 0x4a, 0x1d, 0x22, - 0xd0, 0x17, 0x61, 0x82, 0x74, 0x46, 0x55, 0xd9, 0xa9, 0xbb, 0x95, 0x4c, 0x51, 0xa9, 0x2f, 0x0e, - 0x21, 0xd5, 0xe3, 0x74, 0x5f, 0x9e, 0x74, 0x88, 0x9a, 0xf9, 0x3c, 0x8c, 0xb7, 0x19, 0x01, 0x42, - 0x90, 0x68, 0x92, 0xfe, 0x16, 0x68, 0xfe, 0x10, 0xfd, 0x8f, 0x5e, 0x82, 0x31, 0xc3, 0xd4, 0xb0, - 0x3b, 0x42, 0xc6, 0x97, 0xa7, 0x9f, 0x9e, 0xcc, 0x25, 0x37, 0x4d, 0x8d, 0x85, 0x2b, 0xfc, 0x9f, - 0x94, 0x24, 0x85, 0xdc, 0x60, 0x65, 0xe6, 0x2a, 0x24, 0x48, 0xef, 0x13, 0x27, 0xb5, 0xa3, 0xd8, - 0x78, 0xdb, 0xd2, 0xb9, 0x4c, 0xf7, 0x92, 0x97, 0xfb, 0x91, 0x00, 0xb1, 0xca, 0x6d, 0x12, 0xa8, - 0xef, 0xb4, 0xd4, 0x7d, 0xec, 0xf0, 0x52, 0xfc, 0x8a, 0x06, 0xf0, 0x16, 0xde, 0xd5, 0x59, 0x0c, - 0x95, 0x96, 0xf8, 0x15, 0x7a, 0x0e, 0x40, 0x51, 0x55, 0x6c, 0xdb, 0xb2, 0xbb, 0x41, 0x2e, 0x2d, - 0xa5, 0x19, 0x65, 0x1d, 0x1f, 0x13, 0x36, 0x1b, 0xab, 0x16, 0x76, 0xdc, 0x44, 0x28, 0x76, 0x45, - 0xd8, 0x1c, 0xdc, 0x68, 0xca, 0x8e, 0xb9, 0x8f, 0x0d, 0x6a, 0x33, 0x69, 0xe2, 0x7c, 0x1a, 0xcd, - 0x2a, 0x21, 0x10, 0xbf, 0x89, 0x0d, 0xcd, 0x77, 0x72, 0x69, 0xc9, 0xbb, 0x26, 0x22, 0x2d, 0x5c, - 0xd3, 0xf9, 0xc6, 0xaf, 0xb4, 0xc4, 0xaf, 0x88, 0xc6, 0x94, 0x96, 0xb3, 0x47, 0x7b, 0x25, 0x2d, - 0xd1, 0xff, 0xbc, 0x69, 0xbf, 0x2f, 0x40, 0xfc, 0x5e, 0xb1, 0x72, 0xea, 0xb6, 0xb9, 0x12, 0xe3, - 0xbe, 0x44, 0x9a, 0x7f, 0xa8, 0xd7, 0xeb, 0xba, 0x51, 0x23, 0x21, 0xcd, 0x97, 0xb1, 0xea, 0xb6, - 0x2c, 0xc7, 0xc9, 0x5b, 0x8c, 0x8a, 0xe6, 0x21, 0xa3, 0x5a, 0x58, 0xc3, 0x86, 0xa3, 0x2b, 0x75, - 0x9b, 0x37, 0x31, 0x48, 0xe2, 0x95, 0xfb, 0xaa, 0x00, 0xa3, 0xd4, 0x78, 0xd1, 0x45, 0x48, 0xab, - 0xa6, 0xe1, 0x28, 0xba, 0xc1, 0xbd, 0x50, 0x5a, 0xf2, 0x09, 0x3d, 0x2b, 0x79, 0x09, 0xb2, 0x8a, - 0xaa, 0x9a, 0x2d, 0xc3, 0x91, 0x0d, 0xa5, 0x81, 0x79, 0x65, 0x33, 0x9c, 0xb6, 0xa9, 0x34, 0x30, - 0x9a, 0x03, 0xf7, 0xd2, 0xdb, 0xa6, 0x98, 0x96, 0x80, 0x93, 0xd6, 0xf1, 0x31, 0xaf, 0xc9, 0xf7, - 0x04, 0x48, 0xb9, 0x46, 0x4f, 0x2a, 0x53, 0xc3, 0x06, 0xb6, 0x14, 0xc7, 0xf4, 0x2a, 0xe3, 0x11, - 0x3a, 0x67, 0xbc, 0xb4, 0x3f, 0xe3, 0x4d, 0xc3, 0xa8, 0x43, 0xec, 0x9a, 0xd7, 0x83, 0x5d, 0xd0, - 0xb5, 0xe6, 0xba, 0x52, 0x63, 0xcb, 0x6b, 0x69, 0x89, 0x5d, 0x90, 0x26, 0xf1, 0x1c, 0x5a, 0xa6, - 0x1d, 0x7e, 0x45, 0xea, 0xcb, 0x72, 0x3c, 0x77, 0x70, 0x4d, 0x37, 0xa8, 0x01, 0xc4, 0x25, 0xa0, - 0xa4, 0x65, 0x42, 0x41, 0x17, 0x20, 0xcd, 0x0a, 0x60, 0x43, 0xa3, 0x56, 0x10, 0x97, 0x52, 0x94, - 0x50, 0x72, 0x37, 0x67, 0xcd, 0xec, 0x43, 0xda, 0x1b, 0x63, 0xa4, 0x23, 0x5b, 0xb6, 0xa7, 0x54, - 0xfa, 0x1f, 0xbd, 0x0c, 0xd3, 0x8f, 0x5b, 0x4a, 0x5d, 0xdf, 0xa5, 0x2b, 0x67, 0xa4, 0x18, 0xd3, - 0x1f, 0x6b, 0x0f, 0xf2, 0xee, 0x51, 0x09, 0x54, 0x8d, 0xee, 0x90, 0x8c, 0xfb, 0x43, 0x32, 0xf8, - 0x2a, 0xa4, 0xf0, 0x6d, 0x01, 0x26, 0x59, 0x1a, 0x10, 0xcb, 0x44, 0x8d, 0x2e, 0xc0, 0x78, 0x03, - 0xd2, 0x9a, 0xe2, 0x28, 0x6c, 0x2b, 0x66, 0xac, 0xef, 0x56, 0x4c, 0xd7, 0xe3, 0x93, 0xf2, 0x74, - 0x3b, 0x26, 0x82, 0x04, 0xf9, 0xcf, 0xf6, 0xae, 0x4a, 0xf4, 0xbf, 0x9f, 0x58, 0x11, 0xac, 0x6e, - 0x94, 0x01, 0xd7, 0x22, 0x9c, 0x21, 0xda, 0x2f, 0x19, 0xaa, 0x75, 0xdc, 0x74, 0x74, 0xd3, 0x78, - 0x40, 0x7f, 0x6d, 0x24, 0x06, 0x5e, 0x4c, 0xd1, 0xf7, 0x51, 0xbc, 0x2e, 0x7f, 0x9b, 0x84, 0xf1, - 0xd2, 0x51, 0xd3, 0xb4, 0x22, 0x5d, 0xd4, 0x5a, 0x86, 0x31, 0x8e, 0xf8, 0xfb, 0xbc, 0x2a, 0xee, - 0xf0, 0xd5, 0xee, 0x5b, 0x58, 0xce, 0x88, 0x96, 0x01, 0x58, 0xce, 0x28, 0xcd, 0x25, 0x8a, 0x9f, - 0xe2, 0x85, 0x19, 0x65, 0x23, 0x54, 0xb4, 0x09, 0x99, 0xc6, 0x81, 0xaa, 0xca, 0xbb, 0x7a, 0xdd, - 0xe1, 0x49, 0x77, 0xe1, 0x19, 0xe3, 0x1b, 0x8f, 0x8a, 0xc5, 0xbb, 0xb4, 0x10, 0xcb, 0x7f, 0xf3, - 0xaf, 0x25, 0x20, 0x12, 0xd8, 0x7f, 0xf4, 0x22, 0xf0, 0x7d, 0x33, 0xb2, 0xed, 0x6e, 0x91, 0x5b, - 0x1e, 0x7f, 0x7a, 0x32, 0x97, 0x96, 0x28, 0xb5, 0x52, 0xa9, 0x4a, 0x69, 0x56, 0xa0, 0x62, 0x3b, - 0xe8, 0x79, 0x18, 0x37, 0x1b, 0xba, 0x23, 0xbb, 0x31, 0x10, 0x0f, 0x1b, 0xb3, 0x84, 0xe8, 0xc6, - 0x48, 0xa8, 0x0a, 0xd7, 0xb0, 0x41, 0x47, 0x01, 0x69, 0xa7, 0xbc, 0xc3, 0xd6, 0x22, 0x1d, 0x36, - 0xde, 0x65, 0xb3, 0xe9, 0xe8, 0x0d, 0xfd, 0x09, 0x7d, 0x59, 0xcd, 0xdf, 0x17, 0x3d, 0xcf, 0x8a, - 0x93, 0xf6, 0x2d, 0xd3, 0x45, 0x4a, 0x5e, 0xf6, 0x41, 0xa0, 0x28, 0xfa, 0xaa, 0x00, 0x67, 0xb9, - 0x22, 0xe5, 0x1d, 0x9a, 0xf2, 0xae, 0xd4, 0x75, 0xe7, 0x58, 0xde, 0x3f, 0xc8, 0xa7, 0x68, 0x70, - 0xfa, 0xe9, 0xd0, 0x0e, 0x09, 0xd8, 0xc1, 0x82, 0xdb, 0x2d, 0xc7, 0xf7, 0x39, 0xf3, 0xfa, 0x41, - 0xc9, 0x70, 0xac, 0xe3, 0xe5, 0x73, 0x4f, 0x4f, 0xe6, 0xa6, 0xba, 0xef, 0x3e, 0x92, 0xa6, 0xec, - 0x6e, 0x16, 0x54, 0x06, 0xc0, 0x9e, 0x35, 0xd2, 0x94, 0xbf, 0xf0, 0xf0, 0x22, 0xd4, 0x6c, 0xa5, - 0x00, 0x2f, 0xba, 0x0e, 0x22, 0xdf, 0xf4, 0xb2, 0xab, 0xd7, 0xb1, 0x6c, 0xeb, 0x4f, 0x70, 0x1e, - 0xa8, 0x0f, 0xca, 0x31, 0x3a, 0x11, 0x51, 0xd1, 0x9f, 0xe0, 0x99, 0x2f, 0x43, 0xbe, 0x57, 0xed, - 0x83, 0x03, 0x21, 0xcd, 0x5e, 0xcc, 0xbe, 0xde, 0xbe, 0x22, 0x33, 0x84, 0xa9, 0xba, 0xab, 0x32, - 0xb1, 0xd7, 0x5d, 0x17, 0xf4, 0xad, 0x18, 0x8c, 0x2f, 0xb7, 0xea, 0xfb, 0x0f, 0x9a, 0x95, 0x56, - 0xa3, 0xa1, 0x58, 0xc7, 0xc4, 0x55, 0x32, 0xd7, 0x41, 0xaa, 0x29, 0x30, 0x57, 0x49, 0x7d, 0x83, - 0xfe, 0x04, 0x93, 0xc9, 0x2c, 0x90, 0xa9, 0xc2, 0x53, 0xfa, 0x69, 0x4b, 0x7c, 0x32, 0xcd, 0xba, - 0x7f, 0x1d, 0xf2, 0x81, 0x82, 0x74, 0xf9, 0x44, 0xc6, 0x86, 0x63, 0xe9, 0x98, 0x2d, 0x07, 0xc6, - 0xa5, 0x40, 0x3a, 0xcd, 0x2a, 0xb9, 0x5d, 0x62, 0x77, 0x51, 0x15, 0xb2, 0xa4, 0xe0, 0xb1, 0x4c, - 0x27, 0x1b, 0x77, 0xd1, 0xf6, 0x66, 0x48, 0xe3, 0xda, 0xea, 0xbd, 0x40, 0xb5, 0x54, 0xa4, 0x3c, - 0xf4, 0xaf, 0x94, 0xc1, 0x3e, 0x65, 0xe6, 0x2d, 0x10, 0x3b, 0x0b, 0x04, 0x35, 0x9a, 0x60, 0x1a, - 0x9d, 0x0e, 0x6a, 0x34, 0x1e, 0xd0, 0xd6, 0x5a, 0x22, 0x95, 0x10, 0x47, 0x0b, 0x3f, 0x89, 0x43, - 0xce, 0x35, 0xb6, 0x28, 0xd1, 0xcc, 0x32, 0x8c, 0x12, 0xd3, 0x70, 0x93, 0x3f, 0xae, 0xf6, 0xb1, - 0x71, 0x9e, 0x3e, 0x4e, 0x4c, 0xc6, 0xc5, 0xc3, 0x94, 0x35, 0x0a, 0xb7, 0x33, 0xf3, 0x6b, 0x31, - 0x48, 0x50, 0x00, 0x71, 0x13, 0x12, 0x74, 0xea, 0x10, 0x86, 0x99, 0x3a, 0x68, 0x51, 0x6f, 0xb2, - 0x8b, 0x05, 0xe2, 0x4f, 0x12, 0xcc, 0xed, 0x29, 0xaf, 0xde, 0xbc, 0x45, 0x5d, 0x4e, 0x56, 0xe2, - 0x57, 0x68, 0x99, 0x66, 0x25, 0x99, 0x96, 0x83, 0x35, 0x1e, 0xb8, 0xcf, 0x0f, 0xea, 0x5f, 0x77, - 0x9a, 0x72, 0xf9, 0xd0, 0x79, 0x88, 0x13, 0x5f, 0x36, 0xc6, 0x32, 0x16, 0x9e, 0x9e, 0xcc, 0xc5, - 0x89, 0x17, 0x23, 0x34, 0xb4, 0x08, 0x99, 0x76, 0xc7, 0x21, 0x5c, 0x4f, 0x33, 0xf7, 0x18, 0x18, - 0xf4, 0x50, 0xf7, 0x06, 0x18, 0x03, 0xad, 0xbc, 0x8f, 0xbf, 0x32, 0x0a, 0xe3, 0xab, 0x8d, 0xa8, - 0x27, 0x96, 0xa5, 0xf6, 0x1e, 0x0e, 0x43, 0x3b, 0x6d, 0x0f, 0x0d, 0xe9, 0xe0, 0xb6, 0x39, 0x3d, - 0x7e, 0xba, 0x39, 0x7d, 0x95, 0x84, 0xc0, 0xfc, 0x80, 0x85, 0x78, 0x0f, 0x60, 0xd3, 0xfe, 0x7c, - 0x1a, 0xc5, 0x48, 0x84, 0xc7, 0xdf, 0x50, 0x41, 0xb3, 0x4e, 0xde, 0xa2, 0x91, 0x36, 0xb3, 0xb2, - 0xe4, 0xf0, 0x56, 0x36, 0x86, 0x0d, 0x8d, 0x4e, 0x6d, 0xed, 0x7e, 0x75, 0xec, 0xd9, 0xfd, 0xea, - 0xcc, 0x13, 0x6e, 0xac, 0x6f, 0x40, 0x5c, 0xd3, 0xdd, 0xce, 0x19, 0x7e, 0xc2, 0x26, 0x4c, 0x03, - 0xac, 0x36, 0x11, 0xb4, 0xda, 0xe0, 0x02, 0xc7, 0xcc, 0x03, 0x00, 0x5f, 0x43, 0x68, 0x1e, 0x92, - 0x66, 0x5d, 0x73, 0xf7, 0x95, 0x8c, 0x2f, 0xa7, 0x9f, 0x9e, 0xcc, 0x8d, 0x3e, 0xa8, 0x6b, 0xab, - 0x2b, 0xd2, 0xa8, 0x59, 0xd7, 0x56, 0x35, 0x7a, 0xc6, 0x05, 0x3e, 0x94, 0xbd, 0x24, 0xb4, 0xac, - 0x34, 0x66, 0xe0, 0xc3, 0x15, 0x6c, 0xab, 0x1d, 0xc9, 0x31, 0xc4, 0x04, 0xbf, 0x21, 0x40, 0xce, - 0xed, 0x8d, 0x68, 0xdd, 0x4c, 0x4a, 0x6f, 0xf0, 0x61, 0x17, 0x3f, 0xdd, 0xb0, 0x73, 0xf9, 0xf8, - 0xae, 0xda, 0xaf, 0x09, 0x3c, 0x01, 0xb9, 0xa2, 0x2a, 0x0e, 0x09, 0x36, 0x22, 0x1c, 0x2a, 0x2f, - 0x80, 0x68, 0x29, 0x86, 0x66, 0x36, 0xf4, 0x27, 0x98, 0xad, 0x88, 0xda, 0xfc, 0xe5, 0xe6, 0x84, - 0x47, 0xa7, 0x4b, 0x7e, 0xee, 0x82, 0xee, 0x2f, 0x04, 0x9e, 0xac, 0xec, 0x55, 0x26, 0x4a, 0xa5, - 0xad, 0x43, 0xd2, 0x62, 0x29, 0x8f, 0x6c, 0xe8, 0xbe, 0x14, 0x22, 0x24, 0xec, 0xe9, 0x2c, 0xa3, - 0xd0, 0x1b, 0x3c, 0x54, 0xc4, 0xcc, 0xe7, 0x60, 0x94, 0x92, 0x9f, 0xc1, 0xc1, 0x72, 0xcd, 0xff, - 0x2c, 0x06, 0x97, 0xe9, 0xe3, 0x1e, 0x61, 0x4b, 0xdf, 0x3d, 0xde, 0xb2, 0x4c, 0x07, 0xab, 0x0e, - 0xd6, 0xfc, 0x6d, 0x1c, 0x91, 0x7a, 0xad, 0x74, 0xd3, 0x7d, 0xc0, 0xa9, 0x52, 0xbf, 0x3c, 0x2e, - 0xb4, 0x0e, 0x13, 0xec, 0x1c, 0x1d, 0x59, 0xa9, 0xeb, 0x07, 0x58, 0x56, 0x9c, 0xd3, 0xcc, 0x4d, - 0xe3, 0x8c, 0x77, 0x89, 0xb0, 0x2e, 0x39, 0x48, 0x83, 0x34, 0x17, 0xa6, 0x6b, 0xfc, 0xf0, 0x9c, - 0x7b, 0xbf, 0xdc, 0x9a, 0x5f, 0x4a, 0xa2, 0xf2, 0x56, 0x57, 0xa4, 0x14, 0x93, 0xec, 0xbd, 0xb3, - 0xf9, 0xa1, 0x00, 0x57, 0x06, 0x28, 0x3a, 0x4a, 0x33, 0x9b, 0x81, 0xd4, 0x01, 0x79, 0x90, 0xce, - 0x35, 0x9d, 0x92, 0xbc, 0x6b, 0xb4, 0x01, 0xe3, 0xbb, 0x8a, 0x5e, 0x27, 0x11, 0x17, 0xb3, 0xc4, - 0xde, 0xf9, 0x82, 0xe1, 0x69, 0xac, 0x59, 0xc6, 0x4e, 0x6f, 0xd2, 0x8d, 0x8e, 0x93, 0x4b, 0x9a, - 0x56, 0xa9, 0x70, 0x0f, 0x16, 0x9d, 0xbd, 0xb8, 0xd0, 0x31, 0xe6, 0x43, 0x47, 0xf4, 0x12, 0x20, - 0x4d, 0xb7, 0xd9, 0x69, 0x1d, 0xf6, 0x9e, 0xa2, 0x99, 0x87, 0x7e, 0xd6, 0xc4, 0xa4, 0x7b, 0xa7, - 0xe2, 0xde, 0x40, 0x15, 0xa0, 0xb8, 0x45, 0xb6, 0x1d, 0xc5, 0x7b, 0xf1, 0x73, 0x65, 0xa8, 0x5d, - 0x57, 0x0c, 0xd0, 0x78, 0x97, 0x52, 0x9a, 0xc8, 0xa1, 0x7f, 0x49, 0x04, 0xae, 0x93, 0xa6, 0x3b, - 0xb2, 0x62, 0xbb, 0x5b, 0x74, 0xd8, 0x39, 0x21, 0x39, 0x46, 0x5f, 0xb2, 0x83, 0x3b, 0x6f, 0xd8, - 0x0e, 0x02, 0x5f, 0x41, 0x51, 0x02, 0xdd, 0x3f, 0x11, 0x20, 0x27, 0xe1, 0x5d, 0x0b, 0xdb, 0x91, - 0x02, 0xfe, 0xbb, 0x90, 0xb5, 0x98, 0x54, 0x79, 0xd7, 0x32, 0x1b, 0xa7, 0x19, 0x63, 0x19, 0xce, - 0x78, 0xd7, 0x32, 0x1b, 0x6d, 0x47, 0x27, 0x3c, 0x82, 0x09, 0xaf, 0xa6, 0x51, 0xaa, 0xe0, 0xdb, - 0x74, 0xa7, 0x31, 0x13, 0x1c, 0x75, 0xfa, 0xc2, 0xc7, 0xa1, 0x07, 0xfa, 0xa6, 0x29, 0x58, 0xdd, - 0x28, 0x95, 0xf1, 0x0b, 0x01, 0x72, 0x95, 0xd6, 0x0e, 0x3b, 0x2c, 0x2a, 0x3a, 0x3d, 0x94, 0x20, - 0x5d, 0xc7, 0xbb, 0x8e, 0xfc, 0x4c, 0x59, 0xef, 0x29, 0xc2, 0x4a, 0x33, 0xff, 0xef, 0x01, 0x58, - 0x74, 0x5f, 0x1b, 0x95, 0x13, 0x3f, 0xa5, 0x9c, 0x34, 0xe5, 0xf5, 0x83, 0x9c, 0xc2, 0xb7, 0x63, - 0x30, 0xe1, 0x35, 0x36, 0x4a, 0xef, 0xf9, 0x76, 0x9b, 0xd7, 0x88, 0x9f, 0xc6, 0x6b, 0x4c, 0xf2, - 0xec, 0x8d, 0x70, 0xcf, 0xb1, 0x00, 0x53, 0x34, 0x04, 0x91, 0x95, 0x66, 0xb3, 0xae, 0xbb, 0x50, - 0x96, 0xfa, 0xa5, 0x84, 0x34, 0x49, 0x6f, 0x2d, 0xb1, 0x3b, 0x14, 0xc4, 0x12, 0xfb, 0xdb, 0xb5, - 0x30, 0x7e, 0x82, 0x65, 0x8a, 0xaa, 0x4e, 0x93, 0x9d, 0x92, 0x61, 0x8c, 0x15, 0xc2, 0xc7, 0x2d, - 0xef, 0x3d, 0x98, 0xa4, 0x9a, 0x8d, 0x7a, 0x6f, 0x2d, 0xef, 0x8e, 0x1f, 0x0b, 0x80, 0x82, 0xf2, - 0x3f, 0xbe, 0x1e, 0x89, 0x45, 0xd7, 0x23, 0x2f, 0x02, 0x62, 0x59, 0x88, 0xb6, 0xdc, 0xc4, 0x96, - 0x6c, 0x63, 0xd5, 0xe4, 0x47, 0x18, 0x09, 0x92, 0xc8, 0xef, 0x6c, 0x61, 0xab, 0x42, 0xe9, 0x85, - 0xf7, 0x67, 0x20, 0xcb, 0x95, 0xb1, 0x6d, 0xe8, 0xa6, 0x81, 0x6e, 0x42, 0xbc, 0xc6, 0xd7, 0xf3, - 0x33, 0xa1, 0x2b, 0x6a, 0xfe, 0xc1, 0x6b, 0xe5, 0x11, 0x89, 0x94, 0x25, 0x2c, 0xcd, 0x96, 0x13, - 0x12, 0xff, 0xf8, 0xe9, 0xd2, 0x41, 0x96, 0x66, 0xcb, 0x41, 0x15, 0x98, 0x50, 0xfd, 0x63, 0xa4, - 0x64, 0xc2, 0x1e, 0xef, 0x89, 0x74, 0x42, 0x8f, 0xef, 0x2a, 0x8f, 0x48, 0x39, 0xb5, 0xed, 0x06, - 0x2a, 0x06, 0xcf, 0x2d, 0x4a, 0x74, 0x65, 0x66, 0xf9, 0xfb, 0x70, 0xdb, 0xcf, 0x4c, 0x2a, 0x8f, - 0x04, 0x8e, 0x37, 0x42, 0x6f, 0x40, 0x52, 0xa3, 0xe7, 0xe1, 0x70, 0xd3, 0x0c, 0xb3, 0x9e, 0xb6, - 0x23, 0x88, 0xca, 0x23, 0x12, 0xe7, 0x40, 0x6b, 0x90, 0x65, 0xff, 0x58, 0x1c, 0xc2, 0xe1, 0xdf, - 0x95, 0xde, 0x12, 0x02, 0xde, 0xbd, 0x3c, 0x22, 0x65, 0x34, 0x9f, 0x8a, 0x5e, 0x81, 0x84, 0xad, - 0x2a, 0x2e, 0x00, 0x9c, 0xed, 0x71, 0x18, 0x86, 0xcf, 0x4c, 0x4b, 0xa3, 0x3b, 0xec, 0xec, 0x44, - 0xe7, 0xc8, 0x5d, 0x91, 0x0b, 0xab, 0x7e, 0xdb, 0x16, 0x6b, 0x52, 0x7d, 0x4c, 0x09, 0xe8, 0x1e, - 0x64, 0x14, 0x12, 0xd0, 0xc9, 0x74, 0x4b, 0x23, 0x5d, 0x82, 0x0b, 0x7f, 0xd9, 0xdd, 0xb5, 0x1d, - 0xb5, 0x4c, 0xf7, 0x71, 0xbb, 0x44, 0x5f, 0x50, 0x03, 0x5b, 0x35, 0x9c, 0xcf, 0xf4, 0x17, 0x14, - 0xcc, 0xc4, 0xf2, 0x04, 0x51, 0x22, 0x09, 0xec, 0xf6, 0xdc, 0xed, 0x2a, 0xb4, 0x51, 0xd9, 0x9e, - 0x2f, 0x56, 0x43, 0xb6, 0xdb, 0x94, 0x47, 0xa4, 0xec, 0x5e, 0x80, 0x8c, 0x16, 0x20, 0x56, 0x53, - 0xf3, 0xe3, 0x54, 0xc6, 0xc5, 0x7e, 0x9b, 0x49, 0xca, 0x23, 0x52, 0xac, 0xa6, 0x12, 0x28, 0xcf, - 0x76, 0x03, 0x1c, 0x19, 0xf9, 0x5c, 0xcf, 0xa1, 0xde, 0xbe, 0xa7, 0xa2, 0x3c, 0x22, 0xd1, 0x0d, - 0x08, 0xe4, 0x79, 0x5b, 0x90, 0xb3, 0x58, 0x2a, 0x9b, 0x9b, 0x84, 0x2a, 0xf6, 0x7c, 0xd9, 0x1c, - 0x96, 0x87, 0x5a, 0xa6, 0x01, 0x7e, 0x80, 0x8e, 0xbe, 0x04, 0xd3, 0xed, 0x12, 0xb9, 0xa5, 0x4d, - 0xf6, 0x7c, 0x71, 0xda, 0x33, 0x1b, 0xb2, 0x3c, 0x22, 0x21, 0xab, 0xeb, 0x26, 0x7a, 0x0d, 0x46, - 0x59, 0xaf, 0x21, 0x2a, 0x32, 0x2c, 0x8b, 0xa2, 0xa3, 0xc3, 0x58, 0x79, 0x62, 0xfc, 0x0e, 0xcf, - 0xe1, 0x92, 0xeb, 0x66, 0x2d, 0x3f, 0xd5, 0xd3, 0xf8, 0xbb, 0x73, 0xd2, 0x88, 0xf1, 0x3b, 0x3e, - 0x95, 0xf4, 0xbb, 0xc5, 0xee, 0xf0, 0x94, 0x9f, 0xe9, 0x9e, 0xfd, 0x1e, 0x92, 0xda, 0x55, 0xa6, - 0x59, 0xf5, 0x3e, 0x99, 0x54, 0xcd, 0x62, 0x27, 0xb7, 0xc8, 0x74, 0x4c, 0x9d, 0xe9, 0x59, 0xb5, - 0xee, 0x03, 0x6e, 0xca, 0x34, 0xf0, 0xf1, 0xa8, 0xe8, 0x11, 0x88, 0xfc, 0x4c, 0x05, 0x7f, 0xf9, - 0xff, 0x2c, 0x95, 0xf7, 0x42, 0xa8, 0xeb, 0x0a, 0xcb, 0x91, 0x29, 0x8f, 0x48, 0x13, 0x6a, 0xfb, - 0x1d, 0xf4, 0x0e, 0x4c, 0x52, 0x79, 0xb2, 0xea, 0x1f, 0x86, 0x91, 0xcf, 0x77, 0x1d, 0xaa, 0xd0, - 0xfb, 0xdc, 0x0c, 0x57, 0xb2, 0xa8, 0x76, 0xdc, 0x22, 0x66, 0xac, 0x1b, 0xba, 0x43, 0xbd, 0xec, - 0x4c, 0x4f, 0x33, 0x6e, 0x3f, 0x76, 0x8f, 0x98, 0xb1, 0xce, 0x28, 0xc4, 0x8c, 0x1d, 0x9e, 0x0f, - 0xc6, 0xbb, 0xe3, 0x62, 0x4f, 0x33, 0x0e, 0x4b, 0x1c, 0x23, 0x66, 0xec, 0x04, 0xe9, 0xc4, 0x8c, - 0x99, 0x83, 0xe8, 0x90, 0xfb, 0x5c, 0x4f, 0x33, 0xee, 0xb9, 0xa9, 0x98, 0x98, 0xb1, 0xd2, 0x75, - 0x13, 0xad, 0x00, 0xb0, 0xb8, 0x44, 0x37, 0x76, 0xcd, 0xfc, 0x6c, 0xcf, 0xc9, 0xa0, 0x33, 0x23, - 0x8c, 0x4c, 0x06, 0x75, 0x97, 0x46, 0x1c, 0x19, 0x45, 0x43, 0x32, 0x7d, 0x17, 0x9a, 0x9f, 0xeb, - 0xe9, 0xc8, 0xba, 0xde, 0x52, 0x12, 0x47, 0x76, 0xe8, 0x11, 0xc9, 0xac, 0xc2, 0x16, 0x66, 0xf3, - 0xf3, 0xbd, 0xdd, 0x72, 0xf0, 0x2d, 0x0d, 0x75, 0xcb, 0x94, 0x80, 0x96, 0x20, 0x4d, 0xa6, 0xed, - 0x63, 0xea, 0x86, 0x2e, 0xf5, 0x0c, 0x31, 0x3b, 0xb6, 0x8d, 0x94, 0x47, 0xa4, 0xd4, 0x63, 0x4e, - 0x22, 0x8f, 0x67, 0x0b, 0x54, 0xf9, 0x42, 0xcf, 0xc7, 0xb7, 0x2d, 0x6f, 0x92, 0xc7, 0x33, 0x0e, - 0xa4, 0xc2, 0x19, 0xd6, 0x57, 0x7c, 0x4f, 0xaf, 0xc5, 0x37, 0xa0, 0xe6, 0x9f, 0xa7, 0xa2, 0x7a, - 0x2e, 0xf7, 0x84, 0x6e, 0x35, 0x2e, 0x8f, 0x48, 0x53, 0x4a, 0xf7, 0x5d, 0x32, 0xe0, 0xf9, 0xd4, - 0xc3, 0x16, 0x89, 0xf2, 0x97, 0x7b, 0x0e, 0xf8, 0x90, 0x65, 0x35, 0x32, 0xe0, 0x95, 0x00, 0x99, - 0x4d, 0x40, 0x9a, 0x6c, 0xdb, 0xec, 0xcd, 0xf9, 0x95, 0x3e, 0x13, 0x50, 0x07, 0xcc, 0x67, 0x13, - 0x90, 0x56, 0x61, 0x9c, 0x44, 0x90, 0x5a, 0xc7, 0x8a, 0xc5, 0xdd, 0xec, 0xd5, 0x9e, 0x82, 0xba, - 0x8e, 0xb2, 0x23, 0x82, 0x54, 0x8f, 0x48, 0x02, 0x1e, 0xcb, 0x3d, 0x8c, 0x85, 0xc7, 0x7c, 0xd7, - 0x7a, 0x06, 0x3c, 0xa1, 0x67, 0xc6, 0x90, 0x80, 0xc7, 0x6a, 0xbb, 0x81, 0x3e, 0x03, 0x63, 0x1c, - 0x93, 0xe5, 0xaf, 0xf7, 0x89, 0x44, 0x83, 0x60, 0x9a, 0x8c, 0x6b, 0xce, 0xc3, 0xbc, 0x2c, 0xc3, - 0x82, 0xac, 0x79, 0x2f, 0xf4, 0xf1, 0xb2, 0x5d, 0x70, 0x94, 0x79, 0x59, 0x9f, 0x4c, 0xbc, 0x2c, - 0xb3, 0x53, 0x3e, 0xd7, 0xdd, 0xe8, 0xe9, 0x65, 0xbb, 0xb7, 0xae, 0x10, 0x2f, 0xfb, 0xd8, 0xa7, - 0x92, 0x96, 0xd9, 0x0c, 0x07, 0xe5, 0x3f, 0xd5, 0xb3, 0x65, 0xed, 0xb0, 0x90, 0xb4, 0x8c, 0xf3, - 0x90, 0x6e, 0x63, 0x89, 0xc8, 0x4c, 0xd3, 0x2f, 0xf6, 0xde, 0x3e, 0xdf, 0x89, 0x1e, 0xca, 0xee, - 0xd1, 0xc8, 0x4c, 0xc3, 0x9e, 0xa3, 0xb2, 0xf8, 0x66, 0x61, 0xae, 0xa9, 0x97, 0xfa, 0x3b, 0xaa, - 0xb0, 0x7d, 0xd0, 0x9e, 0xa3, 0x6a, 0xbb, 0x49, 0xab, 0xca, 0x76, 0x80, 0xd1, 0xf1, 0xbd, 0xd0, - 0x67, 0xa7, 0x7f, 0xc7, 0x6e, 0x3c, 0x5a, 0x55, 0x8f, 0xe8, 0x0f, 0xa1, 0x16, 0x3b, 0x92, 0x22, - 0xbf, 0xd8, 0x7f, 0x08, 0xb5, 0x1f, 0x8d, 0xe1, 0x0d, 0x21, 0x4e, 0xf6, 0xe6, 0x4c, 0x37, 0xc2, - 0x78, 0xb9, 0xff, 0x9c, 0xd9, 0x19, 0x5a, 0xb0, 0x39, 0x93, 0xc7, 0x14, 0xbf, 0x2e, 0xc0, 0x3c, - 0xab, 0x1b, 0x5d, 0xb2, 0x3b, 0x96, 0xbd, 0xe5, 0xcf, 0xc0, 0x3e, 0x85, 0x9b, 0xf4, 0x01, 0xaf, - 0xf5, 0xaa, 0xee, 0x80, 0xe5, 0xdc, 0xf2, 0x88, 0xf4, 0x9c, 0xd2, 0xaf, 0xdc, 0xf2, 0x18, 0x7f, - 0x77, 0xe9, 0x6d, 0xc2, 0x9c, 0x10, 0xc5, 0xb5, 0x44, 0xea, 0x9c, 0x98, 0x5f, 0x4b, 0xa4, 0xce, - 0x8b, 0x33, 0x6b, 0x89, 0xd4, 0x05, 0xf1, 0x62, 0xe1, 0xdf, 0xce, 0xc3, 0xb8, 0x0b, 0xde, 0x18, - 0x22, 0xba, 0x15, 0x44, 0x44, 0xb3, 0xbd, 0x10, 0x11, 0x87, 0x7b, 0x1c, 0x12, 0xdd, 0x0a, 0x42, - 0xa2, 0xd9, 0x5e, 0x90, 0xc8, 0xe7, 0x21, 0x98, 0xa8, 0xda, 0x0b, 0x13, 0xbd, 0x30, 0x04, 0x26, - 0xf2, 0x44, 0x75, 0x82, 0xa2, 0x95, 0x6e, 0x50, 0x74, 0xb9, 0x3f, 0x28, 0xf2, 0x44, 0x05, 0x50, - 0xd1, 0x9d, 0x0e, 0x54, 0x74, 0xa9, 0x0f, 0x2a, 0xf2, 0xf8, 0x5d, 0x58, 0xb4, 0x1e, 0x0a, 0x8b, - 0xae, 0x0e, 0x82, 0x45, 0x9e, 0x9c, 0x36, 0x5c, 0xf4, 0x6a, 0x1b, 0x2e, 0x9a, 0xeb, 0x89, 0x8b, - 0x3c, 0x6e, 0x06, 0x8c, 0xde, 0xec, 0x04, 0x46, 0x97, 0xfa, 0x00, 0x23, 0xbf, 0x05, 0x1c, 0x19, - 0x95, 0xc3, 0x90, 0xd1, 0x95, 0x01, 0xc8, 0xc8, 0x93, 0x12, 0x84, 0x46, 0xe5, 0x30, 0x68, 0x74, - 0x65, 0x00, 0x34, 0xea, 0x90, 0xc4, 0xb0, 0xd1, 0x66, 0x38, 0x36, 0xba, 0x36, 0x10, 0x1b, 0x79, - 0xd2, 0xda, 0xc1, 0xd1, 0x62, 0x00, 0x1c, 0x3d, 0xd7, 0x03, 0x1c, 0x79, 0xac, 0x04, 0x1d, 0x7d, - 0xb6, 0x0b, 0x1d, 0x15, 0xfa, 0xa1, 0x23, 0x8f, 0xd7, 0x83, 0x47, 0x0f, 0x7b, 0xc0, 0xa3, 0xeb, - 0x83, 0xe1, 0x91, 0x27, 0xac, 0x03, 0x1f, 0x29, 0x7d, 0xf1, 0xd1, 0x4b, 0x43, 0xe2, 0x23, 0x4f, - 0x7a, 0x18, 0x40, 0x7a, 0xbd, 0x1d, 0x20, 0xcd, 0xf7, 0x06, 0x48, 0x9e, 0x18, 0x8e, 0x90, 0xd6, - 0x43, 0x11, 0xd2, 0xd5, 0x41, 0x08, 0xc9, 0x1f, 0x07, 0x41, 0x88, 0xb4, 0x19, 0x0e, 0x91, 0xae, - 0x0d, 0x84, 0x48, 0x7e, 0xf7, 0xb7, 0x61, 0xa4, 0xf5, 0x50, 0x8c, 0x74, 0x75, 0x10, 0x46, 0xf2, - 0x2b, 0x17, 0x04, 0x49, 0x6f, 0xf7, 0x04, 0x49, 0x37, 0x86, 0x01, 0x49, 0x9e, 0xd0, 0x2e, 0x94, - 0xf4, 0x6e, 0x6f, 0x94, 0xf4, 0xa9, 0x53, 0x9c, 0x2e, 0x18, 0x0a, 0x93, 0x3e, 0xdb, 0x05, 0x93, - 0x0a, 0xfd, 0x60, 0x92, 0x6f, 0xcf, 0x2e, 0x4e, 0x52, 0xfa, 0xa2, 0x9a, 0x97, 0x86, 0x44, 0x35, - 0xbe, 0xf1, 0x85, 0xc0, 0x9a, 0x52, 0x08, 0xac, 0xb9, 0xdc, 0x1f, 0xd6, 0xf8, 0xee, 0xdc, 0xc7, - 0x35, 0xe5, 0x30, 0x5c, 0x73, 0x65, 0x00, 0xae, 0xf1, 0xbd, 0x50, 0x00, 0xd8, 0xdc, 0xe9, 0x00, - 0x36, 0x97, 0x06, 0xa6, 0xe6, 0x04, 0x90, 0xcd, 0x72, 0x37, 0xb2, 0x79, 0xbe, 0x2f, 0xb2, 0xf1, - 0x24, 0xf8, 0xd0, 0xe6, 0x4e, 0x07, 0xb4, 0xb9, 0xd4, 0x07, 0xda, 0xf8, 0x15, 0xe0, 0xd8, 0x46, - 0xeb, 0x8f, 0x6d, 0x16, 0x86, 0xc5, 0x36, 0x9e, 0xe0, 0x50, 0x70, 0xb3, 0x19, 0x0e, 0x6e, 0xae, - 0x0d, 0xf9, 0xa2, 0xbc, 0x0b, 0xdd, 0x94, 0xc3, 0xd0, 0xcd, 0x95, 0x01, 0xe8, 0x26, 0x38, 0x87, - 0x78, 0xf0, 0xa6, 0x1c, 0x06, 0x6f, 0xae, 0x0c, 0x80, 0x37, 0xbe, 0xa4, 0x00, 0xbe, 0xa9, 0xf6, - 0xc2, 0x37, 0x2f, 0x0c, 0x81, 0x6f, 0xfc, 0xe0, 0xa5, 0x03, 0xe0, 0xbc, 0xd5, 0x09, 0x70, 0x0a, - 0xfd, 0x00, 0x8e, 0x3f, 0x22, 0x5d, 0x84, 0xb3, 0x19, 0x8e, 0x70, 0xae, 0x0d, 0x44, 0x38, 0x41, - 0x27, 0x19, 0x80, 0x38, 0xeb, 0xa1, 0x10, 0xe7, 0xea, 0x20, 0x88, 0xe3, 0x3b, 0xc9, 0x20, 0xc6, - 0x79, 0xab, 0x13, 0xe3, 0x14, 0xfa, 0x61, 0x1c, 0xbf, 0x71, 0x2e, 0xc8, 0x29, 0x87, 0x81, 0x9c, - 0x2b, 0x03, 0x40, 0x8e, 0xdf, 0x79, 0x01, 0x94, 0xa3, 0xf4, 0x45, 0x39, 0x2f, 0x0d, 0x89, 0x72, - 0x3a, 0x1c, 0x57, 0x3b, 0xcc, 0x29, 0x87, 0xc1, 0x9c, 0x2b, 0x03, 0x60, 0x4e, 0xa0, 0xb2, 0x3e, - 0xce, 0xd9, 0x0c, 0xc7, 0x39, 0xd7, 0x06, 0xe2, 0x9c, 0x8e, 0xd1, 0xe4, 0x02, 0x9d, 0xf5, 0x50, - 0xa0, 0x73, 0x75, 0x10, 0xd0, 0xe9, 0x98, 0xf8, 0x78, 0x70, 0xf0, 0x1b, 0xc3, 0x23, 0x9d, 0xd7, - 0x4f, 0x8f, 0x74, 0xbc, 0x67, 0x46, 0x02, 0x75, 0xd6, 0x12, 0xa9, 0x8b, 0xe2, 0x73, 0x85, 0x9f, - 0x8d, 0x42, 0xb2, 0xec, 0xa5, 0xb3, 0xf8, 0xb5, 0x14, 0x9e, 0xe5, 0x24, 0x23, 0xb4, 0x42, 0x46, - 0x2c, 0xf5, 0x7b, 0x83, 0x0f, 0xad, 0xeb, 0x3e, 0x50, 0x8d, 0xb3, 0x3e, 0xc3, 0x46, 0x62, 0xf4, - 0x2a, 0x8c, 0xb7, 0x6c, 0x6c, 0xc9, 0x4d, 0x4b, 0x37, 0x2d, 0xdd, 0x61, 0x9b, 0x32, 0x84, 0x65, - 0xf1, 0xa3, 0x93, 0xb9, 0xec, 0xb6, 0x8d, 0xad, 0x2d, 0x4e, 0x97, 0xb2, 0xad, 0xc0, 0x95, 0xfb, - 0x1d, 0xa7, 0xd1, 0xe1, 0xbf, 0xe3, 0xf4, 0x10, 0x44, 0x0b, 0x2b, 0x5a, 0x5b, 0x04, 0xc2, 0x4e, - 0x0a, 0x0a, 0xb7, 0x19, 0xba, 0xdf, 0xc9, 0x2d, 0x49, 0x4f, 0x0c, 0x9a, 0xb0, 0xda, 0x89, 0xe8, - 0x26, 0x9c, 0x69, 0x28, 0x47, 0x34, 0x71, 0x51, 0x76, 0x83, 0x3a, 0x9a, 0x8c, 0xc8, 0xbe, 0x9b, - 0x84, 0x1a, 0xca, 0x11, 0xfd, 0x28, 0x14, 0xbb, 0x45, 0x3f, 0xed, 0x70, 0x05, 0x72, 0x9a, 0x6e, - 0x3b, 0xba, 0xa1, 0x3a, 0xfc, 0x8c, 0x58, 0x76, 0xe8, 0xea, 0xb8, 0x4b, 0x65, 0x07, 0xc1, 0xde, - 0x80, 0x49, 0x9e, 0xd7, 0xee, 0x7f, 0x26, 0x8a, 0xc2, 0x97, 0x14, 0xa9, 0x05, 0xb9, 0xe1, 0x7d, - 0x18, 0x0a, 0x15, 0x61, 0xa2, 0xa6, 0x38, 0xf8, 0x50, 0x39, 0x96, 0xdd, 0x4d, 0x51, 0x19, 0x7a, - 0xc4, 0xe2, 0x85, 0xa7, 0x27, 0x73, 0xe3, 0xf7, 0xd8, 0xad, 0xae, 0xbd, 0x51, 0xe3, 0xb5, 0xc0, - 0x0d, 0x0d, 0x5d, 0x83, 0x09, 0xc5, 0x3e, 0x36, 0x54, 0xaa, 0x1e, 0x6c, 0xd8, 0x2d, 0x9b, 0x42, - 0x8a, 0x94, 0x94, 0xa3, 0xe4, 0xa2, 0x4b, 0x45, 0x97, 0x20, 0xcb, 0x93, 0xbe, 0xd9, 0xe7, 0x66, - 0x26, 0x68, 0x53, 0xf9, 0xd7, 0x0f, 0xe8, 0x17, 0x67, 0xd0, 0x1d, 0x98, 0xe1, 0xa7, 0xc2, 0x1f, - 0x2a, 0x96, 0x26, 0x53, 0xad, 0xfb, 0xf6, 0x29, 0x52, 0xb1, 0xe7, 0xd8, 0x29, 0xf0, 0xa4, 0x00, - 0x51, 0x75, 0xf0, 0x08, 0xd5, 0x31, 0x31, 0xb5, 0x96, 0x48, 0x65, 0xc5, 0xf1, 0xb5, 0x44, 0x2a, - 0x27, 0x4e, 0x14, 0x7e, 0x47, 0x80, 0x6c, 0xdb, 0x46, 0x92, 0x3b, 0x1d, 0xef, 0x71, 0xcf, 0x87, - 0x43, 0xa7, 0x5e, 0xa9, 0x5f, 0x29, 0xde, 0x55, 0x6e, 0xe2, 0xdb, 0x5c, 0xef, 0xd0, 0x9b, 0x2e, - 0x24, 0xb8, 0xc9, 0x03, 0x2e, 0xdb, 0x1b, 0x89, 0xdf, 0xfb, 0x60, 0x6e, 0xa4, 0xf0, 0xf3, 0x38, - 0x8c, 0xb7, 0x6f, 0x18, 0x59, 0xed, 0xa8, 0x57, 0x98, 0x6b, 0x6b, 0xe3, 0x58, 0xe8, 0x73, 0x6e, - 0x5e, 0xda, 0x3f, 0xd6, 0x9d, 0x55, 0x73, 0xbe, 0xcf, 0xdb, 0xea, 0x60, 0x3d, 0x7d, 0xc6, 0x99, - 0xef, 0xc6, 0x3c, 0x17, 0xb1, 0x00, 0xa3, 0xf4, 0x24, 0x17, 0x5e, 0xb5, 0xb0, 0xbd, 0xc8, 0x25, - 0x72, 0x5f, 0x62, 0xc5, 0x88, 0x4b, 0xa9, 0x3e, 0xd3, 0xe1, 0x68, 0xfe, 0x39, 0x14, 0xa7, 0xff, - 0xd4, 0x1a, 0x3f, 0x22, 0x6f, 0xf4, 0x74, 0x47, 0xe4, 0xb1, 0x97, 0xd2, 0xf5, 0x3a, 0x73, 0xd7, - 0x6c, 0x50, 0x25, 0xbb, 0x36, 0xfc, 0x52, 0x11, 0xfc, 0x0b, 0x78, 0x0b, 0x12, 0xff, 0x02, 0x5e, - 0x20, 0x17, 0x31, 0xe7, 0x89, 0xa0, 0x23, 0x90, 0x65, 0xac, 0xf2, 0xae, 0xfe, 0x86, 0x00, 0x22, - 0x1d, 0x6f, 0x77, 0x31, 0xd6, 0x22, 0xb1, 0x42, 0x37, 0x4d, 0x32, 0x36, 0x7c, 0x1e, 0x7a, 0xdb, - 0x31, 0xfb, 0xf1, 0xf6, 0x63, 0xf6, 0x0b, 0x1f, 0x08, 0x90, 0xf3, 0x6a, 0xc8, 0x3e, 0x30, 0xd5, - 0xe7, 0xe4, 0xbb, 0x67, 0xfb, 0xac, 0x92, 0xbb, 0x99, 0x7f, 0xa8, 0x6f, 0x5e, 0x05, 0x37, 0xf3, - 0xb3, 0x4f, 0x00, 0xfd, 0x81, 0x00, 0x53, 0x5e, 0x15, 0x8b, 0xfe, 0x46, 0xed, 0x67, 0x48, 0xc9, - 0x97, 0xe8, 0x27, 0xf9, 0x08, 0xc0, 0xa7, 0xa7, 0x28, 0x0c, 0x65, 0x9e, 0x88, 0x27, 0x5f, 0x00, - 0x5f, 0x38, 0xd0, 0xaa, 0x15, 0xfa, 0xb1, 0x3e, 0xf6, 0xdf, 0x2e, 0xdc, 0x0d, 0x28, 0x90, 0x8e, - 0x04, 0xa2, 0xa5, 0xa1, 0x86, 0x8c, 0xab, 0x25, 0x5a, 0xb8, 0xf0, 0xfd, 0x60, 0x4f, 0x94, 0x0e, - 0x48, 0xc0, 0x78, 0x1b, 0xe2, 0x07, 0x4a, 0xbd, 0x5f, 0xd2, 0x49, 0x5b, 0xcf, 0x49, 0xa4, 0x34, - 0xba, 0xdb, 0xb6, 0xbf, 0x3d, 0xd6, 0x3b, 0xb8, 0xe9, 0x56, 0x69, 0xdb, 0x3e, 0xf8, 0xd7, 0xdc, - 0x56, 0xc4, 0x07, 0x3f, 0x3e, 0xe8, 0x01, 0xde, 0x48, 0x7c, 0xf8, 0xc1, 0x9c, 0x70, 0xa3, 0x02, - 0x53, 0x21, 0x53, 0x21, 0xca, 0x01, 0x04, 0x0e, 0xdf, 0xe7, 0x1f, 0xfd, 0x5b, 0x5a, 0x91, 0xb7, - 0x37, 0x8b, 0x0f, 0x36, 0x36, 0x56, 0xab, 0xd5, 0xd2, 0x8a, 0x28, 0x20, 0x11, 0xb2, 0x6d, 0x47, - 0xf7, 0xc7, 0xd8, 0x67, 0x00, 0x6f, 0xfc, 0x3f, 0x00, 0xff, 0x8b, 0x20, 0x44, 0xd6, 0x7a, 0xe9, - 0x1d, 0xf9, 0xd1, 0xd2, 0xfd, 0xed, 0x52, 0x45, 0x1c, 0x41, 0x08, 0x72, 0xcb, 0x4b, 0xd5, 0x62, - 0x59, 0x96, 0x4a, 0x95, 0xad, 0x07, 0x9b, 0x95, 0x92, 0xfb, 0xf9, 0xc0, 0x1b, 0x2b, 0x90, 0x0d, - 0x9e, 0x04, 0x80, 0xa6, 0x60, 0xa2, 0x58, 0x2e, 0x15, 0xd7, 0xe5, 0x47, 0xab, 0x4b, 0xf2, 0xc3, - 0xed, 0xd2, 0x76, 0x49, 0x1c, 0xa1, 0x55, 0xa3, 0xc4, 0xbb, 0xdb, 0xf7, 0xef, 0x8b, 0x02, 0x9a, - 0x80, 0x0c, 0xbb, 0xa6, 0xc7, 0xfc, 0x8b, 0xb1, 0x1b, 0x1b, 0x90, 0x09, 0x9c, 0x03, 0x48, 0x1e, - 0xb7, 0xb5, 0x5d, 0x29, 0xcb, 0xd5, 0xd5, 0x8d, 0x52, 0xa5, 0xba, 0xb4, 0xb1, 0xc5, 0x64, 0x50, - 0xda, 0xd2, 0xf2, 0x03, 0xa9, 0x2a, 0x0a, 0xde, 0x75, 0xf5, 0xc1, 0x76, 0xb1, 0xec, 0x36, 0xa3, - 0x90, 0x48, 0xc5, 0xc5, 0xf8, 0x8d, 0xaf, 0x08, 0x70, 0xae, 0xc7, 0x7e, 0x78, 0x94, 0x81, 0xb1, - 0x6d, 0x83, 0x1e, 0x84, 0x26, 0x8e, 0xa0, 0xf1, 0xc0, 0x96, 0x78, 0x51, 0x40, 0x29, 0xb6, 0x1d, - 0x59, 0x8c, 0xa1, 0x24, 0xc4, 0x2a, 0xb7, 0xc5, 0x38, 0xa9, 0x69, 0x60, 0x47, 0xb9, 0x98, 0x40, - 0x69, 0xbe, 0x21, 0x56, 0x1c, 0x45, 0x59, 0x7f, 0x47, 0xaa, 0x98, 0x24, 0xa2, 0xbc, 0x3d, 0x9d, - 0xe2, 0xd8, 0x8d, 0x4b, 0x10, 0xd8, 0x1f, 0x87, 0x00, 0x92, 0xf7, 0x15, 0x07, 0xdb, 0x8e, 0x38, - 0x82, 0xc6, 0x20, 0xbe, 0x54, 0xaf, 0x8b, 0xc2, 0xad, 0x3f, 0x17, 0x20, 0xe5, 0x1e, 0x64, 0x8f, - 0xee, 0xc3, 0x28, 0x5b, 0x05, 0x98, 0xeb, 0x3d, 0x43, 0x51, 0x27, 0x37, 0x33, 0x3f, 0x68, 0x0a, - 0x2b, 0x8c, 0xa0, 0xb7, 0x21, 0xed, 0x59, 0x10, 0x7a, 0xbe, 0x9f, 0x7d, 0xb9, 0x52, 0xfb, 0x1b, - 0x21, 0x19, 0x33, 0x85, 0x91, 0x97, 0x85, 0xe5, 0x17, 0x3e, 0xfc, 0xc9, 0xec, 0xc8, 0x87, 0x4f, - 0x67, 0x85, 0x1f, 0x3c, 0x9d, 0x15, 0x7e, 0xf4, 0x74, 0x56, 0xf8, 0xf1, 0xd3, 0x59, 0xe1, 0xb7, - 0x7f, 0x3a, 0x3b, 0xf2, 0x83, 0x9f, 0xce, 0x8e, 0xfc, 0xe8, 0xa7, 0xb3, 0x23, 0xef, 0x8e, 0x71, - 0xee, 0x9d, 0x24, 0xfd, 0x5e, 0xe9, 0xed, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x63, 0x62, - 0x14, 0xd2, 0x75, 0x00, 0x00, + 0xf5, 0x9f, 0xaa, 0xbb, 0x25, 0x75, 0x9f, 0x6e, 0xb5, 0x4a, 0x57, 0x9a, 0x99, 0x1e, 0xcd, 0xac, + 0xa4, 0xe9, 0x9d, 0xaf, 0x1d, 0xef, 0x4a, 0x3b, 0x33, 0xbb, 0xd9, 0xf5, 0xce, 0x7a, 0x6d, 0xa9, + 0xd5, 0x33, 0x2d, 0x69, 0xa4, 0xd1, 0x54, 0xb7, 0x66, 0xbd, 0x6b, 0x6f, 0xca, 0xa5, 0xaa, 0xab, + 0x56, 0x59, 0xdd, 0x55, 0x3d, 0x55, 0xd5, 0xfa, 0x18, 0x08, 0x38, 0x09, 0xc1, 0xc1, 0x84, 0x25, + 0x0f, 0x21, 0x84, 0x38, 0xc1, 0x0b, 0x09, 0x38, 0x60, 0x1c, 0x42, 0xde, 0x12, 0x9c, 0x38, 0x0f, + 0x09, 0x6c, 0x8c, 0x03, 0x4e, 0x20, 0xb1, 0x09, 0x44, 0xd8, 0x63, 0x30, 0xc6, 0x0f, 0x81, 0xe4, + 0x21, 0x81, 0x85, 0x84, 0x70, 0x3f, 0xea, 0xab, 0xbb, 0xfa, 0x43, 0xb3, 0xb5, 0xf9, 0x2f, 0xf8, + 0xa5, 0xe9, 0x3a, 0x75, 0xcf, 0xa9, 0x7b, 0xcf, 0x3d, 0xf7, 0xdc, 0xf3, 0xbb, 0x75, 0xee, 0x2d, + 0x98, 0xb2, 0x4c, 0x45, 0xdd, 0x6f, 0xed, 0x2e, 0x29, 0x2d, 0x7d, 0xb1, 0x65, 0x99, 0x8e, 0x89, + 0xa6, 0x54, 0x53, 0x3d, 0xa0, 0xe4, 0x45, 0x7e, 0x73, 0xf6, 0xd6, 0xc1, 0xe1, 0xd2, 0xc1, 0xa1, + 0x8d, 0xad, 0x43, 0x6c, 0x2d, 0xa9, 0xa6, 0xa1, 0xb6, 0x2d, 0x0b, 0x1b, 0xea, 0xc9, 0x52, 0xc3, + 0x54, 0x0f, 0xe8, 0x8f, 0x6e, 0xd4, 0x19, 0xfb, 0x2c, 0x72, 0x25, 0x6a, 0x8a, 0xa3, 0x70, 0xda, + 0x8c, 0x4b, 0xc3, 0x96, 0x65, 0x5a, 0x36, 0xa7, 0x9e, 0x77, 0xa9, 0x4d, 0xec, 0x28, 0x81, 0xd2, + 0x97, 0x6c, 0xc7, 0xb4, 0x94, 0x3a, 0x5e, 0xc2, 0x46, 0x5d, 0x37, 0x30, 0x29, 0x70, 0xa8, 0xaa, + 0xfc, 0xe6, 0xe5, 0xc8, 0x9b, 0x77, 0xf9, 0xdd, 0x42, 0xdb, 0xd1, 0x1b, 0x4b, 0xfb, 0x0d, 0x75, + 0xc9, 0xd1, 0x9b, 0xd8, 0x76, 0x94, 0x66, 0x8b, 0xdf, 0x59, 0xa0, 0x77, 0x1c, 0x4b, 0x51, 0x75, + 0xa3, 0xbe, 0x64, 0x61, 0xd5, 0xb4, 0x34, 0xac, 0xc9, 0x76, 0x4b, 0x31, 0xdc, 0x4a, 0xd6, 0xcd, + 0xba, 0x49, 0xff, 0x2e, 0x91, 0x7f, 0x8c, 0x5a, 0xfc, 0x99, 0x00, 0x13, 0x12, 0x7e, 0xda, 0xc6, + 0xb6, 0x53, 0xc1, 0x8a, 0x86, 0x2d, 0x74, 0x11, 0x92, 0x07, 0xf8, 0xa4, 0x90, 0x5c, 0x10, 0x6e, + 0xe6, 0x56, 0xc6, 0x3f, 0x3b, 0x9d, 0x4f, 0x6e, 0xe0, 0x13, 0x89, 0xd0, 0xd0, 0x02, 0x8c, 0x63, + 0x43, 0x93, 0xc9, 0xed, 0x54, 0xf8, 0xf6, 0x18, 0x36, 0xb4, 0x0d, 0x7c, 0x82, 0xbe, 0x0d, 0x69, + 0x9b, 0x48, 0x33, 0x54, 0x5c, 0x18, 0x5d, 0x10, 0x6e, 0x8e, 0xae, 0x7c, 0xe3, 0xb3, 0xd3, 0xf9, + 0x77, 0xeb, 0xba, 0xb3, 0xdf, 0xde, 0x5d, 0x54, 0xcd, 0xe6, 0x92, 0xa7, 0x7d, 0x6d, 0xd7, 0xff, + 0xbf, 0xd4, 0x3a, 0xa8, 0x2f, 0x75, 0xb6, 0x7c, 0xb1, 0x76, 0x6c, 0x54, 0xf1, 0x53, 0xc9, 0x93, + 0xf8, 0x4e, 0xea, 0x8f, 0x9f, 0xcc, 0x0b, 0xeb, 0xa9, 0xb4, 0x20, 0x26, 0xd6, 0x53, 0xe9, 0x84, + 0x98, 0x2c, 0x7e, 0x9c, 0x84, 0xbc, 0x84, 0xed, 0x96, 0x69, 0xd8, 0x98, 0xd7, 0xff, 0x75, 0x48, + 0x3a, 0xc7, 0x06, 0xad, 0x7f, 0xf6, 0xce, 0xdc, 0x62, 0x57, 0x6f, 0x2f, 0xd6, 0x2c, 0xc5, 0xb0, + 0x15, 0xd5, 0xd1, 0x4d, 0x43, 0x22, 0x45, 0xd1, 0xdb, 0x90, 0xb5, 0xb0, 0xdd, 0x6e, 0x62, 0xaa, + 0x2e, 0xda, 0xb4, 0xec, 0x9d, 0x0b, 0x11, 0x9c, 0xd5, 0x96, 0x62, 0x48, 0xc0, 0xca, 0x92, 0xff, + 0xe8, 0x22, 0xa4, 0x8d, 0x76, 0x93, 0x28, 0xc4, 0xa6, 0xcd, 0x4d, 0x4a, 0xe3, 0x46, 0xbb, 0xb9, + 0x81, 0x4f, 0x6c, 0x54, 0x82, 0xac, 0xa5, 0x18, 0x75, 0x2c, 0xeb, 0xc6, 0x9e, 0x69, 0x17, 0xc6, + 0x16, 0x92, 0x37, 0xb3, 0x77, 0x2e, 0x47, 0x08, 0x95, 0x48, 0xa9, 0x35, 0x63, 0xcf, 0x5c, 0x49, + 0x7d, 0x7a, 0x3a, 0x3f, 0x22, 0x81, 0xe5, 0x12, 0x6c, 0x54, 0x85, 0x09, 0x5e, 0x33, 0x0b, 0x2b, + 0xb6, 0x69, 0x14, 0xc6, 0x17, 0x84, 0x9b, 0xf9, 0x3b, 0x8b, 0x51, 0x62, 0x42, 0x5a, 0x20, 0x97, + 0xed, 0x26, 0x96, 0x28, 0x97, 0x94, 0xb3, 0x02, 0x57, 0xe8, 0x12, 0x64, 0x48, 0xa5, 0x77, 0x4f, + 0x1c, 0x6c, 0x17, 0xd2, 0xb4, 0xd6, 0xa4, 0x15, 0x2b, 0xe4, 0xba, 0xf8, 0x1e, 0xe4, 0x82, 0xac, + 0x08, 0x41, 0x5e, 0x2a, 0x57, 0x77, 0x36, 0xcb, 0xf2, 0xce, 0xd6, 0xc6, 0xd6, 0xa3, 0xf7, 0xb7, + 0xc4, 0x11, 0x34, 0x03, 0x22, 0xa7, 0x6d, 0x94, 0x3f, 0x90, 0x1f, 0xae, 0x6d, 0xae, 0xd5, 0x44, + 0x61, 0x36, 0xf5, 0x37, 0xff, 0xd1, 0xdc, 0x48, 0xf1, 0x09, 0xc0, 0x03, 0xec, 0x70, 0x8b, 0x42, + 0x2b, 0x30, 0xb6, 0x4f, 0xeb, 0x53, 0x10, 0xa8, 0x52, 0x17, 0x22, 0x2b, 0x1e, 0xb0, 0xbe, 0x95, + 0x34, 0xd1, 0xc1, 0xaf, 0x4e, 0xe7, 0x05, 0x89, 0x73, 0xb2, 0x4e, 0x2f, 0xfe, 0x5c, 0x80, 0x2c, + 0x15, 0xcc, 0x5a, 0x89, 0x4a, 0x1d, 0x92, 0xaf, 0x0c, 0x54, 0x49, 0xb7, 0x68, 0xb4, 0x08, 0xa3, + 0x87, 0x4a, 0xa3, 0x8d, 0x0b, 0x09, 0x2a, 0xa3, 0x10, 0x21, 0xe3, 0x09, 0xb9, 0x2f, 0xb1, 0x62, + 0xe8, 0x1e, 0xe4, 0x74, 0xc3, 0xc1, 0x86, 0x23, 0x33, 0xb6, 0xe4, 0x00, 0xb6, 0x2c, 0x2b, 0x4d, + 0x2f, 0x8a, 0xff, 0x52, 0x00, 0xd8, 0x6e, 0xc7, 0xa9, 0x1a, 0xf4, 0xc6, 0x90, 0xf5, 0xe7, 0x96, + 0xc5, 0x5b, 0x71, 0x1e, 0xc6, 0x74, 0xa3, 0xa1, 0x1b, 0xac, 0xfe, 0x69, 0x89, 0x5f, 0xa1, 0x19, + 0x18, 0xdd, 0x6d, 0xe8, 0x86, 0x46, 0x07, 0x40, 0x5a, 0x62, 0x17, 0x5c, 0xfd, 0x12, 0x64, 0x69, + 0xdd, 0x63, 0xd4, 0x7e, 0xf1, 0x97, 0x09, 0x38, 0x57, 0x32, 0x0d, 0x4d, 0x27, 0x23, 0x51, 0x69, + 0x7c, 0x29, 0x74, 0xb3, 0x0e, 0x33, 0x1a, 0x6e, 0x59, 0x58, 0x55, 0x1c, 0xac, 0xc9, 0xf8, 0xb8, + 0x35, 0x64, 0x4f, 0x23, 0x9f, 0xab, 0x7c, 0xdc, 0xa2, 0xb4, 0x68, 0x7d, 0xa2, 0x37, 0xe0, 0x82, + 0xd2, 0x68, 0x98, 0x47, 0xb2, 0xbe, 0x27, 0x6b, 0x26, 0xb6, 0x65, 0xc3, 0x74, 0x64, 0x7c, 0xac, + 0xdb, 0x0e, 0xf5, 0x20, 0x69, 0x69, 0x9a, 0xde, 0x5e, 0xdb, 0x5b, 0x35, 0xb1, 0xbd, 0x65, 0x3a, + 0x65, 0x72, 0x8b, 0x8c, 0x59, 0x52, 0x19, 0x36, 0x66, 0xc7, 0x88, 0xef, 0x95, 0xd2, 0xf8, 0xb8, + 0x45, 0xc7, 0x2c, 0xef, 0xa2, 0x8f, 0xe0, 0x7c, 0xa7, 0x36, 0xe3, 0xec, 0xad, 0xff, 0x24, 0x40, + 0x7e, 0xcd, 0xd0, 0x9d, 0x2f, 0x45, 0x37, 0x79, 0xaa, 0x4d, 0x06, 0x55, 0x7b, 0x0b, 0xc4, 0x3d, + 0x45, 0x6f, 0x3c, 0x32, 0x6a, 0x66, 0x73, 0xd7, 0x76, 0x4c, 0x03, 0xdb, 0x5c, 0xf7, 0x5d, 0x74, + 0xae, 0xb3, 0x27, 0x30, 0xe9, 0xb5, 0x29, 0x4e, 0x65, 0x3d, 0x03, 0x71, 0xcd, 0x50, 0x2d, 0xdc, + 0xc4, 0x46, 0xac, 0xda, 0xba, 0x0c, 0x19, 0xdd, 0x95, 0x4b, 0x35, 0x96, 0x94, 0x7c, 0x02, 0x6f, + 0x53, 0x1b, 0xa6, 0x02, 0xcf, 0x8e, 0xd3, 0x5d, 0x92, 0x89, 0x03, 0x1f, 0xc9, 0x7e, 0x7f, 0x91, + 0x89, 0x03, 0x1f, 0x31, 0xf7, 0xf6, 0x01, 0x4c, 0xac, 0xe2, 0x06, 0x76, 0x70, 0xfc, 0xbe, 0x7f, + 0x07, 0xf2, 0xae, 0xe8, 0x38, 0x3b, 0xe9, 0x1f, 0x0a, 0x80, 0xb8, 0x5c, 0x32, 0xe3, 0xc6, 0xd9, + 0x4f, 0xf3, 0x24, 0xa2, 0x70, 0xda, 0x96, 0xc1, 0x42, 0x03, 0x66, 0xa5, 0xc0, 0x48, 0x34, 0x3a, + 0xf0, 0x7d, 0x70, 0x2a, 0xe8, 0x83, 0xbd, 0x08, 0x87, 0xc4, 0x36, 0x47, 0x30, 0x1d, 0xaa, 0x5e, + 0xbc, 0x5d, 0x99, 0xa2, 0x35, 0x4b, 0x2c, 0x24, 0x83, 0x61, 0x1c, 0x25, 0x16, 0x3f, 0x82, 0xa9, + 0x52, 0x03, 0x2b, 0x56, 0xdc, 0x6a, 0xe1, 0xdd, 0xf9, 0x01, 0xa0, 0xa0, 0xf8, 0x38, 0xbb, 0xf4, + 0x1f, 0x0b, 0x80, 0x24, 0x7c, 0x88, 0x2d, 0x27, 0xf6, 0x2e, 0x5d, 0x85, 0xac, 0xa3, 0x58, 0x75, + 0xec, 0xc8, 0x24, 0xf4, 0xe6, 0xee, 0xea, 0xa5, 0x80, 0x20, 0x12, 0x80, 0x2f, 0xee, 0x37, 0xd4, + 0xc5, 0x9a, 0x1b, 0x9a, 0xbb, 0x01, 0x1d, 0xe3, 0x23, 0x64, 0xae, 0x81, 0x0f, 0x61, 0x3a, 0x54, + 0xcb, 0x38, 0x55, 0xf0, 0xbf, 0x04, 0xc8, 0x56, 0x55, 0xc5, 0x88, 0xb3, 0xed, 0xef, 0x41, 0xd6, + 0x56, 0x15, 0x43, 0xde, 0x33, 0xad, 0xa6, 0xe2, 0x50, 0x93, 0xcd, 0x87, 0xda, 0xee, 0x05, 0xc8, + 0xaa, 0x62, 0xdc, 0xa7, 0x85, 0x24, 0xb0, 0xbd, 0xff, 0xe8, 0x31, 0x64, 0x0f, 0xf0, 0x89, 0xcc, + 0x81, 0x14, 0x9d, 0xe7, 0xf2, 0x77, 0x5e, 0x0f, 0xf0, 0x1f, 0x1c, 0x2e, 0xba, 0xf8, 0x6b, 0x31, + 0x80, 0xbf, 0x16, 0x09, 0xc7, 0x62, 0xd5, 0xb1, 0xb0, 0x51, 0x77, 0xf6, 0x25, 0x38, 0xc0, 0x27, + 0x0f, 0x99, 0x8c, 0xe0, 0x40, 0x59, 0x4f, 0xa5, 0x93, 0x62, 0xaa, 0xf8, 0xbf, 0x05, 0xc8, 0xb1, + 0x86, 0xc7, 0x39, 0x50, 0xde, 0x84, 0x94, 0x65, 0x1e, 0xb1, 0x81, 0x92, 0xbd, 0x73, 0x29, 0x42, + 0xc4, 0x06, 0x3e, 0x09, 0xce, 0x50, 0xb4, 0x38, 0x5a, 0x01, 0x1e, 0xfb, 0xc9, 0x94, 0x3b, 0x39, + 0x2c, 0x37, 0x30, 0x2e, 0x89, 0xc8, 0xb8, 0x01, 0x93, 0xbb, 0x8a, 0xa3, 0xee, 0xcb, 0x16, 0xaf, + 0x24, 0x99, 0xcd, 0x92, 0x37, 0x73, 0x52, 0x9e, 0x92, 0xdd, 0xaa, 0xdb, 0xc5, 0xff, 0xe3, 0x5a, + 0xbd, 0x8d, 0xff, 0x2c, 0x7b, 0xfe, 0xff, 0x0a, 0x7c, 0x3c, 0xb9, 0xed, 0xff, 0x73, 0x33, 0x80, + 0x1f, 0x25, 0xe0, 0x42, 0x69, 0x1f, 0xab, 0x07, 0x25, 0xd3, 0xb0, 0x75, 0xdb, 0x21, 0x1a, 0x8c, + 0xd3, 0x0a, 0x2e, 0x41, 0xe6, 0x48, 0x77, 0xf6, 0x65, 0x4d, 0xdf, 0xdb, 0xa3, 0x9e, 0x2f, 0x2d, + 0xa5, 0x09, 0x61, 0x55, 0xdf, 0xdb, 0x43, 0x77, 0x21, 0xd5, 0x34, 0x35, 0x16, 0x22, 0xe7, 0xef, + 0xcc, 0x47, 0x88, 0xa7, 0x55, 0xb3, 0xdb, 0xcd, 0x4d, 0x53, 0xc3, 0x12, 0x2d, 0x8c, 0xe6, 0x00, + 0x54, 0x42, 0x6d, 0x99, 0xba, 0xe1, 0xf0, 0x39, 0x30, 0x40, 0x41, 0x15, 0xc8, 0x38, 0xd8, 0x6a, + 0xea, 0x86, 0xe2, 0xe0, 0xc2, 0x28, 0x55, 0xde, 0xd5, 0xc8, 0x8a, 0xb7, 0x1a, 0xba, 0xaa, 0xac, + 0x62, 0x5b, 0xb5, 0xf4, 0x96, 0x63, 0x5a, 0x5c, 0x8b, 0x3e, 0x33, 0xf7, 0xb8, 0x1f, 0xa7, 0xa0, + 0xd0, 0xad, 0xa1, 0x38, 0xed, 0x64, 0x1b, 0xc6, 0x08, 0xca, 0x6e, 0x38, 0xdc, 0x52, 0xee, 0xf4, + 0x52, 0x44, 0x44, 0x0d, 0x28, 0x5a, 0x6f, 0x38, 0xbc, 0xf2, 0x5c, 0xce, 0xec, 0xcf, 0x04, 0x18, + 0x63, 0x37, 0xd0, 0x6d, 0x48, 0xf3, 0xc5, 0x04, 0x8d, 0xd6, 0x31, 0xb9, 0x72, 0xfe, 0xf9, 0xe9, + 0xfc, 0x38, 0x5b, 0x3a, 0x58, 0xfd, 0xcc, 0xff, 0x2b, 0x8d, 0xb3, 0xd5, 0x03, 0x8d, 0xf4, 0x99, + 0xed, 0x28, 0x96, 0x43, 0x57, 0x6b, 0x12, 0x0c, 0x31, 0x50, 0xc2, 0x06, 0x3e, 0x41, 0xeb, 0x30, + 0x66, 0x3b, 0x8a, 0xd3, 0xb6, 0x79, 0xaf, 0x9d, 0xa9, 0xb2, 0x55, 0xca, 0x29, 0x71, 0x09, 0x24, + 0x94, 0xd1, 0xb0, 0xa3, 0xe8, 0x0d, 0xda, 0x8d, 0x19, 0x89, 0x5f, 0x15, 0x7f, 0x28, 0xc0, 0x18, + 0x2b, 0x8a, 0x2e, 0xc0, 0xb4, 0xb4, 0xbc, 0xf5, 0xa0, 0x2c, 0xaf, 0x6d, 0xad, 0x96, 0x6b, 0x65, + 0x69, 0x73, 0x6d, 0x6b, 0xb9, 0x56, 0x16, 0x47, 0xd0, 0x79, 0x40, 0xee, 0x8d, 0xd2, 0xa3, 0xad, + 0xea, 0x5a, 0xb5, 0x56, 0xde, 0xaa, 0x89, 0x02, 0x5d, 0x61, 0xa0, 0xf4, 0x00, 0x35, 0x81, 0xae, + 0xc2, 0x42, 0x27, 0x55, 0xae, 0xd6, 0x96, 0x6b, 0x55, 0xb9, 0x5c, 0xad, 0xad, 0x6d, 0x2e, 0xd7, + 0xca, 0xab, 0x62, 0xb2, 0x4f, 0x29, 0xf2, 0x10, 0x49, 0x2a, 0x97, 0x6a, 0x62, 0xaa, 0xf8, 0x0c, + 0xce, 0x49, 0x58, 0x35, 0x9b, 0xad, 0xb6, 0x83, 0x49, 0x2d, 0xed, 0x38, 0xc7, 0xcb, 0x05, 0x18, + 0xd7, 0xac, 0x13, 0xd9, 0x6a, 0x1b, 0x7c, 0xb4, 0x8c, 0x69, 0xd6, 0x89, 0xd4, 0x36, 0xb8, 0x31, + 0xfe, 0x33, 0x01, 0xce, 0x77, 0x3e, 0x3c, 0x4e, 0x53, 0x7c, 0x0c, 0x59, 0x45, 0xd3, 0xb0, 0x26, + 0x6b, 0xb8, 0xe1, 0x28, 0x3c, 0x54, 0xb9, 0x15, 0x90, 0xc4, 0x57, 0xda, 0x16, 0xbd, 0x95, 0xb6, + 0xcd, 0x27, 0xa5, 0x12, 0xad, 0xc8, 0x2a, 0xe1, 0x70, 0x5d, 0x11, 0x15, 0x42, 0x29, 0xc5, 0x7f, + 0x9e, 0x82, 0x89, 0xb2, 0xa1, 0xd5, 0x8e, 0x63, 0x9d, 0x5d, 0xce, 0xc3, 0x98, 0x6a, 0x36, 0x9b, + 0xba, 0xe3, 0xaa, 0x89, 0x5d, 0xa1, 0xaf, 0x42, 0x5a, 0xc3, 0x8a, 0xe6, 0xad, 0x51, 0x0c, 0x0a, + 0xb4, 0x24, 0xaf, 0x38, 0xfa, 0x0e, 0x5c, 0x20, 0x1e, 0xd4, 0x32, 0x94, 0x86, 0xcc, 0xa4, 0xc9, + 0x8e, 0xa5, 0xd7, 0xeb, 0xd8, 0xe2, 0xeb, 0x7a, 0x37, 0x23, 0xea, 0xb9, 0xc6, 0x39, 0x4a, 0x94, + 0xa1, 0xc6, 0xca, 0x4b, 0xe7, 0xf4, 0x28, 0x32, 0x7a, 0x17, 0x80, 0x4c, 0x4e, 0x74, 0xad, 0xd0, + 0xe6, 0xbe, 0xa9, 0xd7, 0x62, 0xa1, 0xeb, 0x8e, 0x08, 0x03, 0xb9, 0xb6, 0xd1, 0x12, 0x41, 0x06, + 0x4f, 0xdb, 0xba, 0x85, 0xe5, 0xdb, 0x2d, 0x95, 0x42, 0xf9, 0xf4, 0x4a, 0xfe, 0xf9, 0xe9, 0x3c, + 0x48, 0x8c, 0x7c, 0x7b, 0xbb, 0x44, 0x90, 0x02, 0xfb, 0xdf, 0x52, 0xd1, 0x0a, 0xcc, 0x91, 0x09, + 0x98, 0xb7, 0x45, 0x71, 0xe4, 0x7d, 0xbd, 0xbe, 0x8f, 0x2d, 0xd9, 0x5b, 0x00, 0xa6, 0x4b, 0x78, + 0x69, 0x69, 0x56, 0x55, 0x0c, 0x56, 0xd1, 0x65, 0xa7, 0x42, 0x8b, 0x78, 0xea, 0x21, 0x7a, 0x6e, + 0x99, 0xba, 0x6d, 0x1a, 0x85, 0x0c, 0xd3, 0x33, 0xbb, 0x42, 0x8f, 0x41, 0xd4, 0x0d, 0x79, 0xaf, + 0xa1, 0xd7, 0xf7, 0x1d, 0xf9, 0xc8, 0xd2, 0x1d, 0x6c, 0x17, 0xa6, 0x68, 0x83, 0xa2, 0xec, 0xae, + 0xca, 0x97, 0x61, 0xb5, 0xf7, 0x49, 0x49, 0xde, 0xb4, 0xbc, 0x6e, 0xdc, 0xa7, 0xfc, 0x94, 0x68, + 0x7b, 0xb3, 0xf3, 0xb8, 0x98, 0x2e, 0xfe, 0x37, 0x01, 0xf2, 0xae, 0xd1, 0xc4, 0x69, 0xdf, 0x37, + 0x41, 0x34, 0x0d, 0x2c, 0xb7, 0xf6, 0x15, 0x1b, 0x73, 0xc5, 0xf0, 0x29, 0x24, 0x6f, 0x1a, 0x78, + 0x9b, 0x90, 0x99, 0x26, 0xd0, 0x36, 0x4c, 0xd9, 0x8e, 0x52, 0xd7, 0x8d, 0x7a, 0x40, 0x5f, 0xa3, + 0xc3, 0x87, 0xee, 0x22, 0xe7, 0xf6, 0xe8, 0xa1, 0xb8, 0xe3, 0xd7, 0x02, 0x4c, 0x2d, 0x6b, 0x4d, + 0xdd, 0xa8, 0xb6, 0x1a, 0x7a, 0xac, 0x38, 0xff, 0x2a, 0x64, 0x6c, 0x22, 0xd3, 0x77, 0xde, 0x3e, + 0x46, 0x4b, 0xd3, 0x3b, 0xc4, 0x8b, 0x3f, 0x84, 0x49, 0x7c, 0xdc, 0xd2, 0x2d, 0xc5, 0xd1, 0x4d, + 0x83, 0xc1, 0x92, 0xd4, 0xf0, 0x6d, 0xcb, 0xfb, 0xbc, 0x3e, 0x34, 0xe1, 0x2d, 0xfb, 0x00, 0x50, + 0xb0, 0x61, 0x71, 0xe2, 0x13, 0x19, 0xa6, 0xa9, 0xe8, 0x1d, 0xc3, 0x8e, 0x59, 0x6b, 0xdc, 0xbb, + 0x7e, 0x0b, 0x66, 0xc2, 0x0f, 0x88, 0xb3, 0xf6, 0x1f, 0xf1, 0x1e, 0xdf, 0xc4, 0xd6, 0x17, 0x04, + 0x8d, 0x83, 0xe2, 0xe3, 0xac, 0xf9, 0x0f, 0x04, 0xb8, 0x48, 0x65, 0xd3, 0xd7, 0x1f, 0x7b, 0xd8, + 0x7a, 0x88, 0x15, 0x3b, 0x56, 0x84, 0xfc, 0x32, 0x8c, 0x31, 0xa4, 0x4b, 0x2d, 0x76, 0x74, 0x25, + 0x4b, 0xe2, 0x92, 0xaa, 0x63, 0x5a, 0x24, 0x2e, 0xe1, 0xb7, 0x78, 0x3b, 0x15, 0x98, 0x8d, 0xaa, + 0x4b, 0xcc, 0x4b, 0x01, 0x53, 0x3c, 0x3c, 0x24, 0x26, 0x5e, 0xda, 0x27, 0x71, 0x11, 0x2a, 0x43, + 0x56, 0xa5, 0xff, 0x64, 0xe7, 0xa4, 0x85, 0xa9, 0xfc, 0x7c, 0xbf, 0xc8, 0x92, 0xb1, 0xd5, 0x4e, + 0x5a, 0x98, 0x84, 0xa7, 0xee, 0x7f, 0xa2, 0xae, 0x40, 0x53, 0xfb, 0xc6, 0xa6, 0x74, 0x7c, 0xd1, + 0xb2, 0x6e, 0x78, 0x17, 0xd2, 0xc4, 0xbf, 0x48, 0x72, 0x55, 0xb0, 0x27, 0x71, 0xa6, 0x58, 0xa3, + 0x91, 0x0f, 0xe1, 0x7c, 0x60, 0x4d, 0x3b, 0xd8, 0xfc, 0xc4, 0x19, 0x9a, 0x1f, 0x58, 0x17, 0xf7, + 0xa9, 0xe8, 0x03, 0x08, 0xac, 0x7c, 0xcb, 0xac, 0x65, 0x2e, 0xda, 0x39, 0x8b, 0x52, 0xa6, 0x7c, + 0x29, 0x8c, 0x6e, 0xa3, 0x12, 0xa4, 0xf1, 0x71, 0x4b, 0xd6, 0xb0, 0xad, 0x72, 0xb7, 0x56, 0xec, + 0xf5, 0xf6, 0xac, 0x2b, 0xfe, 0x1f, 0xc7, 0xc7, 0x2d, 0x42, 0x44, 0x3b, 0x64, 0x86, 0x73, 0xc3, + 0x01, 0x5a, 0x6d, 0x7b, 0x30, 0x9c, 0xf0, 0xed, 0x85, 0x8b, 0x9b, 0xf4, 0x22, 0x01, 0x26, 0x82, + 0xf7, 0xdd, 0x27, 0x02, 0x5c, 0x8a, 0xec, 0xbb, 0x38, 0x27, 0xbb, 0x77, 0x21, 0x45, 0x55, 0x90, + 0x38, 0xa3, 0x0a, 0x28, 0x57, 0xf1, 0x27, 0xee, 0xa8, 0x97, 0x70, 0xc3, 0x24, 0xea, 0xfd, 0x02, + 0xd6, 0xc5, 0xc6, 0xdd, 0x6e, 0x4f, 0x9c, 0xb9, 0xdb, 0x5d, 0xd6, 0x0e, 0xb7, 0xd0, 0x51, 0xd9, + 0x38, 0xdd, 0xc2, 0xdf, 0x15, 0x60, 0xba, 0x82, 0x15, 0xcb, 0xd9, 0xc5, 0x8a, 0x13, 0x73, 0x38, + 0xfb, 0x26, 0x24, 0x0d, 0xf3, 0xe8, 0x2c, 0x4b, 0x83, 0xa4, 0xbc, 0x3f, 0x6d, 0x85, 0xeb, 0x15, + 0x67, 0xab, 0xff, 0x7d, 0x02, 0x32, 0x0f, 0x4a, 0x71, 0xb6, 0xf5, 0x5d, 0xbe, 0x80, 0xcc, 0x86, + 0x7a, 0x94, 0x59, 0x7a, 0xcf, 0x5b, 0x7c, 0x50, 0xda, 0xc0, 0x27, 0xae, 0x59, 0x12, 0x2e, 0xb4, + 0x0c, 0x19, 0x67, 0xdf, 0xc2, 0xf6, 0xbe, 0xd9, 0xd0, 0xce, 0x12, 0xb3, 0xf8, 0x5c, 0xb3, 0x07, + 0x30, 0x4a, 0xe5, 0xba, 0xf9, 0x0a, 0x42, 0x44, 0xbe, 0x02, 0x79, 0x8c, 0x17, 0xf6, 0x25, 0xce, + 0xf2, 0x18, 0x97, 0xc0, 0x3a, 0xc7, 0x8b, 0x8d, 0x46, 0xc5, 0xb1, 0xe2, 0x63, 0x00, 0xd2, 0xb4, + 0x38, 0xbb, 0xe7, 0x6f, 0x25, 0x21, 0xbf, 0xdd, 0xb6, 0xf7, 0x63, 0xb6, 0xc7, 0x12, 0x40, 0xab, + 0x6d, 0x53, 0xb0, 0x70, 0x6c, 0xf0, 0xf6, 0x0f, 0x48, 0x88, 0x70, 0x15, 0xc0, 0xf8, 0x6a, 0xc7, + 0x06, 0xaa, 0x70, 0x21, 0x58, 0xf6, 0xb3, 0x2a, 0x5e, 0xee, 0x87, 0x25, 0x6b, 0xc7, 0xc6, 0x26, + 0xf6, 0x40, 0x24, 0x93, 0x84, 0x89, 0xa4, 0x77, 0x61, 0x9c, 0x5c, 0xc8, 0x8e, 0x79, 0x96, 0x2e, + 0x1f, 0x23, 0x3c, 0x35, 0x13, 0xdd, 0x83, 0x0c, 0xe3, 0x26, 0x13, 0xd7, 0x18, 0x9d, 0xb8, 0xa2, + 0xda, 0xc2, 0xd5, 0x48, 0xa7, 0xac, 0x34, 0x65, 0x25, 0xd3, 0xd4, 0x0c, 0x8c, 0xee, 0x99, 0x96, + 0x8a, 0x69, 0xfe, 0x44, 0x5a, 0x62, 0x17, 0xc1, 0x5e, 0x5d, 0x4f, 0xa5, 0xd3, 0x62, 0x66, 0x3d, + 0x95, 0xce, 0x88, 0x50, 0xfc, 0xa1, 0x00, 0x93, 0x5e, 0x77, 0xc4, 0xe9, 0xcb, 0x4b, 0x21, 0x5d, + 0x9e, 0xbd, 0x43, 0x88, 0x1a, 0x8b, 0xff, 0x81, 0x06, 0x36, 0xaa, 0x79, 0x48, 0xfb, 0x27, 0x4e, + 0x7b, 0xb9, 0xc7, 0x32, 0x67, 0x12, 0x67, 0xed, 0x63, 0x9a, 0x44, 0x73, 0x1b, 0x66, 0xf4, 0x26, + 0xf1, 0xf2, 0xba, 0xd3, 0x38, 0xe1, 0xa8, 0xcc, 0xc1, 0xee, 0x1b, 0xda, 0x69, 0xff, 0x5e, 0xc9, + 0xbd, 0xc5, 0x1d, 0x1f, 0x7b, 0x67, 0xe3, 0xb7, 0x27, 0x4e, 0x85, 0xaf, 0xc1, 0x84, 0xc5, 0x44, + 0x93, 0xe8, 0xe4, 0x8c, 0x3a, 0xcf, 0x79, 0xac, 0x44, 0xed, 0x3f, 0x4e, 0xc0, 0xe4, 0xe3, 0x36, + 0xb6, 0x4e, 0xbe, 0x4c, 0x4a, 0xbf, 0x0e, 0x93, 0x47, 0x8a, 0xee, 0xc8, 0x7b, 0xa6, 0x25, 0xb7, + 0x5b, 0x9a, 0xe2, 0xb8, 0x39, 0x1d, 0x13, 0x84, 0x7c, 0xdf, 0xb4, 0x76, 0x28, 0x11, 0x61, 0x40, + 0x07, 0x86, 0x79, 0x64, 0xc8, 0x84, 0x4c, 0xd1, 0xf0, 0xb1, 0xc1, 0x17, 0x93, 0x57, 0xde, 0xfa, + 0xaf, 0xa7, 0xf3, 0x77, 0x87, 0x4a, 0xd0, 0xa2, 0x29, 0x66, 0xed, 0xb6, 0xae, 0x2d, 0xee, 0xec, + 0xac, 0xad, 0x4a, 0x22, 0x15, 0xf9, 0x3e, 0x93, 0x58, 0x3b, 0x36, 0xdc, 0x59, 0xfc, 0x33, 0x01, + 0x44, 0x5f, 0x53, 0x71, 0x76, 0x67, 0x19, 0xb2, 0x4f, 0xdb, 0xd8, 0xd2, 0x5f, 0xa0, 0x33, 0x81, + 0x33, 0x12, 0x47, 0xf4, 0x21, 0xe4, 0x42, 0x7a, 0x48, 0x7e, 0x3e, 0x3d, 0x64, 0x8f, 0x7c, 0x15, + 0x14, 0xff, 0x9d, 0x00, 0x88, 0x36, 0x7e, 0x8d, 0xad, 0xe3, 0x7f, 0x59, 0x2c, 0xe5, 0x26, 0x88, + 0x34, 0x39, 0x51, 0xd6, 0xf7, 0xe4, 0xa6, 0x6e, 0xdb, 0xba, 0x51, 0xe7, 0xa6, 0x92, 0xa7, 0xf4, + 0xb5, 0xbd, 0x4d, 0x46, 0xe5, 0x9d, 0xf8, 0x57, 0x60, 0x3a, 0xd4, 0x8c, 0x38, 0xbb, 0xf1, 0x0a, + 0xe4, 0xf6, 0xcc, 0xb6, 0xa1, 0xc9, 0xec, 0x5d, 0x07, 0x5f, 0xfc, 0xcb, 0x52, 0x1a, 0x7b, 0x5e, + 0xf1, 0x7f, 0x24, 0x60, 0x46, 0xc2, 0xb6, 0xd9, 0x38, 0xc4, 0xf1, 0x2b, 0xb2, 0x02, 0xfc, 0x2d, + 0x8b, 0xfc, 0x42, 0xfa, 0xcc, 0x30, 0x66, 0x36, 0xa5, 0x85, 0xd7, 0xd1, 0xaf, 0xf6, 0xb7, 0xc5, + 0xee, 0x95, 0x73, 0xbe, 0x2c, 0x97, 0x0a, 0x2d, 0xcb, 0x99, 0x30, 0xa9, 0xd7, 0x0d, 0x93, 0xf8, + 0x2c, 0x1b, 0x3f, 0x35, 0xda, 0x4d, 0x17, 0xb3, 0x2c, 0xf6, 0xab, 0xe4, 0x1a, 0x63, 0xa9, 0xe2, + 0xa7, 0x5b, 0xed, 0x26, 0x8d, 0x9c, 0x57, 0xce, 0x93, 0xfa, 0x3e, 0x3f, 0x9d, 0xcf, 0x87, 0xee, + 0xd9, 0x52, 0x5e, 0xf7, 0xae, 0x89, 0x74, 0xde, 0xe5, 0xdf, 0x86, 0x73, 0x1d, 0x2a, 0x8f, 0x33, + 0xc6, 0xf9, 0x37, 0x49, 0xb8, 0x18, 0x16, 0x1f, 0x37, 0x12, 0xf9, 0xb2, 0x77, 0x6b, 0x05, 0x26, + 0x9a, 0xba, 0xf1, 0x62, 0x0b, 0x91, 0xb9, 0xa6, 0x6e, 0xf8, 0xeb, 0xb9, 0x11, 0x06, 0x32, 0xf6, + 0xff, 0xc1, 0x40, 0x14, 0x98, 0x8d, 0xea, 0xc1, 0x38, 0xad, 0xe4, 0x63, 0x01, 0x72, 0x71, 0xaf, + 0xad, 0xbd, 0x58, 0x8e, 0x19, 0x6f, 0x73, 0x0d, 0x26, 0xbe, 0x80, 0xc5, 0xb8, 0x1f, 0x0b, 0x80, + 0x6a, 0x56, 0xdb, 0x20, 0x20, 0xf7, 0xa1, 0x59, 0x8f, 0xb3, 0xb1, 0x33, 0x30, 0xaa, 0x1b, 0x1a, + 0x3e, 0xa6, 0x8d, 0x4d, 0x49, 0xec, 0x22, 0xf4, 0x02, 0x31, 0x39, 0xd4, 0x0b, 0x44, 0x3f, 0x55, + 0x25, 0x54, 0xd1, 0x38, 0xb5, 0xf0, 0x4f, 0x13, 0x30, 0xcd, 0x9b, 0x13, 0xfb, 0x62, 0xe4, 0x1b, + 0x30, 0xda, 0x20, 0x32, 0xfb, 0xf4, 0x39, 0x7d, 0xa6, 0xdb, 0xe7, 0xb4, 0x30, 0xfa, 0x1a, 0x40, + 0xcb, 0xc2, 0x87, 0x32, 0x63, 0x4d, 0x0e, 0xc5, 0x9a, 0x21, 0x1c, 0x94, 0x80, 0xbe, 0x09, 0x93, + 0x64, 0x84, 0xb7, 0x2c, 0xb3, 0x65, 0xda, 0x24, 0x48, 0xb1, 0x87, 0x43, 0x3a, 0x53, 0xcf, 0x4f, + 0xe7, 0x27, 0x36, 0x75, 0x63, 0x9b, 0x33, 0xd6, 0xaa, 0x12, 0x71, 0x15, 0xde, 0xa5, 0x3b, 0x00, + 0xff, 0xb3, 0x00, 0x33, 0x5f, 0xd8, 0xf2, 0xed, 0x5f, 0x84, 0xc6, 0xbc, 0x99, 0x47, 0xa4, 0x97, + 0x6b, 0xc6, 0x9e, 0x19, 0xff, 0xa2, 0xfa, 0xc7, 0x02, 0x4c, 0x05, 0xc4, 0xc7, 0x19, 0xc9, 0xbc, + 0x90, 0xce, 0x8a, 0xdf, 0x22, 0xb1, 0x4d, 0xd0, 0xec, 0xe3, 0x1c, 0x54, 0xff, 0x2a, 0x01, 0xe7, + 0x4b, 0xec, 0xd5, 0xb2, 0x9b, 0x77, 0x11, 0xa7, 0x95, 0x14, 0x60, 0xfc, 0x10, 0x5b, 0xb6, 0x6e, + 0xb2, 0x19, 0x76, 0x42, 0x72, 0x2f, 0xd1, 0x2c, 0xa4, 0x6d, 0x43, 0x69, 0xd9, 0xfb, 0xa6, 0xfb, + 0x36, 0xce, 0xbb, 0xf6, 0x72, 0x44, 0x46, 0x5f, 0x3c, 0x47, 0x64, 0xac, 0x7f, 0x8e, 0xc8, 0xf8, + 0xe7, 0xce, 0x11, 0xe1, 0xaf, 0xbe, 0x7e, 0x21, 0xc0, 0x85, 0x2e, 0xfd, 0xc5, 0x69, 0x33, 0xdf, + 0x85, 0xac, 0xca, 0x05, 0x13, 0x6f, 0xcc, 0xde, 0xee, 0xad, 0x91, 0x62, 0x2f, 0x08, 0x40, 0x9e, + 0x9f, 0xce, 0x83, 0x5b, 0xd5, 0xb5, 0x55, 0xae, 0x22, 0xf2, 0x5f, 0x2b, 0xfe, 0x97, 0x1c, 0x4c, + 0x96, 0x8f, 0xd9, 0xda, 0x75, 0x95, 0xc5, 0x03, 0xe8, 0x3e, 0xa4, 0x5b, 0x96, 0x79, 0xa8, 0xbb, + 0xcd, 0xc8, 0x87, 0x52, 0x03, 0xdc, 0x66, 0x74, 0x70, 0x6d, 0x73, 0x0e, 0xc9, 0xe3, 0x45, 0x35, + 0xc8, 0x3c, 0x34, 0x55, 0xa5, 0x71, 0x5f, 0x6f, 0xb8, 0xf6, 0xff, 0xfa, 0x60, 0x41, 0x8b, 0x1e, + 0xcf, 0xb6, 0xe2, 0xec, 0xbb, 0x5d, 0xe1, 0x11, 0xd1, 0x1a, 0xa4, 0x2b, 0x8e, 0xd3, 0x22, 0x37, + 0xb9, 0x37, 0xb9, 0x31, 0x84, 0x50, 0xc2, 0xc2, 0x65, 0x79, 0xec, 0xa8, 0x06, 0x53, 0x0f, 0x4c, + 0xb3, 0xde, 0xc0, 0xa5, 0x86, 0xd9, 0xd6, 0x4a, 0xa6, 0xb1, 0xa7, 0xd7, 0xb9, 0x3f, 0xbe, 0x3e, + 0x84, 0xcc, 0x07, 0xa5, 0xaa, 0xd4, 0x2d, 0x00, 0x2d, 0x43, 0xba, 0x7a, 0x97, 0x0b, 0x63, 0x01, + 0xdc, 0xb5, 0x21, 0x84, 0x55, 0xef, 0x4a, 0x1e, 0x1b, 0x5a, 0x87, 0xec, 0xf2, 0xb3, 0xb6, 0x85, + 0xb9, 0x94, 0xb1, 0x9e, 0x79, 0x09, 0x9d, 0x52, 0x28, 0x97, 0x14, 0x64, 0x46, 0x55, 0xc8, 0xbf, + 0x6f, 0x5a, 0x07, 0x0d, 0x53, 0x71, 0x5b, 0x38, 0x4e, 0xc5, 0x7d, 0x65, 0x08, 0x71, 0x2e, 0xa3, + 0xd4, 0x21, 0x02, 0x7d, 0x1b, 0x26, 0x49, 0x67, 0xd4, 0x94, 0xdd, 0x86, 0x5b, 0xc9, 0x34, 0x95, + 0xfa, 0xea, 0x10, 0x52, 0x3d, 0x4e, 0xf7, 0xe5, 0x49, 0x87, 0xa8, 0xd9, 0x6f, 0xc2, 0x44, 0xc8, + 0x08, 0x10, 0x82, 0x54, 0x8b, 0xf4, 0xb7, 0x40, 0xf3, 0x87, 0xe8, 0x7f, 0xf4, 0x1a, 0x8c, 0x1b, + 0xa6, 0x86, 0xdd, 0x11, 0x32, 0xb1, 0x32, 0xf3, 0xfc, 0x74, 0x7e, 0x6c, 0xcb, 0xd4, 0x58, 0xb8, + 0xc2, 0xff, 0x49, 0x63, 0xa4, 0x90, 0x1b, 0xac, 0xcc, 0x5e, 0x87, 0x14, 0xe9, 0x7d, 0xe2, 0xa4, + 0x76, 0x15, 0x1b, 0xef, 0x58, 0x3a, 0x97, 0xe9, 0x5e, 0xf2, 0x72, 0xbf, 0x11, 0x20, 0x51, 0xbd, + 0x4b, 0x02, 0xf5, 0xdd, 0xb6, 0x7a, 0x80, 0x1d, 0x5e, 0x8a, 0x5f, 0xd1, 0x00, 0xde, 0xc2, 0x7b, + 0x3a, 0x8b, 0xa1, 0x32, 0x12, 0xbf, 0x42, 0x2f, 0x01, 0x28, 0xaa, 0x8a, 0x6d, 0x5b, 0x76, 0x37, + 0xc8, 0x65, 0xa4, 0x0c, 0xa3, 0x6c, 0xe0, 0x13, 0xc2, 0x66, 0x63, 0xd5, 0xc2, 0x8e, 0x9b, 0x08, + 0xc5, 0xae, 0x08, 0x9b, 0x83, 0x9b, 0x2d, 0xd9, 0x31, 0x0f, 0xb0, 0x41, 0x6d, 0x26, 0x43, 0x9c, + 0x4f, 0xb3, 0x55, 0x23, 0x04, 0xe2, 0x37, 0xb1, 0xa1, 0xf9, 0x4e, 0x2e, 0x23, 0x79, 0xd7, 0x44, + 0xa4, 0x85, 0xeb, 0x3a, 0xdf, 0xf8, 0x95, 0x91, 0xf8, 0x15, 0xd1, 0x98, 0xd2, 0x76, 0xf6, 0x69, + 0xaf, 0x64, 0x24, 0xfa, 0x9f, 0x37, 0xed, 0xef, 0x0b, 0x90, 0x7c, 0x50, 0xaa, 0x9e, 0xb9, 0x6d, + 0xae, 0xc4, 0xa4, 0x2f, 0x91, 0xe6, 0x1f, 0xea, 0x8d, 0x86, 0x6e, 0xd4, 0x49, 0x48, 0xf3, 0x5d, + 0xac, 0xba, 0x2d, 0xcb, 0x73, 0xf2, 0x36, 0xa3, 0xa2, 0x05, 0xc8, 0xaa, 0x16, 0xd6, 0xb0, 0xe1, + 0xe8, 0x4a, 0xc3, 0xe6, 0x4d, 0x0c, 0x92, 0x78, 0xe5, 0xbe, 0x2f, 0xc0, 0x28, 0x35, 0x5e, 0x74, + 0x19, 0x32, 0xaa, 0x69, 0x38, 0x8a, 0x6e, 0x70, 0x2f, 0x94, 0x91, 0x7c, 0x42, 0xcf, 0x4a, 0x5e, + 0x81, 0x9c, 0xa2, 0xaa, 0x66, 0xdb, 0x70, 0x64, 0x43, 0x69, 0x62, 0x5e, 0xd9, 0x2c, 0xa7, 0x6d, + 0x29, 0x4d, 0x8c, 0xe6, 0xc1, 0xbd, 0xf4, 0xb6, 0x29, 0x66, 0x24, 0xe0, 0xa4, 0x0d, 0x7c, 0xc2, + 0x6b, 0xf2, 0x0b, 0x01, 0xd2, 0xae, 0xd1, 0x93, 0xca, 0xd4, 0xb1, 0x81, 0x2d, 0xc5, 0x31, 0xbd, + 0xca, 0x78, 0x84, 0xce, 0x19, 0x2f, 0xe3, 0xcf, 0x78, 0x33, 0x30, 0xea, 0x10, 0xbb, 0xe6, 0xf5, + 0x60, 0x17, 0x74, 0xad, 0xb9, 0xa1, 0xd4, 0xd9, 0xf2, 0x5a, 0x46, 0x62, 0x17, 0xa4, 0x49, 0x3c, + 0x87, 0x96, 0x69, 0x87, 0x5f, 0x91, 0xfa, 0xb2, 0x1c, 0xcf, 0x5d, 0x5c, 0xd7, 0x0d, 0x6a, 0x00, + 0x49, 0x09, 0x28, 0x69, 0x85, 0x50, 0xd0, 0x25, 0xc8, 0xb0, 0x02, 0xd8, 0xd0, 0xa8, 0x15, 0x24, + 0xa5, 0x34, 0x25, 0x94, 0xdd, 0xcd, 0x59, 0xb3, 0x07, 0x90, 0xf1, 0xc6, 0x18, 0xe9, 0xc8, 0xb6, + 0xed, 0x29, 0x95, 0xfe, 0x47, 0xaf, 0xc3, 0xcc, 0xd3, 0xb6, 0xd2, 0xd0, 0xf7, 0xe8, 0xca, 0x19, + 0x29, 0xc6, 0xf4, 0xc7, 0xda, 0x83, 0xbc, 0x7b, 0x54, 0x02, 0x55, 0xa3, 0x3b, 0x24, 0x93, 0xfe, + 0x90, 0x0c, 0xbe, 0x0a, 0x29, 0xfe, 0x54, 0x80, 0x29, 0x96, 0x06, 0xc4, 0x32, 0x51, 0xe3, 0x0b, + 0x30, 0xde, 0x81, 0x8c, 0xa6, 0x38, 0x0a, 0xdb, 0x8a, 0x99, 0xe8, 0xbb, 0x15, 0xd3, 0xf5, 0xf8, + 0xa4, 0x3c, 0xdd, 0x8e, 0x89, 0x20, 0x45, 0xfe, 0xb3, 0xbd, 0xab, 0x12, 0xfd, 0xef, 0x27, 0x56, + 0x04, 0xab, 0x1b, 0x67, 0xc0, 0xb5, 0x04, 0xe7, 0x88, 0xf6, 0xcb, 0x86, 0x6a, 0x9d, 0xb4, 0x1c, + 0xdd, 0x34, 0x1e, 0xd1, 0x5f, 0x1b, 0x89, 0x81, 0x17, 0x53, 0xf4, 0x7d, 0x14, 0xaf, 0xcb, 0xbf, + 0x1d, 0x83, 0x89, 0xf2, 0x71, 0xcb, 0xb4, 0x62, 0x5d, 0xd4, 0x5a, 0x81, 0x71, 0x8e, 0xf8, 0xfb, + 0xbc, 0x2a, 0xee, 0xf0, 0xd5, 0xee, 0x5b, 0x58, 0xce, 0x88, 0x56, 0x00, 0x58, 0xce, 0x28, 0xcd, + 0x25, 0x4a, 0x9e, 0xe1, 0x85, 0x19, 0x65, 0x23, 0x54, 0xb4, 0x05, 0xd9, 0xe6, 0xa1, 0xaa, 0xca, + 0x7b, 0x7a, 0xc3, 0xe1, 0x49, 0x77, 0xd1, 0x19, 0xe3, 0x9b, 0x4f, 0x4a, 0xa5, 0xfb, 0xb4, 0x10, + 0xcb, 0x7f, 0xf3, 0xaf, 0x25, 0x20, 0x12, 0xd8, 0x7f, 0xf4, 0x2a, 0xf0, 0x7d, 0x33, 0xb2, 0xed, + 0x6e, 0x91, 0x5b, 0x99, 0x78, 0x7e, 0x3a, 0x9f, 0x91, 0x28, 0xb5, 0x5a, 0xad, 0x49, 0x19, 0x56, + 0xa0, 0x6a, 0x3b, 0xe8, 0x65, 0x98, 0x30, 0x9b, 0xba, 0x23, 0xbb, 0x31, 0x10, 0x0f, 0x1b, 0x73, + 0x84, 0xe8, 0xc6, 0x48, 0xa8, 0x06, 0x37, 0xb0, 0x41, 0x47, 0x01, 0x69, 0xa7, 0xbc, 0xcb, 0xd6, + 0x22, 0x1d, 0x36, 0xde, 0x65, 0xb3, 0xe5, 0xe8, 0x4d, 0xfd, 0x19, 0x7d, 0x59, 0xcd, 0xdf, 0x17, + 0xbd, 0xcc, 0x8a, 0x93, 0xf6, 0xad, 0xd0, 0x45, 0x4a, 0x5e, 0xf6, 0x51, 0xa0, 0x28, 0xfa, 0xbe, + 0x00, 0xe7, 0xb9, 0x22, 0xe5, 0x5d, 0x9a, 0xf2, 0xae, 0x34, 0x74, 0xe7, 0x44, 0x3e, 0x38, 0x2c, + 0xa4, 0x69, 0x70, 0xfa, 0xd5, 0xc8, 0x0e, 0x09, 0xd8, 0xc1, 0xa2, 0xdb, 0x2d, 0x27, 0x0f, 0x39, + 0xf3, 0xc6, 0x61, 0xd9, 0x70, 0xac, 0x93, 0x95, 0x0b, 0xcf, 0x4f, 0xe7, 0xa7, 0xbb, 0xef, 0x3e, + 0x91, 0xa6, 0xed, 0x6e, 0x16, 0x54, 0x01, 0xc0, 0x9e, 0x35, 0xd2, 0x94, 0xbf, 0xe8, 0xf0, 0x22, + 0xd2, 0x6c, 0xa5, 0x00, 0x2f, 0xba, 0x09, 0x22, 0xdf, 0xf4, 0xb2, 0xa7, 0x37, 0xb0, 0x6c, 0xeb, + 0xcf, 0x70, 0x01, 0xa8, 0x0f, 0xca, 0x33, 0x3a, 0x11, 0x51, 0xd5, 0x9f, 0xe1, 0xd9, 0xef, 0x42, + 0xa1, 0x57, 0xed, 0x83, 0x03, 0x21, 0xc3, 0x5e, 0xcc, 0xbe, 0x1d, 0x5e, 0x91, 0x19, 0xc2, 0x54, + 0xdd, 0x55, 0x99, 0xc4, 0xdb, 0xae, 0x0b, 0xfa, 0x49, 0x02, 0x26, 0x56, 0xda, 0x8d, 0x83, 0x47, + 0xad, 0x6a, 0xbb, 0xd9, 0x54, 0xac, 0x13, 0xe2, 0x2a, 0x99, 0xeb, 0x20, 0xd5, 0x14, 0x98, 0xab, + 0xa4, 0xbe, 0x41, 0x7f, 0x86, 0xc9, 0x64, 0x16, 0xc8, 0x54, 0xe1, 0x29, 0xfd, 0xb4, 0x25, 0x3e, + 0x99, 0x66, 0xdd, 0xbf, 0x0d, 0x85, 0x40, 0x41, 0xba, 0x7c, 0x22, 0x63, 0xc3, 0xb1, 0x74, 0xcc, + 0x96, 0x03, 0x93, 0x52, 0x20, 0x9d, 0x66, 0x8d, 0xdc, 0x2e, 0xb3, 0xbb, 0xa8, 0x06, 0x39, 0x52, + 0xf0, 0x44, 0xa6, 0x93, 0x8d, 0xbb, 0x68, 0x7b, 0x3b, 0xa2, 0x71, 0xa1, 0x7a, 0x2f, 0x52, 0x2d, + 0x95, 0x28, 0x0f, 0xfd, 0x2b, 0x65, 0xb1, 0x4f, 0x99, 0x7d, 0x0f, 0xc4, 0xce, 0x02, 0x41, 0x8d, + 0xa6, 0x98, 0x46, 0x67, 0x82, 0x1a, 0x4d, 0x06, 0xb4, 0xb5, 0x9e, 0x4a, 0xa7, 0xc4, 0xd1, 0xe2, + 0xef, 0x92, 0x90, 0x77, 0x8d, 0x2d, 0x4e, 0x34, 0xb3, 0x02, 0xa3, 0xc4, 0x34, 0xdc, 0xe4, 0x8f, + 0xeb, 0x7d, 0x6c, 0x9c, 0xa7, 0x8f, 0x13, 0x93, 0x71, 0xf1, 0x30, 0x65, 0x8d, 0xc3, 0xed, 0xcc, + 0xfe, 0xd5, 0x04, 0xa4, 0x28, 0x80, 0xb8, 0x0d, 0x29, 0x3a, 0x75, 0x08, 0xc3, 0x4c, 0x1d, 0xb4, + 0xa8, 0x37, 0xd9, 0x25, 0x02, 0xf1, 0x27, 0x09, 0xe6, 0xf6, 0x95, 0x37, 0x6f, 0xdf, 0xa1, 0x2e, + 0x27, 0x27, 0xf1, 0x2b, 0xb4, 0x42, 0xb3, 0x92, 0x4c, 0xcb, 0xc1, 0x1a, 0x0f, 0xdc, 0x17, 0x06, + 0xf5, 0xaf, 0x3b, 0x4d, 0xb9, 0x7c, 0xe8, 0x22, 0x24, 0x89, 0x2f, 0x1b, 0x67, 0x19, 0x0b, 0xcf, + 0x4f, 0xe7, 0x93, 0xc4, 0x8b, 0x11, 0x1a, 0x5a, 0x82, 0x6c, 0xd8, 0x71, 0x08, 0x37, 0x33, 0xcc, + 0x3d, 0x06, 0x06, 0x3d, 0x34, 0xbc, 0x01, 0xc6, 0x40, 0x2b, 0xef, 0xe3, 0xef, 0x8d, 0xc2, 0xc4, + 0x5a, 0x33, 0xee, 0x89, 0x65, 0x39, 0xdc, 0xc3, 0x51, 0x68, 0x27, 0xf4, 0xd0, 0x88, 0x0e, 0x0e, + 0xcd, 0xe9, 0xc9, 0xb3, 0xcd, 0xe9, 0x6b, 0x24, 0x04, 0xe6, 0x07, 0x2c, 0x24, 0x7b, 0x00, 0x9b, + 0xf0, 0xf3, 0x69, 0x14, 0x23, 0x11, 0x1e, 0x7f, 0x43, 0x05, 0xcd, 0x3a, 0x79, 0x8f, 0x46, 0xda, + 0xcc, 0xca, 0xc6, 0x86, 0xb7, 0xb2, 0x71, 0x6c, 0x68, 0x74, 0x6a, 0x0b, 0xfb, 0xd5, 0xf1, 0x17, + 0xf7, 0xab, 0xb3, 0xcf, 0xb8, 0xb1, 0xbe, 0x03, 0x49, 0x4d, 0x77, 0x3b, 0x67, 0xf8, 0x09, 0x9b, + 0x30, 0x0d, 0xb0, 0xda, 0x54, 0xd0, 0x6a, 0x83, 0x0b, 0x1c, 0xb3, 0x8f, 0x00, 0x7c, 0x0d, 0xa1, + 0x05, 0x18, 0x33, 0x1b, 0x9a, 0xbb, 0xaf, 0x64, 0x62, 0x25, 0xf3, 0xfc, 0x74, 0x7e, 0xf4, 0x51, + 0x43, 0x5b, 0x5b, 0x95, 0x46, 0xcd, 0x86, 0xb6, 0xa6, 0xd1, 0x33, 0x2e, 0xf0, 0x91, 0xec, 0x25, + 0xa1, 0xe5, 0xa4, 0x71, 0x03, 0x1f, 0xad, 0x62, 0x5b, 0xed, 0x48, 0x8e, 0x21, 0x26, 0xf8, 0x23, + 0x01, 0xf2, 0x6e, 0x6f, 0xc4, 0xeb, 0x66, 0xd2, 0x7a, 0x93, 0x0f, 0xbb, 0xe4, 0xd9, 0x86, 0x9d, + 0xcb, 0xc7, 0x77, 0xd5, 0xfe, 0x40, 0xe0, 0x09, 0xc8, 0x55, 0x55, 0x71, 0x48, 0xb0, 0x11, 0xe3, + 0x50, 0x79, 0x05, 0x44, 0x4b, 0x31, 0x34, 0xb3, 0xa9, 0x3f, 0xc3, 0x6c, 0x45, 0xd4, 0xe6, 0x2f, + 0x37, 0x27, 0x3d, 0x3a, 0x5d, 0xf2, 0x73, 0x17, 0x74, 0xff, 0x24, 0xf0, 0x64, 0x65, 0xaf, 0x32, + 0x71, 0x2a, 0x6d, 0x03, 0xc6, 0x2c, 0x96, 0xf2, 0xc8, 0x86, 0xee, 0x6b, 0x11, 0x42, 0xa2, 0x9e, + 0xce, 0x32, 0x0a, 0xbd, 0xc1, 0x43, 0x45, 0xcc, 0x7e, 0x03, 0x46, 0x29, 0xf9, 0x05, 0x1c, 0x2c, + 0xd7, 0xfc, 0x1f, 0x12, 0x70, 0x95, 0x3e, 0xee, 0x09, 0xb6, 0xf4, 0xbd, 0x93, 0x6d, 0xcb, 0x74, + 0xb0, 0xea, 0x60, 0xcd, 0xdf, 0xc6, 0x11, 0xab, 0xd7, 0xca, 0xb4, 0xdc, 0x07, 0x9c, 0x29, 0xf5, + 0xcb, 0xe3, 0x42, 0x1b, 0x30, 0xc9, 0xce, 0xd1, 0x91, 0x95, 0x86, 0x7e, 0x88, 0x65, 0xc5, 0x39, + 0xcb, 0xdc, 0x34, 0xc1, 0x78, 0x97, 0x09, 0xeb, 0xb2, 0x83, 0x34, 0xc8, 0x70, 0x61, 0xba, 0xc6, + 0x0f, 0xcf, 0x79, 0xf0, 0xf9, 0xd6, 0xfc, 0xd2, 0x12, 0x95, 0xb7, 0xb6, 0x2a, 0xa5, 0x99, 0x64, + 0xef, 0x9d, 0xcd, 0xaf, 0x05, 0xb8, 0x36, 0x40, 0xd1, 0x71, 0x9a, 0xd9, 0x2c, 0xa4, 0x0f, 0xc9, + 0x83, 0x74, 0xae, 0xe9, 0xb4, 0xe4, 0x5d, 0xa3, 0x4d, 0x98, 0xd8, 0x53, 0xf4, 0x06, 0x89, 0xb8, + 0x98, 0x25, 0xf6, 0xce, 0x17, 0x8c, 0x4e, 0x63, 0xcd, 0x31, 0x76, 0x7a, 0x93, 0x6e, 0x74, 0x9c, + 0x5a, 0xd6, 0xb4, 0x6a, 0x95, 0x7b, 0xb0, 0xf8, 0xec, 0xc5, 0x85, 0x8e, 0x09, 0x1f, 0x3a, 0xa2, + 0xd7, 0x00, 0x69, 0xba, 0xcd, 0x4e, 0xeb, 0xb0, 0xf7, 0x15, 0xcd, 0x3c, 0xf2, 0xb3, 0x26, 0xa6, + 0xdc, 0x3b, 0x55, 0xf7, 0x06, 0xaa, 0x02, 0xc5, 0x2d, 0xb2, 0xed, 0x28, 0xde, 0x8b, 0x9f, 0x6b, + 0x43, 0xed, 0xba, 0x62, 0x80, 0xc6, 0xbb, 0x94, 0x32, 0x44, 0x0e, 0xfd, 0x4b, 0x22, 0x70, 0x9d, + 0x34, 0xdd, 0x91, 0x15, 0xdb, 0xdd, 0xa2, 0xc3, 0xce, 0x09, 0xc9, 0x33, 0xfa, 0xb2, 0x1d, 0xdc, + 0x79, 0xc3, 0x76, 0x10, 0xf8, 0x0a, 0x8a, 0x13, 0xe8, 0xfe, 0x13, 0x01, 0xf2, 0x12, 0xde, 0xb3, + 0xb0, 0x1d, 0x2b, 0xe0, 0xbf, 0x0f, 0x39, 0x8b, 0x49, 0x95, 0xf7, 0x2c, 0xb3, 0x79, 0x96, 0x31, + 0x96, 0xe5, 0x8c, 0xf7, 0x2d, 0xb3, 0x19, 0x3a, 0x3a, 0xe1, 0x09, 0x4c, 0x7a, 0x35, 0x8d, 0x53, + 0x05, 0x3f, 0xa5, 0x3b, 0x8d, 0x99, 0xe0, 0xb8, 0xd3, 0x17, 0xbe, 0x08, 0x3d, 0xd0, 0x37, 0x4d, + 0xc1, 0xea, 0xc6, 0xa9, 0x8c, 0x3f, 0x09, 0x90, 0xaf, 0xb6, 0x77, 0xd9, 0x61, 0x51, 0xf1, 0xe9, + 0xa1, 0x0c, 0x99, 0x06, 0xde, 0x73, 0xe4, 0x17, 0xca, 0x7a, 0x4f, 0x13, 0x56, 0x9a, 0xf9, 0xff, + 0x00, 0xc0, 0xa2, 0xfb, 0xda, 0xa8, 0x9c, 0xe4, 0x19, 0xe5, 0x64, 0x28, 0xaf, 0x1f, 0xe4, 0x14, + 0x7f, 0x9a, 0x80, 0x49, 0xaf, 0xb1, 0x71, 0x7a, 0xcf, 0xf7, 0x43, 0x5e, 0x23, 0x79, 0x16, 0xaf, + 0x31, 0xc5, 0xb3, 0x37, 0xa2, 0x3d, 0xc7, 0x22, 0x4c, 0xd3, 0x10, 0x44, 0x56, 0x5a, 0xad, 0x86, + 0xee, 0x42, 0x59, 0xea, 0x97, 0x52, 0xd2, 0x14, 0xbd, 0xb5, 0xcc, 0xee, 0x50, 0x10, 0x4b, 0xec, + 0x6f, 0xcf, 0xc2, 0xf8, 0x19, 0x96, 0x29, 0xaa, 0x3a, 0x4b, 0x76, 0x4a, 0x96, 0x31, 0x56, 0x09, + 0x1f, 0xb7, 0xbc, 0x8f, 0x60, 0x8a, 0x6a, 0x36, 0xee, 0xbd, 0xb5, 0xbc, 0x3b, 0x7e, 0x2b, 0x00, + 0x0a, 0xca, 0xff, 0xe2, 0x7a, 0x24, 0x11, 0x5f, 0x8f, 0xbc, 0x0a, 0x88, 0x65, 0x21, 0xda, 0x72, + 0x0b, 0x5b, 0xb2, 0x8d, 0x55, 0x93, 0x1f, 0x61, 0x24, 0x48, 0x22, 0xbf, 0xb3, 0x8d, 0xad, 0x2a, + 0xa5, 0x17, 0x3f, 0x9e, 0x85, 0x1c, 0x57, 0xc6, 0x8e, 0xa1, 0x9b, 0x06, 0xba, 0x0d, 0xc9, 0x3a, + 0x5f, 0xcf, 0xcf, 0x46, 0xae, 0xa8, 0xf9, 0x07, 0xaf, 0x55, 0x46, 0x24, 0x52, 0x96, 0xb0, 0xb4, + 0xda, 0x4e, 0x44, 0xfc, 0xe3, 0xa7, 0x4b, 0x07, 0x59, 0x5a, 0x6d, 0x07, 0x55, 0x61, 0x52, 0xf5, + 0x8f, 0x91, 0x92, 0x09, 0x7b, 0xb2, 0x27, 0xd2, 0x89, 0x3c, 0xbe, 0xab, 0x32, 0x22, 0xe5, 0xd5, + 0xd0, 0x0d, 0x54, 0x0a, 0x9e, 0x5b, 0x94, 0xea, 0xca, 0xcc, 0xf2, 0xf7, 0xe1, 0x86, 0xcf, 0x4c, + 0xaa, 0x8c, 0x04, 0x8e, 0x37, 0x42, 0xef, 0xc0, 0x98, 0x46, 0xcf, 0xc3, 0xe1, 0xa6, 0x19, 0x65, + 0x3d, 0xa1, 0x23, 0x88, 0x2a, 0x23, 0x12, 0xe7, 0x40, 0xeb, 0x90, 0x63, 0xff, 0x58, 0x1c, 0xc2, + 0xe1, 0xdf, 0xb5, 0xde, 0x12, 0x02, 0xde, 0xbd, 0x32, 0x22, 0x65, 0x35, 0x9f, 0x8a, 0xde, 0x80, + 0x94, 0xad, 0x2a, 0x2e, 0x00, 0x9c, 0xeb, 0x71, 0x18, 0x86, 0xcf, 0x4c, 0x4b, 0xa3, 0x7b, 0xec, + 0xec, 0x44, 0xe7, 0xd8, 0x5d, 0x91, 0x8b, 0xaa, 0x7e, 0x68, 0x8b, 0x35, 0xa9, 0x3e, 0xa6, 0x04, + 0xf4, 0x00, 0xb2, 0x0a, 0x09, 0xe8, 0x64, 0xba, 0xa5, 0x91, 0x2e, 0xc1, 0x45, 0xbf, 0xec, 0xee, + 0xda, 0x8e, 0x5a, 0xa1, 0xfb, 0xb8, 0x5d, 0xa2, 0x2f, 0xa8, 0x89, 0xad, 0x3a, 0x2e, 0x64, 0xfb, + 0x0b, 0x0a, 0x66, 0x62, 0x79, 0x82, 0x28, 0x91, 0x04, 0x76, 0xfb, 0xee, 0x76, 0x15, 0xda, 0xa8, + 0x5c, 0xcf, 0x17, 0xab, 0x11, 0xdb, 0x6d, 0x2a, 0x23, 0x52, 0x6e, 0x3f, 0x40, 0x46, 0x8b, 0x90, + 0xa8, 0xab, 0x85, 0x09, 0x2a, 0xe3, 0x72, 0xbf, 0xcd, 0x24, 0x95, 0x11, 0x29, 0x51, 0x57, 0x09, + 0x94, 0x67, 0xbb, 0x01, 0x8e, 0x8d, 0x42, 0xbe, 0xe7, 0x50, 0x0f, 0xef, 0xa9, 0xa8, 0x8c, 0x48, + 0x74, 0x03, 0x02, 0x79, 0xde, 0x36, 0xe4, 0x2d, 0x96, 0xca, 0xe6, 0x26, 0xa1, 0x8a, 0x3d, 0x5f, + 0x36, 0x47, 0xe5, 0xa1, 0x56, 0x68, 0x80, 0x1f, 0xa0, 0xa3, 0xef, 0xc0, 0x4c, 0x58, 0x22, 0xb7, + 0xb4, 0xa9, 0x9e, 0x2f, 0x4e, 0x7b, 0x66, 0x43, 0x56, 0x46, 0x24, 0x64, 0x75, 0xdd, 0x44, 0x6f, + 0xc1, 0x28, 0xeb, 0x35, 0x44, 0x45, 0x46, 0x65, 0x51, 0x74, 0x74, 0x18, 0x2b, 0x4f, 0x8c, 0xdf, + 0xe1, 0x39, 0x5c, 0x72, 0xc3, 0xac, 0x17, 0xa6, 0x7b, 0x1a, 0x7f, 0x77, 0x4e, 0x1a, 0x31, 0x7e, + 0xc7, 0xa7, 0x92, 0x7e, 0xb7, 0xd8, 0x1d, 0x9e, 0xf2, 0x33, 0xd3, 0xb3, 0xdf, 0x23, 0x52, 0xbb, + 0x2a, 0x34, 0xab, 0xde, 0x27, 0x93, 0xaa, 0x59, 0xec, 0xe4, 0x16, 0x99, 0x8e, 0xa9, 0x73, 0x3d, + 0xab, 0xd6, 0x7d, 0xc0, 0x4d, 0x85, 0x06, 0x3e, 0x1e, 0x15, 0x3d, 0x01, 0x91, 0x9f, 0xa9, 0xe0, + 0x2f, 0xff, 0x9f, 0xa7, 0xf2, 0x5e, 0x89, 0x74, 0x5d, 0x51, 0x39, 0x32, 0x95, 0x11, 0x69, 0x52, + 0x0d, 0xdf, 0x41, 0x1f, 0xc0, 0x14, 0x95, 0x27, 0xab, 0xfe, 0x61, 0x18, 0x85, 0x42, 0xd7, 0xa1, + 0x0a, 0xbd, 0xcf, 0xcd, 0x70, 0x25, 0x8b, 0x6a, 0xc7, 0x2d, 0x62, 0xc6, 0xba, 0xa1, 0x3b, 0xd4, + 0xcb, 0xce, 0xf6, 0x34, 0xe3, 0xf0, 0xb1, 0x7b, 0xc4, 0x8c, 0x75, 0x46, 0x21, 0x66, 0xec, 0xf0, + 0x7c, 0x30, 0xde, 0x1d, 0x97, 0x7b, 0x9a, 0x71, 0x54, 0xe2, 0x18, 0x31, 0x63, 0x27, 0x48, 0x27, + 0x66, 0xcc, 0x1c, 0x44, 0x87, 0xdc, 0x97, 0x7a, 0x9a, 0x71, 0xcf, 0x4d, 0xc5, 0xc4, 0x8c, 0x95, + 0xae, 0x9b, 0x68, 0x15, 0x80, 0xc5, 0x25, 0xba, 0xb1, 0x67, 0x16, 0xe6, 0x7a, 0x4e, 0x06, 0x9d, + 0x19, 0x61, 0x64, 0x32, 0x68, 0xb8, 0x34, 0xe2, 0xc8, 0x28, 0x1a, 0x92, 0xe9, 0xbb, 0xd0, 0xc2, + 0x7c, 0x4f, 0x47, 0xd6, 0xf5, 0x96, 0x92, 0x38, 0xb2, 0x23, 0x8f, 0x48, 0x66, 0x15, 0xb6, 0x30, + 0x5b, 0x58, 0xe8, 0xed, 0x96, 0x83, 0x6f, 0x69, 0xa8, 0x5b, 0xa6, 0x04, 0xb4, 0x0c, 0x19, 0x32, + 0x6d, 0x9f, 0x50, 0x37, 0x74, 0xa5, 0x67, 0x88, 0xd9, 0xb1, 0x6d, 0xa4, 0x32, 0x22, 0xa5, 0x9f, + 0x72, 0x12, 0x79, 0x3c, 0x5b, 0xa0, 0x2a, 0x14, 0x7b, 0x3e, 0x3e, 0xb4, 0xbc, 0x49, 0x1e, 0xcf, + 0x38, 0x90, 0x0a, 0xe7, 0x58, 0x5f, 0xf1, 0x3d, 0xbd, 0x16, 0xdf, 0x80, 0x5a, 0x78, 0x99, 0x8a, + 0xea, 0xb9, 0xdc, 0x13, 0xb9, 0xd5, 0xb8, 0x32, 0x22, 0x4d, 0x2b, 0xdd, 0x77, 0xc9, 0x80, 0xe7, + 0x53, 0x0f, 0x5b, 0x24, 0x2a, 0x5c, 0xed, 0x39, 0xe0, 0x23, 0x96, 0xd5, 0xc8, 0x80, 0x57, 0x02, + 0x64, 0x36, 0x01, 0x69, 0xb2, 0x6d, 0xb3, 0x37, 0xe7, 0xd7, 0xfa, 0x4c, 0x40, 0x1d, 0x30, 0x9f, + 0x4d, 0x40, 0x5a, 0x95, 0x71, 0x12, 0x41, 0x6a, 0x03, 0x2b, 0x16, 0x77, 0xb3, 0xd7, 0x7b, 0x0a, + 0xea, 0x3a, 0xca, 0x8e, 0x08, 0x52, 0x3d, 0x22, 0x09, 0x78, 0x2c, 0xf7, 0x30, 0x16, 0x1e, 0xf3, + 0xdd, 0xe8, 0x19, 0xf0, 0x44, 0x9e, 0x19, 0x43, 0x02, 0x1e, 0x2b, 0x74, 0x03, 0x7d, 0x0d, 0xc6, + 0x39, 0x26, 0x2b, 0xdc, 0xec, 0x13, 0x89, 0x06, 0xc1, 0x34, 0x19, 0xd7, 0x9c, 0x87, 0x79, 0x59, + 0x86, 0x05, 0x59, 0xf3, 0x5e, 0xe9, 0xe3, 0x65, 0xbb, 0xe0, 0x28, 0xf3, 0xb2, 0x3e, 0x99, 0x78, + 0x59, 0x66, 0xa7, 0x7c, 0xae, 0xbb, 0xd5, 0xd3, 0xcb, 0x76, 0x6f, 0x5d, 0x21, 0x5e, 0xf6, 0xa9, + 0x4f, 0x25, 0x2d, 0xb3, 0x19, 0x0e, 0x2a, 0x7c, 0xa5, 0x67, 0xcb, 0xc2, 0xb0, 0x90, 0xb4, 0x8c, + 0xf3, 0x90, 0x6e, 0x63, 0x89, 0xc8, 0x4c, 0xd3, 0xaf, 0xf6, 0xde, 0x3e, 0xdf, 0x89, 0x1e, 0x2a, + 0xee, 0xd1, 0xc8, 0x4c, 0xc3, 0x9e, 0xa3, 0xb2, 0xf8, 0x66, 0x61, 0xae, 0xa9, 0xd7, 0xfa, 0x3b, + 0xaa, 0xa8, 0x7d, 0xd0, 0x9e, 0xa3, 0x0a, 0xdd, 0xa4, 0x55, 0x65, 0x3b, 0xc0, 0xe8, 0xf8, 0x5e, + 0xec, 0xb3, 0xd3, 0xbf, 0x63, 0x37, 0x1e, 0xad, 0xaa, 0x47, 0xf4, 0x87, 0x50, 0x9b, 0x1d, 0x49, + 0x51, 0x58, 0xea, 0x3f, 0x84, 0xc2, 0x47, 0x63, 0x78, 0x43, 0x88, 0x93, 0xbd, 0x39, 0xd3, 0x8d, + 0x30, 0x5e, 0xef, 0x3f, 0x67, 0x76, 0x86, 0x16, 0x6c, 0xce, 0xe4, 0x31, 0xc5, 0x5f, 0x13, 0x60, + 0x81, 0xd5, 0x8d, 0x2e, 0xd9, 0x9d, 0xc8, 0xde, 0xf2, 0x67, 0x60, 0x9f, 0xc2, 0x6d, 0xfa, 0x80, + 0xb7, 0x7a, 0x55, 0x77, 0xc0, 0x72, 0x6e, 0x65, 0x44, 0x7a, 0x49, 0xe9, 0x57, 0x6e, 0x65, 0x9c, + 0xbf, 0xbb, 0xf4, 0x36, 0x61, 0x4e, 0x8a, 0xe2, 0x7a, 0x2a, 0x7d, 0x41, 0x2c, 0xac, 0xa7, 0xd2, + 0x17, 0xc5, 0xd9, 0xf5, 0x54, 0xfa, 0x92, 0x78, 0xb9, 0xf8, 0xdf, 0x2f, 0xc2, 0x84, 0x0b, 0xde, + 0x18, 0x22, 0xba, 0x13, 0x44, 0x44, 0x73, 0xbd, 0x10, 0x11, 0x87, 0x7b, 0x1c, 0x12, 0xdd, 0x09, + 0x42, 0xa2, 0xb9, 0x5e, 0x90, 0xc8, 0xe7, 0x21, 0x98, 0xa8, 0xd6, 0x0b, 0x13, 0xbd, 0x32, 0x04, + 0x26, 0xf2, 0x44, 0x75, 0x82, 0xa2, 0xd5, 0x6e, 0x50, 0x74, 0xb5, 0x3f, 0x28, 0xf2, 0x44, 0x05, + 0x50, 0xd1, 0xbd, 0x0e, 0x54, 0x74, 0xa5, 0x0f, 0x2a, 0xf2, 0xf8, 0x5d, 0x58, 0xb4, 0x11, 0x09, + 0x8b, 0xae, 0x0f, 0x82, 0x45, 0x9e, 0x9c, 0x10, 0x2e, 0x7a, 0x33, 0x84, 0x8b, 0xe6, 0x7b, 0xe2, + 0x22, 0x8f, 0x9b, 0x01, 0xa3, 0x77, 0x3b, 0x81, 0xd1, 0x95, 0x3e, 0xc0, 0xc8, 0x6f, 0x01, 0x47, + 0x46, 0x95, 0x28, 0x64, 0x74, 0x6d, 0x00, 0x32, 0xf2, 0xa4, 0x04, 0xa1, 0x51, 0x25, 0x0a, 0x1a, + 0x5d, 0x1b, 0x00, 0x8d, 0x3a, 0x24, 0x31, 0x6c, 0xb4, 0x15, 0x8d, 0x8d, 0x6e, 0x0c, 0xc4, 0x46, + 0x9e, 0xb4, 0x30, 0x38, 0x5a, 0x0a, 0x80, 0xa3, 0x97, 0x7a, 0x80, 0x23, 0x8f, 0x95, 0xa0, 0xa3, + 0xaf, 0x77, 0xa1, 0xa3, 0x62, 0x3f, 0x74, 0xe4, 0xf1, 0x7a, 0xf0, 0xe8, 0x71, 0x0f, 0x78, 0x74, + 0x73, 0x30, 0x3c, 0xf2, 0x84, 0x75, 0xe0, 0x23, 0xa5, 0x2f, 0x3e, 0x7a, 0x6d, 0x48, 0x7c, 0xe4, + 0x49, 0x8f, 0x02, 0x48, 0x6f, 0x87, 0x01, 0xd2, 0x42, 0x6f, 0x80, 0xe4, 0x89, 0xe1, 0x08, 0x69, + 0x23, 0x12, 0x21, 0x5d, 0x1f, 0x84, 0x90, 0xfc, 0x71, 0x10, 0x84, 0x48, 0x5b, 0xd1, 0x10, 0xe9, + 0xc6, 0x40, 0x88, 0xe4, 0x77, 0x7f, 0x08, 0x23, 0x6d, 0x44, 0x62, 0xa4, 0xeb, 0x83, 0x30, 0x92, + 0x5f, 0xb9, 0x20, 0x48, 0x7a, 0xbf, 0x27, 0x48, 0xba, 0x35, 0x0c, 0x48, 0xf2, 0x84, 0x76, 0xa1, + 0xa4, 0x0f, 0x7b, 0xa3, 0xa4, 0xaf, 0x9c, 0xe1, 0x74, 0xc1, 0x48, 0x98, 0xf4, 0xf5, 0x2e, 0x98, + 0x54, 0xec, 0x07, 0x93, 0x7c, 0x7b, 0x76, 0x71, 0x92, 0xd2, 0x17, 0xd5, 0xbc, 0x36, 0x24, 0xaa, + 0xf1, 0x8d, 0x2f, 0x02, 0xd6, 0x94, 0x23, 0x60, 0xcd, 0xd5, 0xfe, 0xb0, 0xc6, 0x77, 0xe7, 0x3e, + 0xae, 0xa9, 0x44, 0xe1, 0x9a, 0x6b, 0x03, 0x70, 0x8d, 0xef, 0x85, 0x02, 0xc0, 0xe6, 0x5e, 0x07, + 0xb0, 0xb9, 0x32, 0x30, 0x35, 0x27, 0x80, 0x6c, 0x56, 0xba, 0x91, 0xcd, 0xcb, 0x7d, 0x91, 0x8d, + 0x27, 0xc1, 0x87, 0x36, 0xf7, 0x3a, 0xa0, 0xcd, 0x95, 0x3e, 0xd0, 0xc6, 0xaf, 0x00, 0xc7, 0x36, + 0x5a, 0x7f, 0x6c, 0xb3, 0x38, 0x2c, 0xb6, 0xf1, 0x04, 0x47, 0x82, 0x9b, 0xad, 0x68, 0x70, 0x73, + 0x63, 0xc8, 0x17, 0xe5, 0x5d, 0xe8, 0xa6, 0x12, 0x85, 0x6e, 0xae, 0x0d, 0x40, 0x37, 0xc1, 0x39, + 0xc4, 0x83, 0x37, 0x95, 0x28, 0x78, 0x73, 0x6d, 0x00, 0xbc, 0xf1, 0x25, 0x05, 0xf0, 0x4d, 0xad, + 0x17, 0xbe, 0x79, 0x65, 0x08, 0x7c, 0xe3, 0x07, 0x2f, 0x1d, 0x00, 0xe7, 0xbd, 0x4e, 0x80, 0x53, + 0xec, 0x07, 0x70, 0xfc, 0x11, 0xe9, 0x22, 0x9c, 0xad, 0x68, 0x84, 0x73, 0x63, 0x20, 0xc2, 0x09, + 0x3a, 0xc9, 0x00, 0xc4, 0xd9, 0x88, 0x84, 0x38, 0xd7, 0x07, 0x41, 0x1c, 0xdf, 0x49, 0x06, 0x31, + 0xce, 0x7b, 0x9d, 0x18, 0xa7, 0xd8, 0x0f, 0xe3, 0xf8, 0x8d, 0x73, 0x41, 0x4e, 0x25, 0x0a, 0xe4, + 0x5c, 0x1b, 0x00, 0x72, 0xfc, 0xce, 0x0b, 0xa0, 0x1c, 0xa5, 0x2f, 0xca, 0x79, 0x6d, 0x48, 0x94, + 0xd3, 0xe1, 0xb8, 0xc2, 0x30, 0xa7, 0x12, 0x05, 0x73, 0xae, 0x0d, 0x80, 0x39, 0x81, 0xca, 0xfa, + 0x38, 0x67, 0x2b, 0x1a, 0xe7, 0xdc, 0x18, 0x88, 0x73, 0x3a, 0x46, 0x93, 0x0b, 0x74, 0x36, 0x22, + 0x81, 0xce, 0xf5, 0x41, 0x40, 0xa7, 0x63, 0xe2, 0xe3, 0xc1, 0xc1, 0x5f, 0x1f, 0x1e, 0xe9, 0xbc, + 0x7d, 0x76, 0xa4, 0xe3, 0x3d, 0x33, 0x16, 0xa8, 0xb3, 0x9e, 0x4a, 0x5f, 0x16, 0x5f, 0x2a, 0xfe, + 0x61, 0x14, 0xc6, 0x2a, 0x5e, 0x3a, 0x8b, 0x5f, 0x4b, 0xe1, 0x45, 0x4e, 0x32, 0x42, 0xab, 0x64, + 0xc4, 0x52, 0xbf, 0x37, 0xf8, 0xd0, 0xba, 0xee, 0x03, 0xd5, 0x38, 0xeb, 0x0b, 0x6c, 0x24, 0x46, + 0x6f, 0xc2, 0x44, 0xdb, 0xc6, 0x96, 0xdc, 0xb2, 0x74, 0xd3, 0xd2, 0x1d, 0xb6, 0x29, 0x43, 0x58, + 0x11, 0x3f, 0x3b, 0x9d, 0xcf, 0xed, 0xd8, 0xd8, 0xda, 0xe6, 0x74, 0x29, 0xd7, 0x0e, 0x5c, 0xb9, + 0xdf, 0x71, 0x1a, 0x1d, 0xfe, 0x3b, 0x4e, 0x8f, 0x41, 0xb4, 0xb0, 0xa2, 0x85, 0x22, 0x10, 0x76, + 0x52, 0x50, 0xb4, 0xcd, 0xd0, 0xfd, 0x4e, 0x6e, 0x49, 0x7a, 0x62, 0xd0, 0xa4, 0x15, 0x26, 0xa2, + 0xdb, 0x70, 0xae, 0xa9, 0x1c, 0xd3, 0xc4, 0x45, 0xd9, 0x0d, 0xea, 0x68, 0x32, 0x22, 0xfb, 0x6e, + 0x12, 0x6a, 0x2a, 0xc7, 0xf4, 0xa3, 0x50, 0xec, 0x16, 0xfd, 0xb4, 0xc3, 0x35, 0xc8, 0x6b, 0xba, + 0xed, 0xe8, 0x86, 0xea, 0xf0, 0x33, 0x62, 0xd9, 0xa1, 0xab, 0x13, 0x2e, 0x95, 0x1d, 0x04, 0x7b, + 0x0b, 0xa6, 0x78, 0x5e, 0xbb, 0xff, 0x99, 0x28, 0x0a, 0x5f, 0xd2, 0xa4, 0x16, 0xe4, 0x86, 0xf7, + 0x61, 0x28, 0x54, 0x82, 0xc9, 0xba, 0xe2, 0xe0, 0x23, 0xe5, 0x44, 0x76, 0x37, 0x45, 0x65, 0xe9, + 0x11, 0x8b, 0x97, 0x9e, 0x9f, 0xce, 0x4f, 0x3c, 0x60, 0xb7, 0xba, 0xf6, 0x46, 0x4d, 0xd4, 0x03, + 0x37, 0x34, 0x74, 0x03, 0x26, 0x15, 0xfb, 0xc4, 0x50, 0xa9, 0x7a, 0xb0, 0x61, 0xb7, 0x6d, 0x0a, + 0x29, 0xd2, 0x52, 0x9e, 0x92, 0x4b, 0x2e, 0x15, 0x5d, 0x81, 0x1c, 0x4f, 0xfa, 0x66, 0x9f, 0x9b, + 0x99, 0xa4, 0x4d, 0xe5, 0x5f, 0x3f, 0xa0, 0x5f, 0x9c, 0x41, 0xf7, 0x60, 0x96, 0x9f, 0x0a, 0x7f, + 0xa4, 0x58, 0x9a, 0x4c, 0xb5, 0xee, 0xdb, 0xa7, 0x48, 0xc5, 0x5e, 0x60, 0xa7, 0xc0, 0x93, 0x02, + 0x44, 0xd5, 0xc1, 0x23, 0x54, 0xc7, 0xc5, 0xf4, 0x7a, 0x2a, 0x9d, 0x13, 0x27, 0xd6, 0x53, 0xe9, + 0xbc, 0x38, 0x59, 0xfc, 0x3b, 0x02, 0xe4, 0x42, 0x1b, 0x49, 0xee, 0x75, 0xbc, 0xc7, 0xbd, 0x18, + 0x0d, 0x9d, 0x7a, 0xa5, 0x7e, 0xa5, 0x79, 0x57, 0xb9, 0x89, 0x6f, 0xf3, 0xbd, 0x43, 0x6f, 0xba, + 0x90, 0xe0, 0x26, 0x0f, 0xb8, 0x6c, 0xef, 0xa4, 0xfe, 0xde, 0x27, 0xf3, 0x23, 0xc5, 0x3f, 0x26, + 0x61, 0x22, 0xbc, 0x61, 0x64, 0xad, 0xa3, 0x5e, 0x51, 0xae, 0x2d, 0xc4, 0xb1, 0xd8, 0xe7, 0xdc, + 0xbc, 0x8c, 0x7f, 0xac, 0x3b, 0xab, 0xe6, 0x42, 0x9f, 0xb7, 0xd5, 0xc1, 0x7a, 0xfa, 0x8c, 0xb3, + 0x3f, 0x4f, 0x78, 0x2e, 0x62, 0x11, 0x46, 0xe9, 0x49, 0x2e, 0xbc, 0x6a, 0x51, 0x7b, 0x91, 0xcb, + 0xe4, 0xbe, 0xc4, 0x8a, 0x11, 0x97, 0x52, 0x7b, 0xa1, 0xc3, 0xd1, 0xfc, 0x73, 0x28, 0xce, 0xfe, + 0xa9, 0x35, 0x7e, 0x44, 0xde, 0xe8, 0xd9, 0x8e, 0xc8, 0x63, 0x2f, 0xa5, 0x1b, 0x0d, 0xe6, 0xae, + 0xd9, 0xa0, 0x1a, 0xeb, 0xda, 0xf0, 0x4b, 0x45, 0xf0, 0x2f, 0xe0, 0x2d, 0x4a, 0xfc, 0x0b, 0x78, + 0x81, 0x5c, 0xc4, 0xbc, 0x27, 0x82, 0x8e, 0x40, 0x96, 0xb1, 0xca, 0xbb, 0xfa, 0x3f, 0xba, 0xf9, + 0x04, 0x0f, 0x4d, 0xf3, 0xa0, 0xed, 0x65, 0x22, 0xce, 0x06, 0xcf, 0x96, 0x4b, 0x7f, 0x76, 0x3a, + 0x9f, 0x92, 0xbc, 0xc3, 0xe5, 0xa2, 0xbc, 0x4d, 0xe2, 0xf3, 0x79, 0x9b, 0x2b, 0x90, 0x6b, 0x59, + 0x78, 0x0f, 0x3b, 0xea, 0xbe, 0x6c, 0xb4, 0x9b, 0x7c, 0xbb, 0x41, 0xd6, 0xa5, 0x6d, 0xb5, 0x9b, + 0xe8, 0x15, 0x10, 0xbd, 0x22, 0x1c, 0xd7, 0xf1, 0xdd, 0xd6, 0x93, 0x2e, 0x9d, 0xa3, 0xc0, 0xe2, + 0xff, 0x14, 0x60, 0x3a, 0xd4, 0x26, 0x6e, 0xc4, 0xeb, 0x90, 0xd5, 0x3c, 0xff, 0x6e, 0x17, 0x84, + 0x33, 0x66, 0xe4, 0x05, 0x99, 0x91, 0x0c, 0xe7, 0xdd, 0xc7, 0xd2, 0xf3, 0xc6, 0x7d, 0xb1, 0x89, + 0x33, 0x8a, 0x3d, 0xe7, 0xcb, 0x59, 0x0d, 0x3c, 0xc0, 0xb3, 0xea, 0xe4, 0x50, 0x56, 0x5d, 0xfc, + 0x91, 0x00, 0x22, 0x7d, 0xc0, 0x7d, 0x8c, 0xb5, 0x58, 0xdc, 0x89, 0x9b, 0xef, 0x9a, 0x18, 0x7e, + 0x43, 0x41, 0xe8, 0x7b, 0x09, 0xc9, 0xf0, 0xf7, 0x12, 0x8a, 0x9f, 0x08, 0x90, 0xf7, 0x6a, 0xc8, + 0xbe, 0x14, 0xd6, 0xe7, 0x08, 0xc3, 0x17, 0xfb, 0x3e, 0x96, 0x7b, 0x2a, 0xc3, 0x50, 0x1f, 0x2f, + 0x0b, 0x9e, 0xca, 0xc0, 0xbe, 0xe5, 0xf4, 0x0f, 0x5c, 0xcb, 0x21, 0x55, 0x2c, 0xf9, 0x3b, 0xee, + 0x5f, 0x60, 0x6f, 0x85, 0x44, 0xbf, 0xad, 0x68, 0x36, 0x0e, 0xd9, 0x71, 0x18, 0x43, 0xf9, 0x19, + 0xc4, 0xb3, 0x68, 0x80, 0xaf, 0x00, 0x69, 0xb5, 0x2a, 0xfd, 0xea, 0x22, 0xfb, 0x6f, 0x17, 0xef, + 0x07, 0x14, 0x48, 0x3b, 0x9f, 0x68, 0x69, 0x28, 0xdf, 0xe7, 0x6a, 0x89, 0xd9, 0xca, 0x2f, 0x83, + 0x3d, 0x51, 0x3e, 0x24, 0x91, 0xff, 0x5d, 0x48, 0x1e, 0x2a, 0x8d, 0x7e, 0xd9, 0x43, 0xa1, 0x9e, + 0x93, 0x48, 0x69, 0x74, 0x3f, 0x74, 0x50, 0x41, 0xa2, 0x77, 0x94, 0xda, 0xad, 0xd2, 0xd0, 0x81, + 0x06, 0x6f, 0x85, 0x6d, 0xbd, 0xef, 0xe3, 0x83, 0x46, 0xff, 0x4e, 0xea, 0xd3, 0x4f, 0xe6, 0x85, + 0xe2, 0x5b, 0x70, 0xf1, 0x81, 0x69, 0xdb, 0x7a, 0x8b, 0x20, 0x13, 0x3a, 0x80, 0x88, 0xdb, 0xf5, + 0x3c, 0x59, 0xba, 0x45, 0x31, 0xaa, 0xc1, 0x46, 0x7c, 0x46, 0xf2, 0xae, 0x8b, 0xff, 0x5a, 0x80, + 0x0b, 0xdd, 0x9c, 0x4c, 0x21, 0x51, 0x7b, 0xb7, 0xc6, 0x55, 0xd3, 0x3f, 0xb8, 0x6b, 0xb0, 0x61, + 0xb9, 0xc5, 0x49, 0x04, 0xc2, 0x9f, 0x29, 0x37, 0x15, 0x3a, 0xd2, 0xf9, 0xfe, 0xd2, 0x3c, 0x27, + 0x6f, 0x32, 0xaa, 0x3f, 0xe8, 0x53, 0x43, 0x0d, 0xfa, 0x5b, 0x55, 0x98, 0x8e, 0xf0, 0xaf, 0x28, + 0x0f, 0x10, 0xf8, 0x7e, 0x04, 0xff, 0x6e, 0xe5, 0xf2, 0xaa, 0xbc, 0xb3, 0x55, 0x7a, 0xb4, 0xb9, + 0xb9, 0x56, 0xab, 0x95, 0x57, 0x45, 0x01, 0x89, 0x90, 0x0b, 0x7d, 0x7d, 0x22, 0xc1, 0xbe, 0x64, + 0x79, 0xeb, 0x2f, 0x01, 0xf8, 0x1f, 0xb5, 0x21, 0xb2, 0x36, 0xca, 0x1f, 0xc8, 0x4f, 0x96, 0x1f, + 0xee, 0x94, 0xab, 0xe2, 0x08, 0x42, 0x90, 0x5f, 0x59, 0xae, 0x95, 0x2a, 0xb2, 0x54, 0xae, 0x6e, + 0x3f, 0xda, 0xaa, 0x96, 0xdd, 0x2f, 0x60, 0xde, 0x5a, 0x85, 0x5c, 0xf0, 0x30, 0x0b, 0x34, 0x0d, + 0x93, 0xa5, 0x4a, 0xb9, 0xb4, 0x21, 0x3f, 0x59, 0x5b, 0x96, 0x1f, 0xef, 0x94, 0x77, 0xca, 0xe2, + 0x08, 0xad, 0x1a, 0x25, 0xde, 0xdf, 0x79, 0xf8, 0x50, 0x14, 0xd0, 0x24, 0x64, 0xd9, 0x35, 0xfd, + 0x52, 0x85, 0x98, 0xb8, 0xb5, 0x09, 0xd9, 0xc0, 0x51, 0x96, 0xe4, 0x71, 0xdb, 0x3b, 0xd5, 0x8a, + 0x5c, 0x5b, 0xdb, 0x2c, 0x57, 0x6b, 0xcb, 0x9b, 0xdb, 0x4c, 0x06, 0xa5, 0x2d, 0xaf, 0x3c, 0x92, + 0x6a, 0xa2, 0xe0, 0x5d, 0xd7, 0x1e, 0xed, 0x94, 0x2a, 0x6e, 0x33, 0x8a, 0xa9, 0x74, 0x52, 0x4c, + 0xde, 0xfa, 0x9e, 0x00, 0x17, 0x7a, 0x1c, 0xe9, 0x80, 0xb2, 0x30, 0xbe, 0x63, 0xd0, 0xb3, 0xfc, + 0xc4, 0x11, 0x34, 0x11, 0x38, 0xd5, 0x41, 0x14, 0x50, 0x9a, 0xed, 0xa8, 0x17, 0x13, 0x68, 0x0c, + 0x12, 0xd5, 0xbb, 0x62, 0x92, 0xd4, 0x34, 0x70, 0x28, 0x82, 0x98, 0x42, 0x19, 0xbe, 0xa7, 0x5b, + 0x1c, 0x45, 0x39, 0x7f, 0x53, 0xb5, 0x38, 0x46, 0x44, 0x79, 0xdb, 0x92, 0xc5, 0xf1, 0x5b, 0x57, + 0x20, 0xb0, 0xc5, 0x13, 0x01, 0x8c, 0x3d, 0x54, 0x1c, 0x6c, 0x3b, 0xe2, 0x08, 0x1a, 0x87, 0xe4, + 0x72, 0xa3, 0x21, 0x0a, 0x77, 0xfe, 0x46, 0x12, 0xd2, 0xee, 0xb7, 0x18, 0xd0, 0x43, 0x18, 0x65, + 0x0b, 0x59, 0xf3, 0xbd, 0x83, 0x2c, 0x6a, 0xdb, 0xb3, 0x0b, 0x83, 0xa2, 0xb0, 0xe2, 0x08, 0xfa, + 0xcb, 0x90, 0x0d, 0xcc, 0x85, 0xa8, 0x27, 0x18, 0x0f, 0xcd, 0xff, 0xb3, 0xd7, 0x07, 0x15, 0xf3, + 0xe4, 0xbf, 0x0f, 0x19, 0x6f, 0x6c, 0xa2, 0x97, 0xfb, 0x8d, 0x5c, 0x57, 0x76, 0xff, 0xe1, 0x4d, + 0x06, 0x5f, 0x71, 0xe4, 0x75, 0x01, 0x59, 0x80, 0xba, 0xc7, 0x26, 0x8a, 0x7a, 0xbf, 0xd9, 0x73, + 0xf0, 0xcf, 0xde, 0x1a, 0xaa, 0xb4, 0xf7, 0xcc, 0x95, 0x57, 0x3e, 0xfd, 0xdd, 0xdc, 0xc8, 0xa7, + 0xcf, 0xe7, 0x84, 0x5f, 0x3d, 0x9f, 0x13, 0x7e, 0xf3, 0x7c, 0x4e, 0xf8, 0xed, 0xf3, 0x39, 0xe1, + 0x6f, 0xff, 0x7e, 0x6e, 0xe4, 0x57, 0xbf, 0x9f, 0x1b, 0xf9, 0xcd, 0xef, 0xe7, 0x46, 0x3e, 0x1c, + 0xe7, 0x62, 0x76, 0xc7, 0xe8, 0x67, 0x84, 0xef, 0xfe, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x66, + 0x11, 0xa7, 0x5e, 0x69, 0x79, 0x00, 0x00, } diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto index f1d6744b9bb5..15efddbcea41 100644 --- a/pkg/roachpb/api.proto +++ b/pkg/roachpb/api.proto @@ -2035,6 +2035,24 @@ message BatchResponse { repeated ResponseUnion responses = 2 [(gogoproto.nullable) = false]; } +// RangeLookupRequest is a request to proxy a RangeLookup through a Tenant +// service. Its fields correspond to a subset of the args of kv.RangeLookup. +message RangeLookupRequest { + bytes key = 1 [(gogoproto.casttype) = "RKey"]; + ReadConsistencyType read_consistency = 2; + int64 prefetch_num = 3; + bool prefetch_reverse = 4; +} + +// RangeLookupResponse is returned from a RangeLookup request proxied through a +// Tenant service. Its fields correspond to the return values of kv.RangeLookup. +message RangeLookupResponse { + repeated RangeDescriptor descriptors = 1 [(gogoproto.nullable) = false]; + repeated RangeDescriptor prefetched_descriptors = 2 [(gogoproto.nullable) = false]; + // If non-nil, the other fields will be empty. + Error error = 3; +} + // RangeFeedRequest is a request that expresses the intention to establish a // RangeFeed stream over the provided span, starting at the specified timestamp. message RangeFeedRequest { @@ -2088,8 +2106,33 @@ message RangeFeedEvent { RangeFeedError error = 3; } +// GossipSubscriptionRequest initiates a game of telephone. It establishes an +// indefinite stream that proxies gossip information overheard by the recipient +// node back to the caller. Gossip information is filtered down to just those +// identified by a key matching any of the specified patterns. +// +// Upon establishment of the stream, all existing information that matches one +// or more of the patterns is returned. After this point, only new information +// matching the patterns is returned. +message GossipSubscriptionRequest { + repeated string patterns = 1; +} + +// GossipSubscriptionEvent is a single piece of proxied gossip information. +message GossipSubscriptionEvent { + string key = 1; + Value content = 2 [(gogoproto.nullable) = false]; + // Which pattern does this gossip information match? + string pattern_matched = 3; + // If non-nil, the other fields will be empty and this will be the final event + // send on the stream before it is terminated. + Error error = 4; +} + // Batch and RangeFeed service implemeted by nodes for KV API requests. service Internal { - rpc Batch (BatchRequest) returns (BatchResponse) {} - rpc RangeFeed (RangeFeedRequest) returns (stream RangeFeedEvent) {} + rpc Batch (BatchRequest) returns (BatchResponse) {} + rpc RangeLookup (RangeLookupRequest) returns (RangeLookupResponse) {} + rpc RangeFeed (RangeFeedRequest) returns (stream RangeFeedEvent) {} + rpc GossipSubscription (GossipSubscriptionRequest) returns (stream GossipSubscriptionEvent) {} } diff --git a/pkg/rpc/context.go b/pkg/rpc/context.go index ac300f364997..7c017d55759f 100644 --- a/pkg/rpc/context.go +++ b/pkg/rpc/context.go @@ -530,29 +530,59 @@ type internalClientAdapter struct { roachpb.InternalServer } +// Batch implements the roachpb.InternalClient interface. func (a internalClientAdapter) Batch( ctx context.Context, ba *roachpb.BatchRequest, _ ...grpc.CallOption, ) (*roachpb.BatchResponse, error) { return a.InternalServer.Batch(ctx, ba) } -type rangeFeedClientAdapter struct { - ctx context.Context - eventC chan *roachpb.RangeFeedEvent - errC chan error +// RangeLookup implements the roachpb.InternalClient interface. +func (a internalClientAdapter) RangeLookup( + ctx context.Context, rl *roachpb.RangeLookupRequest, _ ...grpc.CallOption, +) (*roachpb.RangeLookupResponse, error) { + return a.InternalServer.RangeLookup(ctx, rl) } -// roachpb.Internal_RangeFeedServer methods. -func (a rangeFeedClientAdapter) Recv() (*roachpb.RangeFeedEvent, error) { - // Prioritize eventC. Both channels are buffered and the only guarantee we +type respStreamClientAdapter struct { + ctx context.Context + respC chan interface{} + errC chan error +} + +func makeRespStreamClientAdapter(ctx context.Context) respStreamClientAdapter { + return respStreamClientAdapter{ + ctx: ctx, + respC: make(chan interface{}, 128), + errC: make(chan error, 1), + } +} + +// grpc.ClientStream methods. +func (respStreamClientAdapter) Header() (metadata.MD, error) { panic("unimplemented") } +func (respStreamClientAdapter) Trailer() metadata.MD { panic("unimplemented") } +func (respStreamClientAdapter) CloseSend() error { panic("unimplemented") } + +// grpc.ServerStream methods. +func (respStreamClientAdapter) SetHeader(metadata.MD) error { panic("unimplemented") } +func (respStreamClientAdapter) SendHeader(metadata.MD) error { panic("unimplemented") } +func (respStreamClientAdapter) SetTrailer(metadata.MD) { panic("unimplemented") } + +// grpc.Stream methods. +func (a respStreamClientAdapter) Context() context.Context { return a.ctx } +func (respStreamClientAdapter) SendMsg(m interface{}) error { panic("unimplemented") } +func (respStreamClientAdapter) RecvMsg(m interface{}) error { panic("unimplemented") } + +func (a respStreamClientAdapter) recvInternal() (interface{}, error) { + // Prioritize respC. Both channels are buffered and the only guarantee we // have is that once an error is sent on errC no other events will be sent - // on eventC again. + // on respC again. select { - case e := <-a.eventC: + case e := <-a.respC: return e, nil case err := <-a.errC: select { - case e := <-a.eventC: + case e := <-a.respC: a.errC <- err return e, nil default: @@ -561,42 +591,43 @@ func (a rangeFeedClientAdapter) Recv() (*roachpb.RangeFeedEvent, error) { } } -// roachpb.Internal_RangeFeedServer methods. -func (a rangeFeedClientAdapter) Send(e *roachpb.RangeFeedEvent) error { +func (a respStreamClientAdapter) sendInternal(e interface{}) error { select { - case a.eventC <- e: + case a.respC <- e: return nil case <-a.ctx.Done(): return a.ctx.Err() } } -// grpc.ClientStream methods. -func (rangeFeedClientAdapter) Header() (metadata.MD, error) { panic("unimplemented") } -func (rangeFeedClientAdapter) Trailer() metadata.MD { panic("unimplemented") } -func (rangeFeedClientAdapter) CloseSend() error { panic("unimplemented") } +type rangeFeedClientAdapter struct { + respStreamClientAdapter +} -// grpc.ServerStream methods. -func (rangeFeedClientAdapter) SetHeader(metadata.MD) error { panic("unimplemented") } -func (rangeFeedClientAdapter) SendHeader(metadata.MD) error { panic("unimplemented") } -func (rangeFeedClientAdapter) SetTrailer(metadata.MD) { panic("unimplemented") } +// roachpb.Internal_RangeFeedServer methods. +func (a rangeFeedClientAdapter) Recv() (*roachpb.RangeFeedEvent, error) { + e, err := a.recvInternal() + if err != nil { + return nil, err + } + return e.(*roachpb.RangeFeedEvent), nil +} -// grpc.Stream methods. -func (a rangeFeedClientAdapter) Context() context.Context { return a.ctx } -func (rangeFeedClientAdapter) SendMsg(m interface{}) error { panic("unimplemented") } -func (rangeFeedClientAdapter) RecvMsg(m interface{}) error { panic("unimplemented") } +// roachpb.Internal_RangeFeedServer methods. +func (a rangeFeedClientAdapter) Send(e *roachpb.RangeFeedEvent) error { + return a.sendInternal(e) +} var _ roachpb.Internal_RangeFeedClient = rangeFeedClientAdapter{} var _ roachpb.Internal_RangeFeedServer = rangeFeedClientAdapter{} +// RangeFeed implements the roachpb.InternalClient interface. func (a internalClientAdapter) RangeFeed( ctx context.Context, args *roachpb.RangeFeedRequest, _ ...grpc.CallOption, ) (roachpb.Internal_RangeFeedClient, error) { ctx, cancel := context.WithCancel(ctx) rfAdapter := rangeFeedClientAdapter{ - ctx: ctx, - eventC: make(chan *roachpb.RangeFeedEvent, 128), - errC: make(chan error, 1), + respStreamClientAdapter: makeRespStreamClientAdapter(ctx), } go func() { @@ -611,6 +642,48 @@ func (a internalClientAdapter) RangeFeed( return rfAdapter, nil } +type gossipSubscriptionClientAdapter struct { + respStreamClientAdapter +} + +// roachpb.Internal_GossipSubscriptionServer methods. +func (a gossipSubscriptionClientAdapter) Recv() (*roachpb.GossipSubscriptionEvent, error) { + e, err := a.recvInternal() + if err != nil { + return nil, err + } + return e.(*roachpb.GossipSubscriptionEvent), nil +} + +// roachpb.Internal_GossipSubscriptionServer methods. +func (a gossipSubscriptionClientAdapter) Send(e *roachpb.GossipSubscriptionEvent) error { + return a.sendInternal(e) +} + +var _ roachpb.Internal_GossipSubscriptionClient = gossipSubscriptionClientAdapter{} +var _ roachpb.Internal_GossipSubscriptionServer = gossipSubscriptionClientAdapter{} + +// GossipSubscription implements the roachpb.InternalClient interface. +func (a internalClientAdapter) GossipSubscription( + ctx context.Context, args *roachpb.GossipSubscriptionRequest, _ ...grpc.CallOption, +) (roachpb.Internal_GossipSubscriptionClient, error) { + ctx, cancel := context.WithCancel(ctx) + gsAdapter := gossipSubscriptionClientAdapter{ + respStreamClientAdapter: makeRespStreamClientAdapter(ctx), + } + + go func() { + defer cancel() + err := a.InternalServer.GossipSubscription(args, gsAdapter) + if err == nil { + err = io.EOF + } + gsAdapter.errC <- err + }() + + return gsAdapter, nil +} + var _ roachpb.InternalClient = internalClientAdapter{} // IsLocal returns true if the given InternalClient is local. diff --git a/pkg/rpc/context_test.go b/pkg/rpc/context_test.go index 6fd9f2c00e73..7d79922e3aeb 100644 --- a/pkg/rpc/context_test.go +++ b/pkg/rpc/context_test.go @@ -168,8 +168,20 @@ func (*internalServer) Batch( return nil, nil } +func (*internalServer) RangeLookup( + context.Context, *roachpb.RangeLookupRequest, +) (*roachpb.RangeLookupResponse, error) { + panic("unimplemented") +} + func (*internalServer) RangeFeed( - _ *roachpb.RangeFeedRequest, _ roachpb.Internal_RangeFeedServer, + *roachpb.RangeFeedRequest, roachpb.Internal_RangeFeedServer, +) error { + panic("unimplemented") +} + +func (*internalServer) GossipSubscription( + *roachpb.GossipSubscriptionRequest, roachpb.Internal_GossipSubscriptionServer, ) error { panic("unimplemented") } diff --git a/pkg/server/node.go b/pkg/server/node.go index bbb833bbd48e..2817f3e03866 100644 --- a/pkg/server/node.go +++ b/pkg/server/node.go @@ -35,7 +35,6 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/sqlbase" "github.com/cockroachdb/cockroach/pkg/storage" "github.com/cockroachdb/cockroach/pkg/util" - "github.com/cockroachdb/cockroach/pkg/util/growstack" "github.com/cockroachdb/cockroach/pkg/util/grpcutil" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/log" @@ -947,12 +946,41 @@ func (n *Node) setupSpanForIncomingRPC( return ctx, finishSpan } +// RangeLookup implements the roachpb.InternalServer interface. +func (n *Node) RangeLookup( + ctx context.Context, req *roachpb.RangeLookupRequest, +) (*roachpb.RangeLookupResponse, error) { + ctx = n.storeCfg.AmbientCtx.AnnotateCtx(ctx) + + // Proxy the RangeLookup through the local DB. Note that this does not use + // the local RangeDescriptorCache itself (for the direct range descriptor). + // To be able to do so, we'd have to let tenant's evict descriptors from our + // cache in order to avoid serving the same stale descriptor over and over + // again. Because of that, using our own cache doesn't seem worth it, at + // least for now. + sender := n.storeCfg.DB.NonTransactionalSender() + rs, preRs, err := kv.RangeLookup( + ctx, + sender, + req.Key.AsRawKey(), + req.ReadConsistency, + req.PrefetchNum, + req.PrefetchReverse, + ) + resp := new(roachpb.RangeLookupResponse) + if err != nil { + resp.Error = roachpb.NewError(err) + } else { + resp.Descriptors = rs + resp.PrefetchedDescriptors = preRs + } + return resp, nil +} + // RangeFeed implements the roachpb.InternalServer interface. func (n *Node) RangeFeed( args *roachpb.RangeFeedRequest, stream roachpb.Internal_RangeFeedServer, ) error { - growstack.Grow() - pErr := n.stores.RangeFeed(args, stream) if pErr != nil { var event roachpb.RangeFeedEvent @@ -963,3 +991,78 @@ func (n *Node) RangeFeed( } return nil } + +// GossipSubscription implements the roachpb.InternalServer interface. +func (n *Node) GossipSubscription( + args *roachpb.GossipSubscriptionRequest, stream roachpb.Internal_GossipSubscriptionServer, +) error { + ctx := n.storeCfg.AmbientCtx.AnnotateCtx(stream.Context()) + ctxDone := ctx.Done() + + // Register a callback for each of the requested patterns. We don't want to + // block the gossip callback goroutine on a slow consumer, so we instead + // handle all communication asynchronously. We could pick a channel size and + // say that if the channel ever blocks, terminate the subscription. Doing so + // feels fragile, though, especially during the initial information dump. + // Instead, we say that if the channel ever blocks for more than some + // duration, terminate the subscription. + entC := make(chan *roachpb.GossipSubscriptionEvent, 256) + entCClosed := false + const maxBlockDur = 1 * time.Millisecond + for _, pattern := range args.Patterns { + pattern := pattern + // TODO(nvanbenschoten): add some form of access control here. Tenants + // should only be able to subscribe to certain patterns, such as: + // - "node:.*" + // - "system-db:zones/1/tenants" + // + // Note that the SystemConfig pattern here doesn't refer to a real key. + // Instead, it's keying into the single SystemConfig gossip key. That's + // necessary to avoid leaking privileged information to callers, but it + // means that we have a little more work to do in order to destructure + // and filter system config updates. Luckily, SystemConfigDeltaFilter + // supports a "keyPrefix" that should help here. We'll also want to use + // RegisterSystemConfigChannel for any SystemConfig patterns. + + // NB: all callbacks are run on a single goroutine. + callback := func(key string, content roachpb.Value) { + if entCClosed { + return + } + event := &roachpb.GossipSubscriptionEvent{ + Key: key, Content: content, PatternMatched: pattern, + } + select { + case entC <- event: + default: + select { + case entC <- event: + case <-time.After(maxBlockDur): + // entC blocking for too long. The consumer must not be + // keeping up. Terminate the subscription. + close(entC) + entCClosed = true + } + } + } + unregister := n.storeCfg.Gossip.RegisterCallback(pattern, callback) + defer unregister() + } + + for { + select { + case e, ok := <-entC: + if !ok { + // The consumer was not keeping up with gossip updates, so its + // subscription was terminated to avoid blocking gossip. + err := roachpb.NewErrorf("subscription terminated due to slow consumption") + e = &roachpb.GossipSubscriptionEvent{Error: err} + } + if err := stream.Send(e); err != nil { + return err + } + case <-ctxDone: + return ctx.Err() + } + } +} diff --git a/pkg/server/server_sql.go b/pkg/server/server_sql.go index 7cf30564a708..df7849e2370c 100644 --- a/pkg/server/server_sql.go +++ b/pkg/server/server_sql.go @@ -27,6 +27,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/kv/bulk" "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord" + "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvtenant" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/protectedts" "github.com/cockroachdb/cockroach/pkg/roachpb" @@ -70,6 +71,7 @@ type sqlServer struct { internalExecutor *sql.InternalExecutor leaseMgr *lease.Manager blobService *blobs.Service + tenantProxy *kvtenant.Proxy // sessionRegistry can be queried for info on running SQL sessions. It is // shared between the sql.Server and the statusServer. sessionRegistry *sql.SessionRegistry @@ -94,11 +96,13 @@ type sqlServerOptionalArgs struct { // DistSQL uses rpcContext to set up flows. Less centrally, the executor // also uses rpcContext in a number of places to learn whether the server // is running insecure, and to read the cluster name. + // TODO(nvanbenschoten): move off this struct. rpcContext *rpc.Context // SQL mostly uses the DistSender "wrapped" under a *kv.DB, but SQL also // uses range descriptors and leaseholders, which DistSender maintains, // for debugging and DistSQL planning purposes. + // TODO(nvanbenschoten): move off this struct. distSender *kvcoord.DistSender // statusServer gives access to the Status service. statusServer serverpb.OptionalStatusServer @@ -109,6 +113,7 @@ type sqlServerOptionalArgs struct { // diagnostics registry, and the lease manager. gossip gossip.DeprecatedGossip // Used by DistSQLConfig and DistSQLPlanner. + // TODO(nvanbenschoten): move off this struct. nodeDialer *nodedialer.Dialer // To register blob and DistSQL servers. grpcServer *grpc.Server @@ -122,6 +127,11 @@ type sqlServerOptionalArgs struct { // Used by backup/restore. externalStorage cloud.ExternalStorageFactory externalStorageFromURI cloud.ExternalStorageFromURIFactory + + // TODO(nvanbenschoten): Move to a second "optional" args struct. One for + // dependencies that are only available if the SQL server runs NOT as part + // of a KV node. + tenantProxy *kvtenant.Proxy } type sqlServerArgs struct { @@ -557,6 +567,7 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*sqlServer, error) { internalExecutor: cfg.circularInternalExecutor, leaseMgr: leaseMgr, blobService: blobService, + tenantProxy: cfg.tenantProxy, sessionRegistry: cfg.sessionRegistry, jobRegistry: jobRegistry, statsRefresher: statsRefresher, @@ -577,6 +588,14 @@ func (s *sqlServer) start( socketFile string, orphanedLeasesTimeThresholdNanos int64, ) error { + // If necessary, start the tenant proxy first, to ensure all other + // components can properly route to KV nodes. + if s.tenantProxy != nil { + if err := s.tenantProxy.Start(ctx); err != nil { + return err + } + } + s.temporaryObjectCleaner.Start(ctx, stopper) s.distSQLServer.Start() s.pgServer.Start(ctx, stopper) diff --git a/pkg/server/testserver.go b/pkg/server/testserver.go index c30819718f2b..12cab0f7bc0f 100644 --- a/pkg/server/testserver.go +++ b/pkg/server/testserver.go @@ -32,6 +32,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/kv" "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord" + "github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvtenant" "github.com/cockroachdb/cockroach/pkg/kv/kvserver" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/protectedts" "github.com/cockroachdb/cockroach/pkg/kv/kvserver/protectedts/ptpb" @@ -449,6 +450,10 @@ func makeSQLServerArgs( clock := hlc.NewClock(hlc.UnixNano, time.Duration(baseCfg.MaxOffset)) + // TODO(tbg): expose this registry via prometheus. See: + // https://github.com/cockroachdb/cockroach/issues/47905 + registry := metric.NewRegistry() + var rpcTestingKnobs rpc.ContextTestingKnobs if p, ok := baseCfg.TestingKnobs.Server.(*TestingKnobs); ok { rpcTestingKnobs = p.ContextTestingKnobs @@ -462,18 +467,14 @@ func makeSQLServerArgs( Knobs: rpcTestingKnobs, }) - // TODO(tbg): expose this registry via prometheus. See: - // https://github.com/cockroachdb/cockroach/issues/47905 - registry := metric.NewRegistry() - var dsKnobs kvcoord.ClientTestingKnobs if dsKnobsP, ok := baseCfg.TestingKnobs.DistSQL.(*kvcoord.ClientTestingKnobs); ok { dsKnobs = *dsKnobsP } rpcRetryOptions := base.DefaultRetryOptions() - // TODO(nvb): this use of Gossip needs to go. Tracked in: - // https://github.com/cockroachdb/cockroach/issues/47909 + // TODO(ajwerner): this use of Gossip needs to go. Tracked in: + // https://github.com/cockroachdb/cockroach/issues/47150 var g *gossip.Gossip { var nodeID base.NodeIDContainer @@ -493,21 +494,25 @@ func makeSQLServerArgs( ) } - nodeDialer := nodedialer.New( + tenantProxy := kvtenant.NewProxy( + baseCfg.AmbientCtx, rpcContext, - gossip.AddressResolver(g), // TODO(nvb): break gossip dep + rpcRetryOptions, + sqlCfg.TenantKVAddrs, ) + resolver := kvcoord.AddressResolver(tenantProxy, baseCfg.Locality) + nodeDialer := nodedialer.New(rpcContext, resolver) + dsCfg := kvcoord.DistSenderConfig{ - AmbientCtx: baseCfg.AmbientCtx, - Settings: st, - Clock: clock, - NodeDescs: g, - RPCRetryOptions: &rpcRetryOptions, - RPCContext: rpcContext, - NodeDialer: nodeDialer, - RangeDescriptorDB: nil, // use DistSender itself - FirstRangeProvider: g, - TestingKnobs: dsKnobs, + AmbientCtx: baseCfg.AmbientCtx, + Settings: st, + Clock: clock, + NodeDescs: tenantProxy, + RPCRetryOptions: &rpcRetryOptions, + RPCContext: rpcContext, + NodeDialer: nodeDialer, + RangeDescriptorDB: tenantProxy, + TestingKnobs: dsKnobs, } ds := kvcoord.NewDistSender(dsCfg) @@ -586,6 +591,7 @@ func makeSQLServerArgs( uri, user string) (cloud.ExternalStorage, error) { return nil, errors.New("external uri storage is not available to secondary tenants") }, + tenantProxy: tenantProxy, }, SQLConfig: &sqlCfg, BaseConfig: &baseCfg, @@ -675,6 +681,8 @@ func StartTenant( ) orphanedLeasesTimeThresholdNanos := args.clock.Now().WallTime + // TODO(ajwerner): this use of Gossip needs to go. Tracked in: + // https://github.com/cockroachdb/cockroach/issues/47150 { rs := make([]resolver.Resolver, len(sqlCfg.TenantKVAddrs)) for i := range rs {