From 30e5bf8b379b11b10b514d7cd77d0470307d853c Mon Sep 17 00:00:00 2001 From: Tobias Schottdorf Date: Fri, 25 Oct 2019 11:33:20 +0200 Subject: [PATCH 1/3] storage: compute minority in failed consistency check Previously, a consistency failure was always framed as a deviation from the leaseholder. However, in practice a mismatch is always symmetric: the leaseholder could be right and the follower wrong; the follower might be right; and in fact the (usually 2+) followers may agree that the leaseholder is wrong. We've historically found that the majority was usually right, that is, with very few exceptions (I remember a single one), if there is one outlier replica, that replica is usually the problematic one, or more generally, the SHA with the lowest multiplicity is usually the one worth suspecting (we call this a "minority" in this context). The consistency checker currently fatals the leaseholder indiscriminately. This is an especially poor choice that was made out of convenience. Killing the leaseholder, which may very well have the correct data, forces the lease to move to a follower, often resulting in the corrupt node taking over the lease and spreading the corruption further. In a follow-up change, we'll want to kill the replicas representing the SHA with the lowest multiplicity instead of defaulting to the leaseholder. Release note (general change): Improve the consistency checker's log output. --- pkg/storage/consistency_queue_test.go | 5 +- pkg/storage/replica_consistency.go | 90 ++++++++++++++++++--------- 2 files changed, 62 insertions(+), 33 deletions(-) diff --git a/pkg/storage/consistency_queue_test.go b/pkg/storage/consistency_queue_test.go index 14395e3fcaa4..c8f01175c4ff 100644 --- a/pkg/storage/consistency_queue_test.go +++ b/pkg/storage/consistency_queue_test.go @@ -214,6 +214,7 @@ func TestCheckConsistencyInconsistent(t *testing.T) { } if len(diff) != 1 { t.Errorf("diff length = %d, diff = %v", len(diff), diff) + return } d := diff[0] if d.LeaseHolder || !bytes.Equal(diffKey, d.Key) || diffTimestamp != d.Timestamp { @@ -348,8 +349,8 @@ func TestCheckConsistencyInconsistent(t *testing.T) { assert.Len(t, resp.Result, 1) assert.Equal(t, roachpb.CheckConsistencyResponse_RANGE_INCONSISTENT, resp.Result[0].Status) - assert.Contains(t, resp.Result[0].Detail, `is inconsistent`) - assert.Contains(t, resp.Result[0].Detail, `persisted stats`) + assert.Contains(t, resp.Result[0].Detail, `[minority]`) + assert.Contains(t, resp.Result[0].Detail, `stats`) } // TestConsistencyQueueRecomputeStats is an end-to-end test of the mechanism CockroachDB diff --git a/pkg/storage/replica_consistency.go b/pkg/storage/replica_consistency.go index 021f2ec837bf..fbb451031aca 100644 --- a/pkg/storage/replica_consistency.go +++ b/pkg/storage/replica_consistency.go @@ -94,46 +94,74 @@ func (r *Replica) CheckConsistency( return roachpb.CheckConsistencyResponse{}, roachpb.NewError(err) } - var inconsistencyCount int - var missingCount int - res := roachpb.CheckConsistencyResponse_Result{} res.RangeID = r.RangeID + + shaToIdxs := map[string][]int{} + var missing []ConsistencyCheckResult for i, result := range results { - expResponse := results[0].Response if result.Err != nil { - res.Detail += fmt.Sprintf("%s: %v\n", result.Replica, result.Err) - missingCount++ + missing = append(missing, result) continue } - if bytes.Equal(expResponse.Checksum, result.Response.Checksum) { - // Replica is consistent (or rather, agrees with the local result). - if i == 0 { - res.Detail += fmt.Sprintf("stats: %+v\n", expResponse.Persisted) + s := string(result.Response.Checksum) + shaToIdxs[s] = append(shaToIdxs[s], i) + } + + // When replicas diverge, anecdotally often the minority (usually of size + // one) is in the wrong. If there's more than one smallest minority (for + // example, if three replicas all return different hashes) we pick any of + // them. + var minoritySHA string + if len(shaToIdxs) > 1 { + for sha, idxs := range shaToIdxs { + if minoritySHA == "" || len(shaToIdxs[minoritySHA]) > len(idxs) { + minoritySHA = sha } - continue } - inconsistencyCount++ + } + + // There is an inconsistency if and only if there is a minority SHA. + + if minoritySHA != "" { var buf bytes.Buffer - _, _ = fmt.Fprintf(&buf, "replica %s is inconsistent: expected checksum %x, got %x\n"+ - "persisted stats: exp %+v, got %+v\n"+ - "stats delta: exp %+v, got %+v\n", - result.Replica, - expResponse.Checksum, result.Response.Checksum, - expResponse.Persisted, result.Response.Persisted, - expResponse.Delta, result.Response.Delta, - ) - if expResponse.Snapshot != nil && result.Response.Snapshot != nil { - diff := diffRange(expResponse.Snapshot, result.Response.Snapshot) - if report := r.store.cfg.TestingKnobs.ConsistencyTestingKnobs.BadChecksumReportDiff; report != nil { - report(*r.store.Ident, diff) + for sha, idxs := range shaToIdxs { + minority := "" + if sha == minoritySHA { + minority = " [minority]" + } + for _, idx := range idxs { + _, _ = fmt.Fprintf(&buf, "%s: checksum %x%s\n"+ + "- stats: %+v\n"+ + "- recomputed delta: %+v\n", + &results[idx].Replica, + sha, + minority, + &results[idx].Response.Persisted, + &results[idx].Response.Delta, + ) + } + minoritySnap := results[shaToIdxs[minoritySHA][0]].Response.Snapshot + curSnap := results[shaToIdxs[sha][0]].Response.Snapshot + if sha != minoritySHA && minoritySnap != nil && curSnap != nil { + diff := diffRange(curSnap, minoritySnap) + if report := r.store.cfg.TestingKnobs.ConsistencyTestingKnobs.BadChecksumReportDiff; report != nil { + report(*r.store.Ident, diff) + } + _, _ = fmt.Fprintf(&buf, "====== diff(%x, [minority]) ======\n", sha) + _, _ = diff.WriteTo(&buf) } - _, _ = diff.WriteTo(&buf) } + if isQueue { log.Error(ctx, buf.String()) } res.Detail += buf.String() + } else { + res.Detail += fmt.Sprintf("stats: %+v\n", results[0].Response.Persisted) + } + for _, result := range missing { + res.Detail += fmt.Sprintf("%s: error: %v\n", result.Replica, result.Err) } delta := enginepb.MVCCStats(results[0].Response.Delta) @@ -141,7 +169,7 @@ func (r *Replica) CheckConsistency( res.StartKey = []byte(startKey) res.Status = roachpb.CheckConsistencyResponse_RANGE_CONSISTENT - if inconsistencyCount != 0 { + if minoritySHA != "" { res.Status = roachpb.CheckConsistencyResponse_RANGE_INCONSISTENT } else if args.Mode != roachpb.ChecksumMode_CHECK_STATS && delta != (enginepb.MVCCStats{}) { if delta.ContainsEstimates { @@ -154,7 +182,8 @@ func (r *Replica) CheckConsistency( res.Status = roachpb.CheckConsistencyResponse_RANGE_CONSISTENT_STATS_INCORRECT } res.Detail += fmt.Sprintf("stats delta: %+v\n", enginepb.MVCCStats(results[0].Response.Delta)) - } else if missingCount > 0 { + } else if len(missing) > 0 { + // No inconsistency was detected, but we didn't manage to inspect all replicas. res.Status = roachpb.CheckConsistencyResponse_RANGE_INDETERMINATE } var resp roachpb.CheckConsistencyResponse @@ -167,7 +196,7 @@ func (r *Replica) CheckConsistency( return resp, nil } - if inconsistencyCount == 0 { + if minoritySHA == "" { // The replicas were in sync. Check that the MVCCStats haven't diverged from // what they should be. This code originated in the realization that there // were many bugs in our stats computations. These are being fixed, but it @@ -216,14 +245,13 @@ func (r *Replica) CheckConsistency( // Diff was printed above, so call logFunc with a short message only. if args.WithDiff { - logFunc(ctx, "consistency check failed with %d inconsistent replicas", inconsistencyCount) + logFunc(ctx, "consistency check failed") return resp, nil } // No diff was printed, so we want to re-run with diff. // Note that this will call Fatal recursively in `CheckConsistency` (in the code above). - log.Errorf(ctx, "consistency check failed with %d inconsistent replicas; fetching details", - inconsistencyCount) + log.Errorf(ctx, "consistency check failed; fetching details") args.WithDiff = true args.Checkpoint = true From 4cf1ee00dc970ea698d5556f3ea5db9b9ca4720e Mon Sep 17 00:00:00 2001 From: Tobias Schottdorf Date: Fri, 25 Oct 2019 21:49:52 +0200 Subject: [PATCH 2/3] storage: terminate nodes in minority on stats mismatch Following up on #41893, the consistency checker now instructs the replicas corresponding to the SHA with the lowest multiplicity to terminate. Note that this change is a candidate for backporting into 19.2. An "old" leaseholder will never populate the newly introduced field, and will always terminate itself. A new leaseholder will populate the field, but only new nodes will interpret it. In the worst case, the result will be a consistency failure that does not lead to a fatal error (but collects RocksDB checkpoints just the same). Since no significant time is usually spent in a mixed-patch-releases, this is not a concern that outweighs the benefit of terminating (heuristically) the "right" nodes. Release note (general improvement): when the replicas within a range have found to been corrupted, the outliers will be terminated. Previously, the leaseholder replica would terminate, regardless of which replicas disagreed with each other. This is expected to curb the spreading of corrupted data better than the previous approach. --- c-deps/libroach/protos/roachpb/api.pb.cc | 96 +- c-deps/libroach/protos/roachpb/api.pb.h | 76 + pkg/roachpb/api.pb.go | 1260 +++++++++-------- pkg/roachpb/api.proto | 12 + pkg/storage/batcheval/cmd_compute_checksum.go | 1 + pkg/storage/consistency_queue.go | 5 +- pkg/storage/consistency_queue_test.go | 21 +- pkg/storage/replica_consistency.go | 59 +- pkg/storage/replica_proposal.go | 46 +- pkg/storage/storagepb/proposer_kv.pb.go | 267 ++-- pkg/storage/storagepb/proposer_kv.proto | 3 + pkg/storage/store.go | 6 +- 12 files changed, 1121 insertions(+), 731 deletions(-) diff --git a/c-deps/libroach/protos/roachpb/api.pb.cc b/c-deps/libroach/protos/roachpb/api.pb.cc index bcfec082c855..2d75a10d176d 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.cc +++ b/c-deps/libroach/protos/roachpb/api.pb.cc @@ -41,10 +41,8 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobu extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_AdminUnsplitResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_BeginTransactionRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_BeginTransactionResponse; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_CheckConsistencyRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ClearRangeRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ClearRangeResponse; -extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ComputeChecksumRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ComputeChecksumResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_ConditionalPutResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_DeleteRangeRequest; @@ -87,7 +85,9 @@ extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobu extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_AdminRelocateRangeRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_AdminScatterResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_AdminSplitRequest; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_CheckConsistencyRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_CheckConsistencyResponse; +extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ComputeChecksumRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ConditionalPutRequest; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_EndTransactionResponse; extern PROTOBUF_INTERNAL_EXPORT_protobuf_roachpb_2fapi_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ExportResponse_File; @@ -1253,9 +1253,10 @@ static void InitDefaultsCheckConsistencyRequest() { ::cockroach::roachpb::CheckConsistencyRequest::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<1> scc_info_CheckConsistencyRequest = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsCheckConsistencyRequest}, { - &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base,}}; +::google::protobuf::internal::SCCInfo<2> scc_info_CheckConsistencyRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsCheckConsistencyRequest}, { + &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base, + &protobuf_roachpb_2fmetadata_2eproto::scc_info_ReplicaDescriptor.base,}}; static void InitDefaultsCheckConsistencyResponse_Result() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -2005,9 +2006,10 @@ static void InitDefaultsComputeChecksumRequest() { ::cockroach::roachpb::ComputeChecksumRequest::InitAsDefaultInstance(); } -::google::protobuf::internal::SCCInfo<1> scc_info_ComputeChecksumRequest = - {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsComputeChecksumRequest}, { - &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base,}}; +::google::protobuf::internal::SCCInfo<2> scc_info_ComputeChecksumRequest = + {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 2, InitDefaultsComputeChecksumRequest}, { + &protobuf_roachpb_2fapi_2eproto::scc_info_RequestHeader.base, + &protobuf_roachpb_2fmetadata_2eproto::scc_info_ReplicaDescriptor.base,}}; static void InitDefaultsComputeChecksumResponse() { GOOGLE_PROTOBUF_VERIFY_VERSION; @@ -9147,11 +9149,15 @@ void CheckConsistencyRequest::InitAsDefaultInstance() { ::cockroach::roachpb::_CheckConsistencyRequest_default_instance_._instance.get_mutable()->header_ = const_cast< ::cockroach::roachpb::RequestHeader*>( ::cockroach::roachpb::RequestHeader::internal_default_instance()); } +void CheckConsistencyRequest::clear_terminate() { + terminate_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int CheckConsistencyRequest::kHeaderFieldNumber; const int CheckConsistencyRequest::kWithDiffFieldNumber; const int CheckConsistencyRequest::kModeFieldNumber; const int CheckConsistencyRequest::kCheckpointFieldNumber; +const int CheckConsistencyRequest::kTerminateFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 CheckConsistencyRequest::CheckConsistencyRequest() @@ -9163,7 +9169,8 @@ CheckConsistencyRequest::CheckConsistencyRequest() } CheckConsistencyRequest::CheckConsistencyRequest(const CheckConsistencyRequest& from) : ::google::protobuf::MessageLite(), - _internal_metadata_(NULL) { + _internal_metadata_(NULL), + terminate_(from.terminate_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_header()) { header_ = new ::cockroach::roachpb::RequestHeader(*from.header_); @@ -9206,6 +9213,7 @@ void CheckConsistencyRequest::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + terminate_.Clear(); if (GetArenaNoVirtual() == NULL && header_ != NULL) { delete header_; } @@ -9286,6 +9294,17 @@ bool CheckConsistencyRequest::MergePartialFromCodedStream( break; } + case 5: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(42u /* 42 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_terminate())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -9333,6 +9352,14 @@ void CheckConsistencyRequest::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteBool(4, this->checkpoint(), output); } + for (unsigned int i = 0, + n = static_cast(this->terminate_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 5, + this->terminate(static_cast(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.CheckConsistencyRequest) @@ -9344,6 +9371,16 @@ size_t CheckConsistencyRequest::ByteSizeLong() const { total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + { + unsigned int count = static_cast(this->terminate_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->terminate(static_cast(i))); + } + } + if (this->has_header()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -9383,6 +9420,7 @@ void CheckConsistencyRequest::MergeFrom(const CheckConsistencyRequest& from) { ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + terminate_.MergeFrom(from.terminate_); if (from.has_header()) { mutable_header()->::cockroach::roachpb::RequestHeader::MergeFrom(from.header()); } @@ -9414,6 +9452,7 @@ void CheckConsistencyRequest::Swap(CheckConsistencyRequest* other) { } void CheckConsistencyRequest::InternalSwap(CheckConsistencyRequest* other) { using std::swap; + CastToBase(&terminate_)->InternalSwap(CastToBase(&other->terminate_)); swap(header_, other->header_); swap(mode_, other->mode_); swap(with_diff_, other->with_diff_); @@ -20742,12 +20781,16 @@ void ComputeChecksumRequest::InitAsDefaultInstance() { ::cockroach::roachpb::_ComputeChecksumRequest_default_instance_._instance.get_mutable()->header_ = const_cast< ::cockroach::roachpb::RequestHeader*>( ::cockroach::roachpb::RequestHeader::internal_default_instance()); } +void ComputeChecksumRequest::clear_terminate() { + terminate_.Clear(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int ComputeChecksumRequest::kHeaderFieldNumber; const int ComputeChecksumRequest::kVersionFieldNumber; const int ComputeChecksumRequest::kSnapshotFieldNumber; const int ComputeChecksumRequest::kModeFieldNumber; const int ComputeChecksumRequest::kCheckpointFieldNumber; +const int ComputeChecksumRequest::kTerminateFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 ComputeChecksumRequest::ComputeChecksumRequest() @@ -20759,7 +20802,8 @@ ComputeChecksumRequest::ComputeChecksumRequest() } ComputeChecksumRequest::ComputeChecksumRequest(const ComputeChecksumRequest& from) : ::google::protobuf::MessageLite(), - _internal_metadata_(NULL) { + _internal_metadata_(NULL), + terminate_(from.terminate_) { _internal_metadata_.MergeFrom(from._internal_metadata_); if (from.has_header()) { header_ = new ::cockroach::roachpb::RequestHeader(*from.header_); @@ -20802,6 +20846,7 @@ void ComputeChecksumRequest::Clear() { // Prevent compiler warnings about cached_has_bits being unused (void) cached_has_bits; + terminate_.Clear(); if (GetArenaNoVirtual() == NULL && header_ != NULL) { delete header_; } @@ -20896,6 +20941,17 @@ bool ComputeChecksumRequest::MergePartialFromCodedStream( break; } + case 7: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(58u /* 58 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, add_terminate())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -20948,6 +21004,14 @@ void ComputeChecksumRequest::SerializeWithCachedSizes( ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->checkpoint(), output); } + for (unsigned int i = 0, + n = static_cast(this->terminate_size()); i < n; i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 7, + this->terminate(static_cast(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.ComputeChecksumRequest) @@ -20959,6 +21023,16 @@ size_t ComputeChecksumRequest::ByteSizeLong() const { total_size += (::google::protobuf::internal::GetProto3PreserveUnknownsDefault() ? _internal_metadata_.unknown_fields() : _internal_metadata_.default_instance()).size(); + { + unsigned int count = static_cast(this->terminate_size()); + total_size += 1UL * count; + for (unsigned int i = 0; i < count; i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSize( + this->terminate(static_cast(i))); + } + } + if (this->has_header()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::MessageSize( @@ -21005,6 +21079,7 @@ void ComputeChecksumRequest::MergeFrom(const ComputeChecksumRequest& from) { ::google::protobuf::uint32 cached_has_bits = 0; (void) cached_has_bits; + terminate_.MergeFrom(from.terminate_); if (from.has_header()) { mutable_header()->::cockroach::roachpb::RequestHeader::MergeFrom(from.header()); } @@ -21039,6 +21114,7 @@ void ComputeChecksumRequest::Swap(ComputeChecksumRequest* other) { } void ComputeChecksumRequest::InternalSwap(ComputeChecksumRequest* other) { using std::swap; + CastToBase(&terminate_)->InternalSwap(CastToBase(&other->terminate_)); swap(header_, other->header_); swap(version_, other->version_); swap(mode_, other->mode_); diff --git a/c-deps/libroach/protos/roachpb/api.pb.h b/c-deps/libroach/protos/roachpb/api.pb.h index c6f2c0378c87..afc5ef8d441f 100644 --- a/c-deps/libroach/protos/roachpb/api.pb.h +++ b/c-deps/libroach/protos/roachpb/api.pb.h @@ -3860,6 +3860,17 @@ class CheckConsistencyRequest : public ::google::protobuf::MessageLite /* @@prot // accessors ------------------------------------------------------- + int terminate_size() const; + void clear_terminate(); + static const int kTerminateFieldNumber = 5; + ::cockroach::roachpb::ReplicaDescriptor* mutable_terminate(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >* + mutable_terminate(); + const ::cockroach::roachpb::ReplicaDescriptor& terminate(int index) const; + ::cockroach::roachpb::ReplicaDescriptor* add_terminate(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >& + terminate() const; + bool has_header() const; void clear_header(); static const int kHeaderFieldNumber = 1; @@ -3893,6 +3904,7 @@ class CheckConsistencyRequest : public ::google::protobuf::MessageLite /* @@prot private: ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor > terminate_; ::cockroach::roachpb::RequestHeader* header_; int mode_; bool with_diff_; @@ -9670,6 +9682,17 @@ class ComputeChecksumRequest : public ::google::protobuf::MessageLite /* @@proto // accessors ------------------------------------------------------- + int terminate_size() const; + void clear_terminate(); + static const int kTerminateFieldNumber = 7; + ::cockroach::roachpb::ReplicaDescriptor* mutable_terminate(int index); + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >* + mutable_terminate(); + const ::cockroach::roachpb::ReplicaDescriptor& terminate(int index) const; + ::cockroach::roachpb::ReplicaDescriptor* add_terminate(); + const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >& + terminate() const; + bool has_header() const; void clear_header(); static const int kHeaderFieldNumber = 1; @@ -9709,6 +9732,7 @@ class ComputeChecksumRequest : public ::google::protobuf::MessageLite /* @@proto private: ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; + ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor > terminate_; ::cockroach::roachpb::RequestHeader* header_; ::google::protobuf::uint32 version_; int mode_; @@ -19179,6 +19203,32 @@ inline void CheckConsistencyRequest::set_checkpoint(bool value) { // @@protoc_insertion_point(field_set:cockroach.roachpb.CheckConsistencyRequest.checkpoint) } +inline int CheckConsistencyRequest::terminate_size() const { + return terminate_.size(); +} +inline ::cockroach::roachpb::ReplicaDescriptor* CheckConsistencyRequest::mutable_terminate(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.CheckConsistencyRequest.terminate) + return terminate_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >* +CheckConsistencyRequest::mutable_terminate() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.CheckConsistencyRequest.terminate) + return &terminate_; +} +inline const ::cockroach::roachpb::ReplicaDescriptor& CheckConsistencyRequest::terminate(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.CheckConsistencyRequest.terminate) + return terminate_.Get(index); +} +inline ::cockroach::roachpb::ReplicaDescriptor* CheckConsistencyRequest::add_terminate() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.CheckConsistencyRequest.terminate) + return terminate_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >& +CheckConsistencyRequest::terminate() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.CheckConsistencyRequest.terminate) + return terminate_; +} + // ------------------------------------------------------------------- // CheckConsistencyResponse_Result @@ -24093,6 +24143,32 @@ inline void ComputeChecksumRequest::set_checkpoint(bool value) { // @@protoc_insertion_point(field_set:cockroach.roachpb.ComputeChecksumRequest.checkpoint) } +inline int ComputeChecksumRequest::terminate_size() const { + return terminate_.size(); +} +inline ::cockroach::roachpb::ReplicaDescriptor* ComputeChecksumRequest::mutable_terminate(int index) { + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.ComputeChecksumRequest.terminate) + return terminate_.Mutable(index); +} +inline ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >* +ComputeChecksumRequest::mutable_terminate() { + // @@protoc_insertion_point(field_mutable_list:cockroach.roachpb.ComputeChecksumRequest.terminate) + return &terminate_; +} +inline const ::cockroach::roachpb::ReplicaDescriptor& ComputeChecksumRequest::terminate(int index) const { + // @@protoc_insertion_point(field_get:cockroach.roachpb.ComputeChecksumRequest.terminate) + return terminate_.Get(index); +} +inline ::cockroach::roachpb::ReplicaDescriptor* ComputeChecksumRequest::add_terminate() { + // @@protoc_insertion_point(field_add:cockroach.roachpb.ComputeChecksumRequest.terminate) + return terminate_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::cockroach::roachpb::ReplicaDescriptor >& +ComputeChecksumRequest::terminate() const { + // @@protoc_insertion_point(field_list:cockroach.roachpb.ComputeChecksumRequest.terminate) + return terminate_; +} + // ------------------------------------------------------------------- // ComputeChecksumResponse diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go index 7018aa7227d1..61ae97cd5bad 100644 --- a/pkg/roachpb/api.pb.go +++ b/pkg/roachpb/api.pb.go @@ -71,7 +71,7 @@ func (x ReadConsistencyType) String() string { return proto.EnumName(ReadConsistencyType_name, int32(x)) } func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{0} } // ScanFormat is an enumeration of the available response formats for MVCCScan @@ -99,7 +99,7 @@ func (x ScanFormat) String() string { return proto.EnumName(ScanFormat_name, int32(x)) } func (ScanFormat) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{1} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{1} } type ChecksumMode int32 @@ -146,7 +146,7 @@ func (x ChecksumMode) String() string { return proto.EnumName(ChecksumMode_name, int32(x)) } func (ChecksumMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{2} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{2} } // PushTxnType determines what action to take when pushing a transaction. @@ -177,7 +177,7 @@ func (x PushTxnType) String() string { return proto.EnumName(PushTxnType_name, int32(x)) } func (PushTxnType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{3} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{3} } type ExportStorageProvider int32 @@ -215,7 +215,7 @@ func (x ExportStorageProvider) String() string { return proto.EnumName(ExportStorageProvider_name, int32(x)) } func (ExportStorageProvider) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{4} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{4} } type MVCCFilter int32 @@ -238,7 +238,7 @@ func (x MVCCFilter) String() string { return proto.EnumName(MVCCFilter_name, int32(x)) } func (MVCCFilter) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{5} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{5} } type ResponseHeader_ResumeReason int32 @@ -270,7 +270,7 @@ func (x ResponseHeader_ResumeReason) String() string { return proto.EnumName(ResponseHeader_ResumeReason_name, int32(x)) } func (ResponseHeader_ResumeReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{2, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{2, 0} } type CheckConsistencyResponse_Status int32 @@ -312,7 +312,7 @@ func (x CheckConsistencyResponse_Status) String() string { return proto.EnumName(CheckConsistencyResponse_Status_name, int32(x)) } func (CheckConsistencyResponse_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{27, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{27, 0} } // RangeInfo describes a range which executed a request. It contains @@ -326,7 +326,7 @@ func (m *RangeInfo) Reset() { *m = RangeInfo{} } func (m *RangeInfo) String() string { return proto.CompactTextString(m) } func (*RangeInfo) ProtoMessage() {} func (*RangeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{0} } func (m *RangeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -369,7 +369,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_59d6182c09f1c2ef, []int{1} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{1} } func (m *RequestHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -427,7 +427,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_59d6182c09f1c2ef, []int{2} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{2} } func (m *ResponseHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -461,7 +461,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_59d6182c09f1c2ef, []int{3} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{3} } func (m *GetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -499,7 +499,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_59d6182c09f1c2ef, []int{4} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{4} } func (m *GetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -542,7 +542,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_59d6182c09f1c2ef, []int{5} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{5} } func (m *PutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -576,7 +576,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_59d6182c09f1c2ef, []int{6} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{6} } func (m *PutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -630,7 +630,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_59d6182c09f1c2ef, []int{7} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{7} } func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +665,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_59d6182c09f1c2ef, []int{8} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{8} } func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -711,7 +711,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_59d6182c09f1c2ef, []int{9} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{9} } func (m *InitPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -745,7 +745,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_59d6182c09f1c2ef, []int{10} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{10} } func (m *InitPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -785,7 +785,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_59d6182c09f1c2ef, []int{11} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{11} } func (m *IncrementRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -822,7 +822,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_59d6182c09f1c2ef, []int{12} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{12} } func (m *IncrementResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -856,7 +856,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_59d6182c09f1c2ef, []int{13} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{13} } func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -890,7 +890,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_59d6182c09f1c2ef, []int{14} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{14} } func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -939,7 +939,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_59d6182c09f1c2ef, []int{15} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{15} } func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -976,7 +976,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_59d6182c09f1c2ef, []int{16} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{16} } func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1023,7 +1023,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_59d6182c09f1c2ef, []int{17} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{17} } func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1057,7 +1057,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_59d6182c09f1c2ef, []int{18} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{18} } func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1098,7 +1098,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_59d6182c09f1c2ef, []int{19} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{19} } func (m *RevertRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1132,7 +1132,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_59d6182c09f1c2ef, []int{20} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{20} } func (m *RevertRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1201,7 +1201,7 @@ func (m *ScanOptions) Reset() { *m = ScanOptions{} } func (m *ScanOptions) String() string { return proto.CompactTextString(m) } func (*ScanOptions) ProtoMessage() {} func (*ScanOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{21} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{21} } func (m *ScanOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1241,7 +1241,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_59d6182c09f1c2ef, []int{22} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{22} } func (m *ScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1288,7 +1288,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_59d6182c09f1c2ef, []int{23} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{23} } func (m *ScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +1328,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_59d6182c09f1c2ef, []int{24} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{24} } func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1375,7 +1375,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_59d6182c09f1c2ef, []int{25} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{25} } func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1415,13 +1415,20 @@ type CheckConsistencyRequest struct { // in-time backup of the database. It will be put into the engines' auxiliary // directory and needs to be removed manually to avoid leaking disk space. Checkpoint bool `protobuf:"varint,4,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` + // A list of nodes that the consistency check wants to terminate. This is + // typically set when Checkpoint above is also set, as part of a second round + // after a first consistency check that did find a divergence. The second + // round is concerned with damage control and wants the nodes it suspects hold + // anomalous data to be shut down, so that this data isn't served to clients + // (or worse, spread to other replicas). + Terminate []ReplicaDescriptor `protobuf:"bytes,5,rep,name=terminate,proto3" json:"terminate"` } 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_59d6182c09f1c2ef, []int{26} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{26} } func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1458,7 +1465,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_59d6182c09f1c2ef, []int{27} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{27} } func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1502,7 +1509,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_59d6182c09f1c2ef, []int{27, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{27, 0} } func (m *CheckConsistencyResponse_Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1550,7 +1557,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_59d6182c09f1c2ef, []int{28} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{28} } func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1586,7 +1593,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_59d6182c09f1c2ef, []int{29} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{29} } func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1620,7 +1627,7 @@ func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } func (*BeginTransactionRequest) ProtoMessage() {} func (*BeginTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{30} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{30} } func (m *BeginTransactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1654,7 +1661,7 @@ func (m *BeginTransactionResponse) Reset() { *m = BeginTransactionRespon func (m *BeginTransactionResponse) String() string { return proto.CompactTextString(m) } func (*BeginTransactionResponse) ProtoMessage() {} func (*BeginTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{31} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{31} } func (m *BeginTransactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1742,7 +1749,7 @@ func (m *EndTransactionRequest) Reset() { *m = EndTransactionRequest{} } func (m *EndTransactionRequest) String() string { return proto.CompactTextString(m) } func (*EndTransactionRequest) ProtoMessage() {} func (*EndTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{32} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{32} } func (m *EndTransactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1789,7 +1796,7 @@ func (m *EndTransactionResponse) Reset() { *m = EndTransactionResponse{} func (m *EndTransactionResponse) String() string { return proto.CompactTextString(m) } func (*EndTransactionResponse) ProtoMessage() {} func (*EndTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{33} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{33} } func (m *EndTransactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1850,7 +1857,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_59d6182c09f1c2ef, []int{34} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{34} } func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1885,7 +1892,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_59d6182c09f1c2ef, []int{35} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{35} } func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1924,7 +1931,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_59d6182c09f1c2ef, []int{36} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{36} } func (m *AdminUnsplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1959,7 +1966,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_59d6182c09f1c2ef, []int{37} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{37} } func (m *AdminUnsplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2002,7 +2009,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_59d6182c09f1c2ef, []int{38} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{38} } func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2037,7 +2044,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_59d6182c09f1c2ef, []int{39} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{39} } func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2075,7 +2082,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_59d6182c09f1c2ef, []int{40} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{40} } func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2108,7 +2115,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_59d6182c09f1c2ef, []int{41} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{41} } func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2143,7 +2150,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_59d6182c09f1c2ef, []int{42} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{42} } func (m *ReplicationChange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2201,7 +2208,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_59d6182c09f1c2ef, []int{43} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{43} } func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2236,7 +2243,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_59d6182c09f1c2ef, []int{44} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{44} } func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2273,7 +2280,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_59d6182c09f1c2ef, []int{45} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{45} } func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2306,7 +2313,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_59d6182c09f1c2ef, []int{46} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{46} } func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2345,7 +2352,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_59d6182c09f1c2ef, []int{47} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{47} } func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2382,7 +2389,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_59d6182c09f1c2ef, []int{48} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{48} } func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2420,7 +2427,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_59d6182c09f1c2ef, []int{49} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{49} } func (m *GCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2454,7 +2461,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_59d6182c09f1c2ef, []int{49, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{49, 0} } func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2488,7 +2495,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_59d6182c09f1c2ef, []int{50} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{50} } func (m *GCResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2563,7 +2570,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_59d6182c09f1c2ef, []int{51} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{51} } func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2606,7 +2613,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_59d6182c09f1c2ef, []int{52} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{52} } func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2653,7 +2660,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_59d6182c09f1c2ef, []int{53} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{53} } func (m *RecoverTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2689,7 +2696,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_59d6182c09f1c2ef, []int{54} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{54} } func (m *RecoverTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2733,7 +2740,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_59d6182c09f1c2ef, []int{55} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{55} } func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2772,7 +2779,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_59d6182c09f1c2ef, []int{56} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{56} } func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2832,7 +2839,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_59d6182c09f1c2ef, []int{57} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{57} } func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2868,7 +2875,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_59d6182c09f1c2ef, []int{58} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{58} } func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2912,7 +2919,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_59d6182c09f1c2ef, []int{59} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{59} } func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2947,7 +2954,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_59d6182c09f1c2ef, []int{60} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{60} } func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2995,7 +3002,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_59d6182c09f1c2ef, []int{61} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{61} } func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3030,7 +3037,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_59d6182c09f1c2ef, []int{62} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{62} } func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3067,7 +3074,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_59d6182c09f1c2ef, []int{63} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{63} } func (m *MergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3101,7 +3108,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_59d6182c09f1c2ef, []int{64} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{64} } func (m *MergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3146,7 +3153,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_59d6182c09f1c2ef, []int{65} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{65} } func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3180,7 +3187,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_59d6182c09f1c2ef, []int{66} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{66} } func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3224,7 +3231,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_59d6182c09f1c2ef, []int{67} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{67} } func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3273,7 +3280,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_59d6182c09f1c2ef, []int{68} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{68} } func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3310,7 +3317,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_59d6182c09f1c2ef, []int{69} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{69} } func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3347,7 +3354,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_59d6182c09f1c2ef, []int{70} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{70} } func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3382,7 +3389,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_59d6182c09f1c2ef, []int{71} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{71} } func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3426,13 +3433,18 @@ type ComputeChecksumRequest struct { // we want to preserve as much state as possible. The checkpoint will be stored // in the engine's auxiliary directory. Checkpoint bool `protobuf:"varint,6,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` + // If non-empty, specifies the replicas which are the most likely source of the + // inconsistency. After evaluating the command, these replicas will terminate. + // + // See the field of the same name in CheckConsistencyRequest for details. + Terminate []ReplicaDescriptor `protobuf:"bytes,7,rep,name=terminate,proto3" json:"terminate"` } 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_59d6182c09f1c2ef, []int{72} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{72} } func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3469,7 +3481,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_59d6182c09f1c2ef, []int{73} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{73} } func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3508,7 +3520,7 @@ func (m *ExportStorage) Reset() { *m = ExportStorage{} } func (m *ExportStorage) String() string { return proto.CompactTextString(m) } func (*ExportStorage) ProtoMessage() {} func (*ExportStorage) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74} } func (m *ExportStorage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3542,7 +3554,7 @@ func (m *ExportStorage_LocalFilePath) Reset() { *m = ExportStorage_Local func (m *ExportStorage_LocalFilePath) String() string { return proto.CompactTextString(m) } func (*ExportStorage_LocalFilePath) ProtoMessage() {} func (*ExportStorage_LocalFilePath) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 0} } func (m *ExportStorage_LocalFilePath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3575,7 +3587,7 @@ func (m *ExportStorage_Http) Reset() { *m = ExportStorage_Http{} } func (m *ExportStorage_Http) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Http) ProtoMessage() {} func (*ExportStorage_Http) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 1} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 1} } func (m *ExportStorage_Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3615,7 +3627,7 @@ func (m *ExportStorage_S3) Reset() { *m = ExportStorage_S3{} } func (m *ExportStorage_S3) String() string { return proto.CompactTextString(m) } func (*ExportStorage_S3) ProtoMessage() {} func (*ExportStorage_S3) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 2} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 2} } func (m *ExportStorage_S3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3654,7 +3666,7 @@ func (m *ExportStorage_GCS) Reset() { *m = ExportStorage_GCS{} } func (m *ExportStorage_GCS) String() string { return proto.CompactTextString(m) } func (*ExportStorage_GCS) ProtoMessage() {} func (*ExportStorage_GCS) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 3} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 3} } func (m *ExportStorage_GCS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3690,7 +3702,7 @@ func (m *ExportStorage_Azure) Reset() { *m = ExportStorage_Azure{} } func (m *ExportStorage_Azure) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Azure) ProtoMessage() {} func (*ExportStorage_Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 4} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 4} } func (m *ExportStorage_Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3729,7 +3741,7 @@ func (m *ExportStorage_Workload) Reset() { *m = ExportStorage_Workload{} func (m *ExportStorage_Workload) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Workload) ProtoMessage() {} func (*ExportStorage_Workload) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{74, 5} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{74, 5} } func (m *ExportStorage_Workload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3769,7 +3781,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_59d6182c09f1c2ef, []int{75} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{75} } func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3803,7 +3815,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_59d6182c09f1c2ef, []int{76} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{76} } func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3865,7 +3877,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_59d6182c09f1c2ef, []int{77} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{77} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3901,7 +3913,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_59d6182c09f1c2ef, []int{78} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{78} } func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3937,7 +3949,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_59d6182c09f1c2ef, []int{79} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{79} } func (m *ExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3977,7 +3989,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_59d6182c09f1c2ef, []int{79, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{79, 0} } func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4027,7 +4039,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_59d6182c09f1c2ef, []int{80} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{80} } func (m *ImportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4062,7 +4074,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_59d6182c09f1c2ef, []int{80, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{80, 0} } func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4098,7 +4110,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_59d6182c09f1c2ef, []int{80, 1} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{80, 1} } func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4133,7 +4145,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_59d6182c09f1c2ef, []int{81} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{81} } func (m *ImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4171,7 +4183,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_59d6182c09f1c2ef, []int{82} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{82} } func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4206,7 +4218,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_59d6182c09f1c2ef, []int{83} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{83} } func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4239,7 +4251,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_59d6182c09f1c2ef, []int{83, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{83, 0} } func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4292,7 +4304,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_59d6182c09f1c2ef, []int{84} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{84} } func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4326,7 +4338,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_59d6182c09f1c2ef, []int{85} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{85} } func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4370,7 +4382,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_59d6182c09f1c2ef, []int{86} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{86} } func (m *RefreshRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4404,7 +4416,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_59d6182c09f1c2ef, []int{87} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{87} } func (m *RefreshResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4444,7 +4456,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_59d6182c09f1c2ef, []int{88} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{88} } func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4478,7 +4490,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_59d6182c09f1c2ef, []int{89} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{89} } func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4530,7 +4542,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_59d6182c09f1c2ef, []int{90} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{90} } func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4579,7 +4591,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_59d6182c09f1c2ef, []int{91} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{91} } func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4614,7 +4626,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_59d6182c09f1c2ef, []int{92} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{92} } func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4653,7 +4665,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_59d6182c09f1c2ef, []int{93} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{93} } func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4736,7 +4748,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_59d6182c09f1c2ef, []int{94} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{94} } func (m *RequestUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6186,7 +6198,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_59d6182c09f1c2ef, []int{95} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{95} } func (m *ResponseUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7630,7 +7642,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_59d6182c09f1c2ef, []int{96} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{96} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7666,7 +7678,7 @@ type BatchRequest struct { func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (*BatchRequest) ProtoMessage() {} func (*BatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{97} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{97} } func (m *BatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7703,7 +7715,7 @@ type BatchResponse struct { func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (*BatchResponse) ProtoMessage() {} func (*BatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_59d6182c09f1c2ef, []int{98} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{98} } func (m *BatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7762,7 +7774,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_59d6182c09f1c2ef, []int{98, 0} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{98, 0} } func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7798,7 +7810,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_59d6182c09f1c2ef, []int{99} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{99} } func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7834,7 +7846,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_59d6182c09f1c2ef, []int{100} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{100} } func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7875,7 +7887,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_59d6182c09f1c2ef, []int{101} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{101} } func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7912,7 +7924,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_59d6182c09f1c2ef, []int{102} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{102} } func (m *RangeFeedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7949,7 +7961,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_59d6182c09f1c2ef, []int{103} + return fileDescriptor_api_21b1b1b0b50cd8da, []int{103} } func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8502,6 +8514,14 @@ func (this *CheckConsistencyRequest) Equal(that interface{}) bool { if this.Checkpoint != that1.Checkpoint { return false } + if len(this.Terminate) != len(that1.Terminate) { + return false + } + for i := range this.Terminate { + if !this.Terminate[i].Equal(&that1.Terminate[i]) { + return false + } + } return true } func (this *RecomputeStatsRequest) Equal(that interface{}) bool { @@ -9299,6 +9319,14 @@ func (this *ComputeChecksumRequest) Equal(that interface{}) bool { if this.Checkpoint != that1.Checkpoint { return false } + if len(this.Terminate) != len(that1.Terminate) { + return false + } + for i := range this.Terminate { + if !this.Terminate[i].Equal(&that1.Terminate[i]) { + return false + } + } return true } func (this *ExportStorage) Equal(that interface{}) bool { @@ -11059,6 +11087,18 @@ func (m *CheckConsistencyRequest) MarshalTo(dAtA []byte) (int, error) { } i++ } + if len(m.Terminate) > 0 { + for _, msg := range m.Terminate { + dAtA[i] = 0x2a + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -12883,6 +12923,18 @@ func (m *ComputeChecksumRequest) MarshalTo(dAtA []byte) (int, error) { } i++ } + if len(m.Terminate) > 0 { + for _, msg := range m.Terminate { + dAtA[i] = 0x3a + i++ + i = encodeVarintApi(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -16494,6 +16546,12 @@ func (m *CheckConsistencyRequest) Size() (n int) { if m.Checkpoint { n += 2 } + if len(m.Terminate) > 0 { + for _, e := range m.Terminate { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -17236,6 +17294,12 @@ func (m *ComputeChecksumRequest) Size() (n int) { if m.Checkpoint { n += 2 } + if len(m.Terminate) > 0 { + for _, e := range m.Terminate { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -22195,6 +22259,37 @@ func (m *CheckConsistencyRequest) Unmarshal(dAtA []byte) error { } } m.Checkpoint = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Terminate", 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.Terminate = append(m.Terminate, ReplicaDescriptor{}) + if err := m.Terminate[len(m.Terminate)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -27805,6 +27900,37 @@ func (m *ComputeChecksumRequest) Unmarshal(dAtA []byte) error { } } m.Checkpoint = bool(v != 0) + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Terminate", 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.Terminate = append(m.Terminate, ReplicaDescriptor{}) + if err := m.Terminate[len(m.Terminate)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -36601,446 +36727,448 @@ var ( ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_59d6182c09f1c2ef) } - -var fileDescriptor_api_59d6182c09f1c2ef = []byte{ - // 7006 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5b, 0x6c, 0x23, 0xc9, - 0x75, 0x36, 0x9b, 0xa4, 0x28, 0xf2, 0xf0, 0xa2, 0x56, 0x69, 0x2e, 0x1c, 0xed, 0xae, 0xa4, 0xe1, - 0x5c, 0x77, 0x76, 0x57, 0xe3, 0x99, 0xf1, 0xda, 0xeb, 0x5d, 0x7b, 0x6d, 0x89, 0xe2, 0x0c, 0x39, - 0x1a, 0x5d, 0xb6, 0x49, 0xcd, 0x7a, 0xd6, 0xff, 0xfe, 0xed, 0x56, 0x77, 0x89, 0x6a, 0x0f, 0xd9, - 0xcd, 0xed, 0x6e, 0x8e, 0xa4, 0x01, 0x82, 0x20, 0x79, 0x71, 0x60, 0x18, 0x46, 0x1e, 0x82, 0x20, - 0xb0, 0x13, 0x64, 0x01, 0x07, 0x09, 0x90, 0x20, 0x06, 0x02, 0x18, 0x08, 0x1c, 0x04, 0xf0, 0x43, - 0x5e, 0x36, 0x86, 0x1f, 0x8c, 0x20, 0x76, 0x8c, 0x3c, 0x08, 0xf1, 0x38, 0x41, 0x8c, 0xbc, 0x06, +func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_21b1b1b0b50cd8da) } + +var fileDescriptor_api_21b1b1b0b50cd8da = []byte{ + // 7029 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0xdb, 0x6f, 0x23, 0xc9, + 0x75, 0xb7, 0x9a, 0xa4, 0x28, 0xf2, 0xf0, 0xa2, 0x56, 0x49, 0x33, 0xc3, 0xd1, 0xee, 0x4a, 0x1a, + 0xce, 0x75, 0x67, 0x77, 0x35, 0x9e, 0x19, 0xaf, 0xbd, 0xde, 0xb5, 0xd7, 0x96, 0x28, 0xce, 0x90, + 0xa3, 0xd1, 0x65, 0x9b, 0xd4, 0xac, 0x67, 0xfd, 0xed, 0xd7, 0x6e, 0x75, 0x97, 0xa8, 0xf6, 0x90, + 0xdd, 0xdc, 0xee, 0xe6, 0x48, 0x1a, 0x20, 0x08, 0x92, 0x17, 0x07, 0x86, 0x61, 0xe4, 0x21, 0x08, + 0x02, 0x3b, 0x81, 0x17, 0x70, 0x90, 0x00, 0x09, 0x62, 0x20, 0x80, 0x81, 0xc0, 0x41, 0x02, 0x3f, + 0xe4, 0x65, 0x63, 0xf8, 0xc1, 0x08, 0x12, 0xc7, 0xc8, 0x83, 0x10, 0xcb, 0x09, 0x62, 0xe4, 0x0f, 0x88, 0x81, 0x0d, 0x10, 0x04, 0x75, 0xe9, 0x0b, 0xc9, 0xe6, 0x45, 0x72, 0x2f, 0xb2, 0x41, 0x9e, - 0xd8, 0x7d, 0xaa, 0xce, 0xe9, 0xaa, 0x53, 0xa7, 0xaa, 0xce, 0x57, 0x75, 0xaa, 0x08, 0xb3, 0x96, - 0xa9, 0xa8, 0xfb, 0x9d, 0xdd, 0x9b, 0x4a, 0x47, 0x5f, 0xee, 0x58, 0xa6, 0x63, 0xa2, 0x59, 0xd5, - 0x54, 0x1f, 0x53, 0xf2, 0x32, 0x4f, 0x9c, 0x47, 0x6e, 0x2e, 0x4d, 0x71, 0x14, 0x96, 0x6d, 0xfe, - 0x8c, 0x4b, 0xc3, 0x96, 0x65, 0x5a, 0x36, 0xa7, 0x9e, 0x73, 0xa9, 0x6d, 0xec, 0x28, 0x81, 0xdc, - 0x25, 0xdb, 0x31, 0x2d, 0xa5, 0x89, 0x6f, 0x62, 0xa3, 0xa9, 0x1b, 0xee, 0x0f, 0xc9, 0xf7, 0x44, - 0x55, 0x79, 0x9e, 0x4b, 0xa3, 0xf2, 0xdc, 0xe1, 0x99, 0x8a, 0x5d, 0x47, 0x6f, 0xdd, 0xdc, 0x6f, - 0xa9, 0x37, 0x1d, 0xbd, 0x8d, 0x6d, 0x47, 0x69, 0x77, 0x78, 0xca, 0x12, 0x4d, 0x71, 0x2c, 0x45, - 0xd5, 0x8d, 0xe6, 0x4d, 0x0b, 0xab, 0xa6, 0xa5, 0x61, 0x4d, 0xb6, 0x3b, 0x8a, 0xe1, 0x16, 0xb9, - 0x69, 0x36, 0x4d, 0xfa, 0x78, 0x93, 0x3c, 0x31, 0x6a, 0xe9, 0xd7, 0x21, 0x23, 0x29, 0x46, 0x13, - 0xd7, 0x8c, 0x3d, 0x13, 0x7d, 0x16, 0x92, 0x1a, 0xb6, 0xd5, 0xa2, 0xb0, 0x24, 0x5c, 0xcf, 0xde, - 0x2e, 0x2d, 0x0f, 0xe8, 0x62, 0x99, 0xe6, 0x5d, 0xc3, 0xb6, 0x6a, 0xe9, 0x1d, 0xc7, 0xb4, 0x56, - 0x93, 0x1f, 0x1c, 0x2f, 0xc6, 0x24, 0xca, 0x85, 0x3e, 0x09, 0x53, 0x2d, 0xac, 0xd8, 0xb8, 0x18, - 0xa7, 0xec, 0xc5, 0x10, 0xf6, 0x07, 0x24, 0x9d, 0x33, 0xb1, 0xcc, 0xa5, 0xbf, 0x11, 0x20, 0x2f, - 0xe1, 0xf7, 0xba, 0xd8, 0x76, 0xaa, 0x58, 0xd1, 0xb0, 0x85, 0x2e, 0x40, 0xe2, 0x31, 0x3e, 0x2a, - 0x26, 0x96, 0x84, 0xeb, 0xb9, 0xd5, 0xe9, 0x0f, 0x8f, 0x17, 0x13, 0xeb, 0xf8, 0x48, 0x22, 0x34, - 0xb4, 0x04, 0xd3, 0xd8, 0xd0, 0x64, 0x92, 0x9c, 0xec, 0x4d, 0x4e, 0x61, 0x43, 0x5b, 0xc7, 0x47, - 0x48, 0x85, 0xb4, 0x4d, 0xa4, 0x19, 0x2a, 0x2e, 0x4e, 0x2d, 0x09, 0xd7, 0xa7, 0x56, 0xef, 0x7d, - 0x78, 0xbc, 0x58, 0x6e, 0xea, 0xce, 0x7e, 0x77, 0x77, 0x59, 0x35, 0xdb, 0x37, 0xbd, 0x52, 0x69, - 0xbb, 0xfe, 0xf3, 0xcd, 0xce, 0xe3, 0xe6, 0xcd, 0x21, 0x2d, 0xb0, 0xdc, 0x38, 0x34, 0xea, 0xf8, - 0x3d, 0xc9, 0x13, 0xfc, 0x7a, 0xf2, 0x17, 0xef, 0x2f, 0x0a, 0xf7, 0x93, 0x69, 0x41, 0x8c, 0xdf, - 0x4f, 0xa6, 0xe3, 0x62, 0xa2, 0xf4, 0xf5, 0x04, 0x14, 0x24, 0x6c, 0x77, 0x4c, 0xc3, 0xc6, 0xbc, - 0x1a, 0x9f, 0x80, 0x84, 0x73, 0x68, 0xd0, 0x6a, 0x64, 0x6f, 0x2f, 0x84, 0x28, 0xa3, 0x61, 0x29, - 0x86, 0xad, 0xa8, 0x8e, 0x6e, 0x1a, 0x12, 0xc9, 0x8a, 0x5e, 0x83, 0xac, 0x85, 0xed, 0x6e, 0x1b, - 0xd3, 0x66, 0xa3, 0x35, 0xcc, 0xde, 0x3e, 0x1f, 0xc2, 0x59, 0xef, 0x28, 0x86, 0x04, 0x2c, 0x2f, - 0x79, 0x46, 0x17, 0x20, 0x6d, 0x74, 0xdb, 0x44, 0x2f, 0x36, 0xad, 0x75, 0x42, 0x9a, 0x36, 0xba, - 0xed, 0x75, 0x7c, 0x64, 0xa3, 0x32, 0x64, 0x2d, 0xd2, 0x68, 0xb2, 0x6e, 0xec, 0x99, 0x76, 0x31, - 0xb5, 0x94, 0xb8, 0x9e, 0xbd, 0xfd, 0xfc, 0xb0, 0xa6, 0x25, 0x66, 0xc0, 0xdb, 0x07, 0x2c, 0x97, - 0x60, 0xa3, 0x3a, 0xe4, 0x79, 0xc9, 0x2c, 0xac, 0xd8, 0xa6, 0x51, 0x9c, 0x5e, 0x12, 0xae, 0x17, - 0x6e, 0x2f, 0x87, 0x89, 0xe9, 0xd1, 0x02, 0x79, 0xed, 0xb6, 0xb1, 0x44, 0xb9, 0xa4, 0x9c, 0x15, - 0x78, 0x2b, 0x3d, 0x82, 0x5c, 0x30, 0x15, 0x21, 0x28, 0x48, 0x95, 0xfa, 0xce, 0x46, 0x45, 0xde, - 0xd9, 0x5c, 0xdf, 0xdc, 0x7a, 0x7b, 0x53, 0x8c, 0xa1, 0x33, 0x20, 0x72, 0xda, 0x7a, 0xe5, 0x91, - 0xfc, 0xa0, 0xb6, 0x51, 0x6b, 0x88, 0x02, 0xba, 0x00, 0x67, 0x39, 0x55, 0x5a, 0xd9, 0xbc, 0x57, - 0x91, 0x57, 0xb7, 0x76, 0x36, 0xd7, 0x56, 0xa4, 0x47, 0x62, 0x7c, 0x3e, 0xf9, 0x5b, 0xdf, 0x5e, - 0x88, 0x95, 0x1e, 0x02, 0xdc, 0xc3, 0x0e, 0x37, 0x2b, 0xb4, 0x0a, 0xa9, 0x7d, 0x5a, 0x1a, 0x6e, - 0xd8, 0x4b, 0xa1, 0xc5, 0x0e, 0x98, 0xe0, 0x6a, 0x9a, 0x68, 0xe0, 0x47, 0xc7, 0x8b, 0x82, 0xc4, - 0x39, 0x59, 0x93, 0x97, 0xbe, 0x2f, 0x40, 0x96, 0x0a, 0x66, 0x75, 0x44, 0xe5, 0x3e, 0xc9, 0x17, - 0xc7, 0x2a, 0x64, 0x50, 0x34, 0x5a, 0x86, 0xa9, 0x27, 0x4a, 0xab, 0x3b, 0xaa, 0xdf, 0x3c, 0x24, - 0xe9, 0x12, 0xcb, 0x86, 0xde, 0x80, 0x9c, 0x6e, 0x38, 0xd8, 0x70, 0x64, 0xc6, 0x96, 0x18, 0xc3, - 0x96, 0x65, 0xb9, 0xe9, 0x4b, 0xe9, 0xaf, 0x04, 0x80, 0xed, 0x6e, 0x94, 0xaa, 0x21, 0xfd, 0x7e, - 0xa2, 0xf2, 0xbb, 0xfd, 0x9e, 0xd5, 0xe2, 0x1c, 0xa4, 0x74, 0xa3, 0xa5, 0x1b, 0xac, 0xfc, 0x69, - 0x89, 0xbf, 0xa1, 0x33, 0x30, 0xb5, 0xdb, 0xd2, 0x0d, 0x8d, 0x9a, 0x7f, 0x5a, 0x62, 0x2f, 0x5c, - 0xfd, 0x12, 0x64, 0x69, 0xd9, 0x23, 0xd4, 0x7e, 0xe9, 0x9b, 0x71, 0x38, 0x5b, 0x36, 0x0d, 0x4d, - 0x27, 0xfd, 0x50, 0x69, 0x7d, 0x2c, 0x74, 0xf3, 0x2a, 0x64, 0xf0, 0x61, 0x67, 0xc2, 0xe6, 0x4d, - 0xe3, 0xc3, 0x0e, 0x7d, 0x0a, 0x57, 0x1d, 0xfa, 0x24, 0x9c, 0x57, 0x5a, 0x2d, 0xf3, 0x40, 0xd6, - 0xf7, 0x64, 0xcd, 0xc4, 0xb6, 0x6c, 0x98, 0x8e, 0x8c, 0x0f, 0x75, 0xdb, 0xa1, 0x43, 0x45, 0x5a, - 0x9a, 0xa3, 0xc9, 0xb5, 0xbd, 0x35, 0x13, 0xdb, 0x9b, 0xa6, 0x53, 0x21, 0x49, 0x5c, 0xe1, 0xef, - 0xc2, 0xb9, 0x7e, 0xdd, 0x44, 0xa9, 0xfb, 0xbf, 0x13, 0xa0, 0x50, 0x33, 0x74, 0xe7, 0x63, 0xa1, - 0x74, 0x4f, 0x7b, 0x89, 0xa0, 0xf6, 0x6e, 0x80, 0xb8, 0xa7, 0xe8, 0xad, 0x2d, 0xa3, 0x61, 0xb6, - 0x77, 0x6d, 0xc7, 0x34, 0xb0, 0xcd, 0xd5, 0x3b, 0x40, 0xe7, 0x3a, 0x7b, 0x08, 0x33, 0x5e, 0x9d, - 0xa2, 0x54, 0xd6, 0x53, 0x10, 0x6b, 0x86, 0x6a, 0xe1, 0x36, 0x36, 0x22, 0xd5, 0xd6, 0xf3, 0x90, - 0xd1, 0x5d, 0xb9, 0x54, 0x63, 0x09, 0xc9, 0x27, 0xf0, 0x3a, 0x75, 0x61, 0x36, 0xf0, 0xed, 0x28, - 0x07, 0xbf, 0xe7, 0x20, 0x63, 0xe0, 0x03, 0xd9, 0x6f, 0xaf, 0x84, 0x94, 0x36, 0xf0, 0x01, 0x1b, - 0xac, 0x1e, 0x41, 0x7e, 0x0d, 0xb7, 0xb0, 0x83, 0xa3, 0x1f, 0xc9, 0x77, 0xa0, 0xe0, 0x8a, 0x8e, - 0xb2, 0x91, 0xfe, 0x40, 0x00, 0xc4, 0xe5, 0x92, 0xd9, 0x33, 0xca, 0x76, 0x5a, 0x24, 0xde, 0x81, - 0xd3, 0xb5, 0x0c, 0x36, 0xcd, 0x33, 0x2b, 0x05, 0x46, 0xa2, 0x33, 0xbd, 0x3f, 0xa2, 0x26, 0x83, - 0x23, 0xaa, 0xe7, 0xad, 0x10, 0x3f, 0xe5, 0x00, 0xe6, 0x7a, 0x8a, 0x17, 0x6d, 0x53, 0x26, 0x69, - 0xc9, 0xe2, 0x4b, 0x89, 0xa0, 0x67, 0x46, 0x89, 0xa5, 0x77, 0x61, 0xb6, 0xdc, 0xc2, 0x8a, 0x15, - 0xb5, 0x5a, 0x78, 0x73, 0x3e, 0x02, 0x14, 0x14, 0x1f, 0x65, 0x93, 0xfe, 0x91, 0x00, 0x48, 0xc2, - 0x4f, 0xb0, 0xe5, 0x44, 0xde, 0xa4, 0x6b, 0x90, 0x75, 0x14, 0xab, 0x89, 0x1d, 0x99, 0xb8, 0xf3, - 0x7c, 0xb8, 0x7a, 0x21, 0x20, 0x88, 0x38, 0xf5, 0xcb, 0xfb, 0x2d, 0x75, 0xb9, 0xe1, 0xba, 0xfb, - 0xae, 0x73, 0xc6, 0xf8, 0x08, 0x99, 0x6b, 0xe0, 0x1d, 0x98, 0xeb, 0x29, 0x65, 0x94, 0x2a, 0xd0, - 0x21, 0x5b, 0x57, 0x15, 0x63, 0xab, 0x43, 0xe6, 0x01, 0x1b, 0xdd, 0x81, 0x73, 0xb6, 0x63, 0x76, - 0x64, 0xc5, 0x91, 0x99, 0x6b, 0xb9, 0x6b, 0x76, 0x0d, 0x4d, 0xb1, 0x8e, 0xe8, 0x37, 0xd2, 0xd2, - 0x1c, 0x49, 0x5d, 0x61, 0x05, 0x59, 0xe5, 0x49, 0xc4, 0x7c, 0xdb, 0xba, 0x21, 0x13, 0x0f, 0xb0, - 0xe5, 0xd8, 0xbc, 0xab, 0x43, 0x5b, 0x37, 0x24, 0x46, 0xe1, 0xd5, 0xf8, 0xb6, 0xc0, 0xbe, 0x15, - 0xa5, 0x9a, 0xdf, 0x84, 0xac, 0xad, 0x2a, 0x86, 0xbc, 0x67, 0x5a, 0x6d, 0xc5, 0xa1, 0xbd, 0xa3, - 0xd0, 0xa3, 0x66, 0xcf, 0xaf, 0x56, 0x15, 0xe3, 0x2e, 0xcd, 0x24, 0x81, 0xed, 0x3d, 0x07, 0x3b, - 0xd0, 0xfd, 0x64, 0x3a, 0x21, 0x26, 0x4b, 0xbf, 0x14, 0x20, 0xc7, 0x4a, 0x19, 0x65, 0x07, 0x7a, - 0x15, 0x92, 0x96, 0x79, 0xc0, 0x3a, 0x50, 0xf6, 0xf6, 0x73, 0x21, 0x22, 0xd6, 0xf1, 0x51, 0x70, - 0xe6, 0xa2, 0xd9, 0xd1, 0x2a, 0x70, 0x0f, 0x4f, 0xa6, 0xdc, 0x89, 0x49, 0xb9, 0x81, 0x71, 0x49, - 0x44, 0xc6, 0x35, 0x98, 0xd9, 0x55, 0x1c, 0x75, 0x9f, 0xb4, 0x0f, 0x2d, 0x24, 0x99, 0xe5, 0x12, - 0xd7, 0x73, 0x52, 0x81, 0x92, 0xdd, 0xa2, 0xdb, 0xa5, 0x3f, 0x75, 0x7b, 0x83, 0x8d, 0x3f, 0xfe, - 0xcd, 0xf4, 0x5f, 0x02, 0xef, 0x14, 0x6e, 0x61, 0xff, 0xaf, 0xb5, 0xd6, 0x8f, 0x05, 0x38, 0x5f, - 0xde, 0xc7, 0xea, 0xe3, 0xb2, 0x69, 0xd8, 0xba, 0xed, 0x60, 0x43, 0x3d, 0x8a, 0xb2, 0xc9, 0x9e, - 0x83, 0xcc, 0x81, 0xee, 0xec, 0xcb, 0x9a, 0xbe, 0xb7, 0x47, 0xbb, 0x74, 0x5a, 0x4a, 0x13, 0xc2, - 0x9a, 0xbe, 0xb7, 0x87, 0xee, 0x40, 0xb2, 0x6d, 0x6a, 0xcc, 0x81, 0x2d, 0xdc, 0x5e, 0x0c, 0x11, - 0x4f, 0x8b, 0x66, 0x77, 0xdb, 0x1b, 0xa6, 0x86, 0x25, 0x9a, 0x19, 0x2d, 0x00, 0xa8, 0x84, 0xda, - 0x31, 0x75, 0xc3, 0xe1, 0x13, 0x59, 0x80, 0xc2, 0x47, 0x89, 0x6f, 0x24, 0xa1, 0x38, 0x58, 0xaf, - 0x28, 0x5b, 0x77, 0x1b, 0x52, 0x6c, 0xa8, 0xe2, 0xed, 0x7b, 0x7b, 0x58, 0xf1, 0x43, 0x4a, 0xb0, - 0xcc, 0x86, 0x34, 0xde, 0x70, 0x5c, 0xce, 0xfc, 0x5f, 0x0b, 0x90, 0x62, 0x09, 0xe8, 0x16, 0xa4, - 0x39, 0x26, 0xd7, 0x68, 0x19, 0x13, 0xab, 0xe7, 0x9e, 0x1d, 0x2f, 0x4e, 0x33, 0x04, 0xbe, 0xf6, - 0xa1, 0xff, 0x28, 0x4d, 0x33, 0x10, 0xae, 0x11, 0x4d, 0xdb, 0x8e, 0x62, 0x39, 0x74, 0xed, 0x83, - 0x68, 0x3a, 0x27, 0xa5, 0x29, 0x61, 0x1d, 0x1f, 0xa1, 0xfb, 0x90, 0xb2, 0x1d, 0xc5, 0xe9, 0xda, - 0x5c, 0xd7, 0x27, 0x2a, 0x6c, 0x9d, 0x72, 0x4a, 0x5c, 0x02, 0xf1, 0x22, 0x34, 0xec, 0x28, 0x7a, - 0x8b, 0x2a, 0x3f, 0x23, 0xf1, 0xb7, 0xd2, 0xb7, 0x04, 0x48, 0xb1, 0xac, 0xe8, 0x3c, 0xcc, 0x31, - 0xdc, 0x5d, 0xdb, 0x5c, 0xab, 0x34, 0x2a, 0xd2, 0x46, 0x6d, 0x73, 0xa5, 0x51, 0x11, 0x63, 0xe8, - 0x1c, 0x20, 0x37, 0xa1, 0xbc, 0xb5, 0x59, 0xaf, 0xd5, 0x1b, 0x95, 0x4d, 0x82, 0xd7, 0x09, 0x8a, - 0xa7, 0xf4, 0x00, 0x35, 0x8e, 0x2e, 0xc3, 0x52, 0x3f, 0x55, 0xae, 0x37, 0x56, 0x1a, 0x75, 0xb9, - 0x52, 0x6f, 0xd4, 0x36, 0x56, 0x1a, 0x95, 0x35, 0x31, 0x31, 0x22, 0x17, 0xf9, 0x88, 0x24, 0x55, - 0xca, 0x0d, 0x31, 0x59, 0x7a, 0x0a, 0x67, 0x25, 0xac, 0x9a, 0xed, 0x4e, 0xd7, 0xc1, 0xa4, 0x94, - 0x76, 0x94, 0x56, 0x7e, 0x1e, 0xa6, 0x35, 0xeb, 0x48, 0xb6, 0xba, 0x06, 0xb7, 0xf1, 0x94, 0x66, - 0x1d, 0x49, 0x5d, 0x83, 0x1b, 0xe3, 0x5f, 0x0a, 0x70, 0xae, 0xff, 0xe3, 0x51, 0x9a, 0xe2, 0x17, - 0x21, 0xab, 0x68, 0x1a, 0xd6, 0x64, 0x0d, 0xb7, 0x1c, 0x85, 0x7b, 0x09, 0xb7, 0x02, 0x92, 0xf8, - 0xba, 0xd5, 0x32, 0x5b, 0xb0, 0x5a, 0xf6, 0xd6, 0xad, 0x36, 0x1e, 0x96, 0xcb, 0xb4, 0x3c, 0x6b, - 0x84, 0xd1, 0x1d, 0x47, 0xa8, 0x2c, 0x4a, 0x29, 0xa9, 0x70, 0x7e, 0x15, 0x37, 0x75, 0x23, 0xb8, - 0x12, 0x15, 0xb9, 0x6b, 0x26, 0x43, 0x71, 0xf0, 0x23, 0x91, 0x3a, 0x68, 0x49, 0x38, 0x5b, 0x31, - 0xb4, 0x8f, 0xa6, 0x12, 0xa4, 0x3f, 0xa8, 0x66, 0xbb, 0xad, 0x3b, 0x6e, 0xdb, 0xb3, 0x37, 0xf4, - 0x19, 0x48, 0x6b, 0x58, 0xd1, 0xbc, 0x15, 0x8c, 0x71, 0x8e, 0x9b, 0xe4, 0x65, 0x47, 0x5f, 0x86, - 0xf3, 0x64, 0x30, 0xb7, 0x0c, 0xa5, 0x25, 0x33, 0x69, 0xb2, 0x63, 0xe9, 0xcd, 0x26, 0xb6, 0xf8, - 0x9a, 0xdf, 0xf5, 0x90, 0x72, 0xd6, 0x38, 0x47, 0x99, 0x32, 0x34, 0x58, 0x7e, 0xe9, 0xac, 0x1e, - 0x46, 0x46, 0x5f, 0xf0, 0x96, 0x88, 0xec, 0x8e, 0x62, 0xd8, 0xc5, 0x29, 0x3a, 0x86, 0x0d, 0x5b, - 0x4a, 0xe4, 0x96, 0xc1, 0xe7, 0x25, 0x42, 0xb1, 0xd1, 0x4d, 0x82, 0x36, 0xde, 0xeb, 0xea, 0x16, - 0x96, 0x6f, 0x75, 0xd4, 0x62, 0x8a, 0xd4, 0x7d, 0xb5, 0xf0, 0xec, 0x78, 0x11, 0x24, 0x46, 0xbe, - 0xb5, 0x5d, 0x26, 0xe8, 0x83, 0x3d, 0x77, 0x54, 0x74, 0x1d, 0x44, 0xc3, 0x94, 0x2d, 0xbc, 0x67, - 0x61, 0x7b, 0x9f, 0x7f, 0x36, 0x4d, 0x35, 0x56, 0x30, 0x4c, 0x89, 0x91, 0x99, 0xe8, 0x73, 0x90, - 0xea, 0x98, 0xba, 0x6d, 0x1a, 0xc5, 0x0c, 0xd3, 0x28, 0x7b, 0x43, 0x6f, 0x81, 0xa8, 0x1b, 0xf2, - 0x5e, 0x4b, 0x6f, 0xee, 0x3b, 0xf2, 0x81, 0xa5, 0x3b, 0xd8, 0x2e, 0xce, 0xd2, 0x82, 0x87, 0x99, - 0x45, 0x9d, 0x2f, 0xc6, 0x6a, 0x6f, 0x93, 0x9c, 0xbc, 0x0a, 0x05, 0xdd, 0xb8, 0x4b, 0xf9, 0x29, - 0xd1, 0xf6, 0x5c, 0x82, 0x69, 0x31, 0x5d, 0xfa, 0x17, 0x01, 0xce, 0xf5, 0x9b, 0x49, 0x94, 0xdd, - 0xf4, 0x3a, 0x88, 0xa6, 0x81, 0xe5, 0xce, 0xbe, 0x62, 0x63, 0xde, 0xac, 0x7c, 0xfe, 0x2a, 0x98, - 0x06, 0xde, 0x26, 0x64, 0xd6, 0x48, 0x68, 0x1b, 0x66, 0x6d, 0x47, 0x69, 0xea, 0x46, 0x53, 0xf6, - 0x96, 0xf1, 0xe9, 0x5a, 0xcc, 0x84, 0xce, 0xbf, 0xc8, 0xb9, 0x3d, 0x7a, 0x8f, 0xd3, 0xf3, 0x0f, - 0x02, 0xcc, 0xae, 0x68, 0x6d, 0xdd, 0xa8, 0x77, 0x5a, 0x7a, 0xa4, 0x2b, 0x05, 0x97, 0x21, 0x63, - 0x13, 0x99, 0xfe, 0x1c, 0xe4, 0xa3, 0xbc, 0x34, 0x4d, 0x21, 0x93, 0xd1, 0x03, 0x98, 0xc1, 0x87, - 0x1d, 0xdd, 0x52, 0x88, 0x8a, 0x19, 0xb0, 0x49, 0x4e, 0x5e, 0xb7, 0x82, 0xcf, 0xeb, 0x83, 0x1b, - 0x5e, 0xb3, 0x47, 0x80, 0x82, 0x15, 0x8b, 0x72, 0x0c, 0x91, 0x61, 0x8e, 0x8a, 0xde, 0x31, 0xec, - 0x88, 0xb5, 0xc6, 0x47, 0xc1, 0x2f, 0xc1, 0x99, 0xde, 0x0f, 0x44, 0x59, 0xfa, 0x77, 0x79, 0x8b, - 0x6f, 0x60, 0xeb, 0x23, 0x02, 0xd7, 0x41, 0xf1, 0x51, 0x96, 0xfc, 0x6b, 0x02, 0x5c, 0xa0, 0xb2, - 0x69, 0xb7, 0xdc, 0xc3, 0x16, 0xdd, 0x21, 0x8a, 0xd2, 0x68, 0x2f, 0x41, 0x8a, 0x61, 0x65, 0x6a, - 0xb1, 0x53, 0xab, 0x59, 0xe2, 0x5e, 0xd5, 0x1d, 0xd3, 0x22, 0xee, 0x15, 0x4f, 0xe2, 0xf5, 0x54, - 0x60, 0x3e, 0xac, 0x2c, 0x11, 0x2f, 0x26, 0xcc, 0x4a, 0xb8, 0xd3, 0xd2, 0x55, 0x6a, 0xe2, 0xe5, - 0x7d, 0xe2, 0xde, 0xa1, 0x0a, 0x64, 0x55, 0xfa, 0x24, 0x3b, 0x47, 0x1d, 0x4c, 0xe5, 0x17, 0x6e, - 0x5f, 0x0e, 0x95, 0x4f, 0x59, 0x19, 0x5b, 0xe3, 0xa8, 0x83, 0x89, 0x6f, 0xec, 0x3e, 0x13, 0x75, - 0x05, 0xaa, 0x9a, 0x1d, 0x25, 0x81, 0xf6, 0x2f, 0x9a, 0xd7, 0xf5, 0x52, 0x7b, 0x34, 0xf1, 0xbd, - 0x04, 0x57, 0x05, 0xfb, 0x12, 0x67, 0x8a, 0xd4, 0xa9, 0x7a, 0x07, 0xce, 0x69, 0xb8, 0x63, 0x61, - 0x55, 0x71, 0xb0, 0x26, 0x07, 0xab, 0x1f, 0x3f, 0x41, 0xf5, 0xcf, 0xf8, 0x32, 0x7c, 0x2a, 0x7a, - 0x04, 0x28, 0x20, 0x9b, 0xd5, 0xcc, 0x85, 0x5a, 0x27, 0x51, 0xca, 0xac, 0x2f, 0x85, 0xd1, 0x6d, - 0x54, 0x86, 0x34, 0x3e, 0xec, 0xc8, 0x74, 0x9b, 0x34, 0x79, 0xc2, 0x6d, 0xd2, 0x69, 0x7c, 0xd8, - 0x21, 0x44, 0xb4, 0x43, 0x66, 0x3a, 0xd7, 0x01, 0xa0, 0xc5, 0x76, 0xa7, 0xe8, 0x31, 0xa5, 0x63, - 0x75, 0xe4, 0xe2, 0x66, 0xbc, 0xb9, 0x9f, 0x89, 0xe0, 0x6d, 0xf7, 0xbe, 0x00, 0xcf, 0x85, 0xb6, - 0x5d, 0x94, 0x93, 0x9d, 0xbb, 0x53, 0x1c, 0x3f, 0xcd, 0x4e, 0x71, 0xe9, 0xcf, 0xdc, 0x5e, 0x2f, - 0xe1, 0x96, 0x49, 0xd4, 0xfb, 0x11, 0xac, 0xac, 0x4d, 0xbb, 0xcd, 0x1e, 0x3f, 0x71, 0xb3, 0xbb, - 0xac, 0x7d, 0xc3, 0x42, 0x5f, 0x61, 0xa3, 0x1c, 0x16, 0x7e, 0x57, 0x80, 0xb9, 0x2a, 0x56, 0x2c, - 0x67, 0x17, 0x2b, 0x4e, 0xe3, 0x30, 0x52, 0x07, 0xf6, 0x55, 0x48, 0x18, 0xe6, 0xc1, 0x49, 0x16, - 0x17, 0x49, 0x7e, 0x7f, 0xda, 0xea, 0x2d, 0x57, 0x94, 0xb5, 0xfe, 0xdb, 0x38, 0x64, 0xee, 0x95, - 0xa3, 0xac, 0xeb, 0x67, 0xf9, 0x12, 0x34, 0xeb, 0xea, 0x61, 0x66, 0xe9, 0x7d, 0x6f, 0xf9, 0x5e, - 0x79, 0x1d, 0x1f, 0xb9, 0x66, 0x49, 0xb8, 0xd0, 0x0a, 0x64, 0x9c, 0x7d, 0xe2, 0xa7, 0x9a, 0x2d, - 0xed, 0x24, 0x3e, 0x8b, 0xcf, 0x35, 0xff, 0x18, 0xa6, 0xa8, 0x5c, 0x37, 0x88, 0x41, 0x08, 0x09, - 0x62, 0x20, 0x9f, 0xf1, 0xdc, 0xbe, 0xf8, 0x49, 0x3e, 0xe3, 0x12, 0x58, 0xe3, 0x78, 0xbe, 0xd1, - 0x94, 0x98, 0x2a, 0xbd, 0x05, 0x40, 0xaa, 0x16, 0x65, 0xf3, 0x7c, 0x2f, 0x01, 0x85, 0xed, 0xae, - 0xbd, 0x1f, 0xb1, 0x3d, 0x96, 0x01, 0x3a, 0x5d, 0x7b, 0x1f, 0x5b, 0xb2, 0x73, 0x68, 0xf0, 0xfa, - 0x8f, 0x09, 0x8f, 0x70, 0x15, 0xc0, 0xf8, 0x1a, 0x87, 0x06, 0xda, 0xe2, 0x42, 0xb0, 0xec, 0xc7, - 0x58, 0xdc, 0x98, 0x00, 0x12, 0x37, 0x0e, 0x8d, 0x0d, 0xec, 0x61, 0x61, 0x26, 0x10, 0x13, 0x81, - 0x9f, 0x85, 0x69, 0xf2, 0x22, 0x3b, 0xe6, 0x49, 0x5a, 0x3e, 0x45, 0x78, 0x1a, 0x26, 0x7a, 0x03, - 0x32, 0x8c, 0x9b, 0xcc, 0x5f, 0x29, 0x3a, 0x7f, 0x85, 0x55, 0x89, 0x6b, 0x93, 0xce, 0x5c, 0x69, - 0xca, 0x4a, 0x66, 0xab, 0x33, 0x30, 0xb5, 0x67, 0x5a, 0x2a, 0xa6, 0x41, 0x15, 0x69, 0x89, 0xbd, - 0xa0, 0x1b, 0x30, 0xab, 0x1b, 0x6a, 0xab, 0x6b, 0xeb, 0x4f, 0xb0, 0xec, 0x16, 0x8d, 0x01, 0xa6, - 0x19, 0x2f, 0x81, 0x0a, 0x34, 0x83, 0x86, 0x70, 0x3f, 0x99, 0x4e, 0x8b, 0x99, 0xd2, 0xb7, 0x04, - 0x98, 0xf1, 0xda, 0x2e, 0xca, 0x81, 0xbf, 0xdc, 0xa3, 0xf8, 0x93, 0xb7, 0x1e, 0x51, 0x76, 0xe9, - 0xef, 0xa9, 0x17, 0xa4, 0x9a, 0x4f, 0x68, 0x63, 0x46, 0x69, 0x5c, 0xab, 0x2c, 0xe8, 0x26, 0x7e, - 0x4a, 0x83, 0xa0, 0x61, 0x38, 0xb7, 0xe0, 0x8c, 0xde, 0x26, 0x33, 0x83, 0xee, 0xb4, 0x8e, 0x38, - 0x92, 0x73, 0xb0, 0xbb, 0x2f, 0x3c, 0xe7, 0xa7, 0x95, 0xdd, 0x24, 0x3e, 0x58, 0xb2, 0x9d, 0x22, - 0xbf, 0x5a, 0x51, 0xea, 0xbd, 0x06, 0x79, 0x8b, 0x89, 0x26, 0x1e, 0xcd, 0x09, 0x55, 0x9f, 0xf3, - 0x58, 0x89, 0xf6, 0xbf, 0x13, 0x87, 0x99, 0xb7, 0xba, 0xd8, 0x3a, 0xfa, 0x18, 0xea, 0xfe, 0x2a, - 0xcc, 0x1c, 0x28, 0xba, 0x23, 0xef, 0x99, 0x96, 0xdc, 0xed, 0x68, 0x8a, 0xe3, 0x86, 0x87, 0xe4, - 0x09, 0xf9, 0xae, 0x69, 0xed, 0x50, 0x22, 0xc2, 0x80, 0x1e, 0x1b, 0xe6, 0x81, 0x21, 0x13, 0x32, - 0x05, 0xd2, 0x87, 0x06, 0x5f, 0x04, 0x5f, 0xfd, 0xf4, 0x3f, 0x1e, 0x2f, 0xde, 0x99, 0x28, 0xe0, - 0x8b, 0xc6, 0xcc, 0x75, 0xbb, 0xba, 0xb6, 0xbc, 0xb3, 0x53, 0x5b, 0x93, 0x44, 0x2a, 0xf2, 0x6d, - 0x26, 0xb1, 0x71, 0x68, 0xb8, 0x0e, 0xc0, 0x87, 0x02, 0x88, 0xbe, 0xc2, 0xa2, 0x6c, 0xd5, 0x0a, - 0x64, 0xdf, 0xeb, 0x62, 0x4b, 0x3f, 0x45, 0x9b, 0x02, 0x67, 0x24, 0x83, 0xd7, 0x3b, 0x90, 0xeb, - 0xd1, 0x43, 0xe2, 0x57, 0xd3, 0x43, 0xf6, 0xc0, 0x57, 0x41, 0xe9, 0x87, 0x02, 0x20, 0x5a, 0xf9, - 0x1a, 0xdb, 0x7f, 0xf8, 0x98, 0x19, 0xcc, 0x75, 0x10, 0x69, 0x08, 0xa6, 0xac, 0xef, 0xc9, 0x6d, - 0xdd, 0xb6, 0x75, 0xa3, 0xc9, 0x2d, 0xa6, 0x40, 0xe9, 0xb5, 0xbd, 0x0d, 0x46, 0xe5, 0x6d, 0xf9, - 0x6b, 0x30, 0xd7, 0x53, 0x9b, 0x28, 0x5b, 0xf3, 0x22, 0xe4, 0xf6, 0xcc, 0xae, 0xa1, 0xc9, 0x6c, - 0x21, 0x8d, 0x2f, 0x18, 0x66, 0x29, 0x8d, 0x7d, 0xaf, 0xf4, 0xd5, 0x38, 0x9c, 0x91, 0xb0, 0x6d, - 0xb6, 0x9e, 0xe0, 0xe8, 0xf5, 0xb9, 0x05, 0x7c, 0x93, 0x48, 0xfe, 0x55, 0xd4, 0x9a, 0x61, 0x32, - 0xd8, 0xa4, 0xd8, 0xbb, 0xaf, 0x70, 0x79, 0xb4, 0x65, 0x0e, 0xee, 0x24, 0xf0, 0x75, 0xbe, 0x64, - 0x70, 0x9d, 0x8f, 0x37, 0xc4, 0xff, 0x83, 0xb3, 0x7d, 0x8a, 0x88, 0xd2, 0x77, 0xf9, 0x49, 0x1c, - 0x2e, 0xf4, 0x8a, 0x8f, 0x1a, 0x61, 0xfc, 0xef, 0x50, 0x36, 0xaa, 0x42, 0xbe, 0xad, 0x1b, 0xa7, - 0x5b, 0x67, 0xcc, 0xb5, 0x75, 0xa3, 0xd1, 0xeb, 0x73, 0x12, 0x30, 0x14, 0xa6, 0xd7, 0x28, 0xdb, - 0xee, 0x1b, 0x02, 0xe4, 0xa2, 0x5e, 0xc9, 0x3a, 0x5d, 0x4c, 0x18, 0xaf, 0x73, 0x03, 0xf2, 0x1f, - 0xc1, 0xd2, 0xd7, 0x9f, 0x08, 0x80, 0x1a, 0x56, 0xd7, 0x20, 0x90, 0xf2, 0x81, 0xd9, 0x8c, 0xb2, - 0xb2, 0x67, 0x60, 0x4a, 0x37, 0x34, 0x7c, 0x48, 0x2b, 0x9b, 0x94, 0xd8, 0x4b, 0xcf, 0xae, 0x63, - 0x62, 0xa2, 0x5d, 0x47, 0x3f, 0xb4, 0xa4, 0xa7, 0xa0, 0x51, 0x6a, 0xe1, 0x3b, 0x71, 0x98, 0xe3, - 0xd5, 0x89, 0x7c, 0xe9, 0xef, 0x54, 0x01, 0xe9, 0xe8, 0x73, 0x00, 0x1d, 0x0b, 0x3f, 0x91, 0x19, - 0x6b, 0x62, 0x22, 0xd6, 0x0c, 0xe1, 0xa0, 0x04, 0xf4, 0x45, 0x98, 0x21, 0x1d, 0xae, 0x63, 0x99, - 0x1d, 0xd3, 0x26, 0xf3, 0xba, 0x3d, 0x19, 0xa0, 0x98, 0x7d, 0x76, 0xbc, 0x98, 0xdf, 0xd0, 0x8d, - 0x6d, 0xce, 0xd8, 0xa8, 0x4b, 0xa4, 0xe7, 0x7a, 0xaf, 0xae, 0x33, 0xf2, 0x63, 0x01, 0xce, 0x7c, - 0x64, 0x8b, 0xa5, 0xff, 0x13, 0x1a, 0xf3, 0xe6, 0x03, 0x91, 0xbe, 0xd6, 0x8c, 0x3d, 0x33, 0xfa, - 0x25, 0xec, 0x6f, 0x08, 0x30, 0x1b, 0x10, 0x1f, 0xe5, 0xac, 0x7f, 0xba, 0x63, 0x0f, 0x5f, 0x22, - 0x7e, 0x40, 0xd0, 0xec, 0xa3, 0xec, 0x54, 0xff, 0x2e, 0xc0, 0xb9, 0x32, 0xdb, 0x8f, 0x76, 0x43, - 0x2c, 0xa2, 0xb4, 0x92, 0x22, 0x4c, 0x3f, 0xc1, 0x96, 0xad, 0x9b, 0x6c, 0xde, 0xcb, 0x4b, 0xee, - 0x2b, 0x9a, 0x87, 0xb4, 0x6d, 0x28, 0x1d, 0x7b, 0xdf, 0x74, 0xf7, 0xbe, 0xbc, 0x77, 0x2f, 0x1c, - 0x64, 0xea, 0xf4, 0xe1, 0x20, 0xa9, 0xf0, 0x70, 0x10, 0xbe, 0x3d, 0xf4, 0x03, 0x01, 0xce, 0x0f, - 0xd4, 0x3a, 0xca, 0x96, 0xfe, 0x0a, 0x64, 0x55, 0x2e, 0x98, 0x8c, 0xa1, 0x6c, 0x07, 0xac, 0x46, - 0xb2, 0x9d, 0xd2, 0xd3, 0x7e, 0x76, 0xbc, 0x08, 0x6e, 0x51, 0x6b, 0x6b, 0xbc, 0x62, 0xe4, 0x59, - 0x2b, 0xfd, 0x27, 0x40, 0xbe, 0x72, 0xd8, 0x31, 0x2d, 0xa7, 0xce, 0x1c, 0x09, 0xb4, 0x06, 0xe9, - 0x8e, 0x65, 0x3e, 0xd1, 0xdd, 0x4a, 0x14, 0x42, 0xb7, 0x89, 0x7b, 0x78, 0xb6, 0x79, 0x7e, 0xc9, - 0xe3, 0x44, 0x12, 0x64, 0x1e, 0x98, 0xaa, 0xd2, 0xba, 0xab, 0xb7, 0x5c, 0x8b, 0x5d, 0x1e, 0x27, - 0x66, 0xd9, 0xe3, 0xd8, 0x56, 0x9c, 0x7d, 0xb7, 0x03, 0x7b, 0x44, 0x74, 0x0f, 0xd2, 0x55, 0xc7, - 0xe9, 0x90, 0x44, 0xde, 0xfb, 0xaf, 0x8c, 0x15, 0x49, 0x18, 0xb8, 0x24, 0x8f, 0x19, 0x49, 0x30, - 0x7b, 0xcf, 0x34, 0x9b, 0x2d, 0x5c, 0x6e, 0x99, 0x5d, 0xad, 0x6c, 0x1a, 0x7b, 0x7a, 0x93, 0x8f, - 0x9e, 0x97, 0xc7, 0x4a, 0xbc, 0x57, 0xae, 0x4b, 0x83, 0xec, 0xe8, 0xf3, 0x90, 0xae, 0xdf, 0xe1, - 0xa2, 0x98, 0xef, 0x73, 0x69, 0xac, 0xa8, 0xfa, 0x1d, 0xc9, 0x63, 0x42, 0x55, 0xc8, 0xae, 0x3c, - 0xed, 0x5a, 0x98, 0xcb, 0x48, 0x51, 0x19, 0x57, 0xc7, 0xca, 0xa0, 0x3c, 0x52, 0x90, 0x15, 0xbd, - 0x05, 0x85, 0xb7, 0x4d, 0xeb, 0x71, 0xcb, 0x54, 0xdc, 0xba, 0x4d, 0x53, 0x61, 0x2f, 0x8e, 0x15, - 0xe6, 0xb2, 0x49, 0x7d, 0x02, 0xe6, 0xbf, 0x08, 0xf9, 0x9e, 0xc6, 0x41, 0x08, 0x92, 0x1d, 0xd2, - 0x0e, 0x02, 0x0d, 0xde, 0xa1, 0xcf, 0xe8, 0x15, 0x98, 0x36, 0x4c, 0x0d, 0xbb, 0x36, 0x9b, 0x5f, - 0x3d, 0xf3, 0xec, 0x78, 0x31, 0xb5, 0x69, 0x6a, 0x6c, 0xda, 0xe7, 0x4f, 0x52, 0x8a, 0x64, 0x72, - 0x27, 0xfd, 0xf9, 0xab, 0x90, 0x24, 0xed, 0x42, 0x3a, 0xfb, 0xae, 0x62, 0xe3, 0x1d, 0x4b, 0xe7, - 0x32, 0xdd, 0x57, 0x9e, 0xef, 0xa7, 0x02, 0xc4, 0xeb, 0x77, 0x88, 0xff, 0xb9, 0xdb, 0x55, 0x1f, - 0x63, 0x87, 0xe7, 0xe2, 0x6f, 0xd4, 0x2f, 0xb5, 0xf0, 0x9e, 0xce, 0x7c, 0x91, 0x8c, 0xc4, 0xdf, - 0xd0, 0x0b, 0x00, 0x8a, 0xaa, 0x62, 0xdb, 0x96, 0xdd, 0xb3, 0x5e, 0x19, 0x29, 0xc3, 0x28, 0xeb, - 0xf8, 0x88, 0xb0, 0xd9, 0x58, 0xb5, 0xb0, 0xe3, 0x46, 0x21, 0xb1, 0x37, 0xc2, 0xe6, 0xe0, 0x76, - 0x47, 0x76, 0xcc, 0xc7, 0xd8, 0xa0, 0xed, 0x99, 0x91, 0x32, 0x84, 0xd2, 0x20, 0x04, 0x32, 0xfe, - 0x60, 0x43, 0xf3, 0x07, 0x8b, 0x8c, 0xe4, 0xbd, 0x13, 0x91, 0x16, 0x6e, 0xea, 0xfc, 0xf0, 0x52, - 0x46, 0xe2, 0x6f, 0x44, 0x63, 0x4a, 0xd7, 0xd9, 0xa7, 0xc1, 0x0a, 0x19, 0x89, 0x3e, 0xf3, 0xaa, - 0x7d, 0x53, 0x80, 0xc4, 0xbd, 0x72, 0xfd, 0xc4, 0x75, 0x73, 0x25, 0x26, 0x7c, 0x89, 0x34, 0x64, - 0x4f, 0x6f, 0xb5, 0x08, 0x44, 0xef, 0x58, 0xe6, 0x57, 0xb0, 0xea, 0xd6, 0xac, 0xc0, 0xc9, 0xdb, - 0x8c, 0x8a, 0x96, 0x20, 0xab, 0x5a, 0x58, 0xc3, 0x86, 0xa3, 0x2b, 0x2d, 0x9b, 0x57, 0x31, 0x48, - 0xe2, 0x85, 0xfb, 0xaa, 0x00, 0x53, 0xd4, 0xb8, 0xd0, 0xf3, 0x90, 0x51, 0x4d, 0xc3, 0x51, 0x74, - 0x83, 0x8f, 0x0c, 0x19, 0xc9, 0x27, 0x0c, 0x2d, 0xe4, 0x45, 0xc8, 0x29, 0xaa, 0x6a, 0x76, 0x0d, - 0x47, 0x36, 0x94, 0x36, 0xe6, 0x85, 0xcd, 0x72, 0xda, 0xa6, 0xd2, 0xc6, 0x68, 0x11, 0xdc, 0x57, - 0xef, 0xc4, 0x5d, 0x46, 0x02, 0x4e, 0x5a, 0xc7, 0x47, 0xbc, 0x24, 0x3f, 0x10, 0x20, 0xed, 0x9a, - 0x25, 0x29, 0x4c, 0x13, 0x1b, 0xd8, 0x52, 0x1c, 0xd3, 0x2b, 0x8c, 0x47, 0xe8, 0x9f, 0x39, 0x32, - 0xfe, 0xcc, 0x71, 0x06, 0xa6, 0x1c, 0x65, 0xb7, 0xe5, 0x96, 0x83, 0xbd, 0xd0, 0xa5, 0xd1, 0x96, - 0xd2, 0x64, 0x2b, 0x3b, 0x19, 0x89, 0xbd, 0x90, 0x2a, 0xf1, 0x18, 0x51, 0xa6, 0x1d, 0xfe, 0x46, - 0xca, 0xcb, 0xc2, 0x22, 0x77, 0x71, 0x53, 0x37, 0xa8, 0x01, 0x24, 0x24, 0xa0, 0x24, 0x1a, 0x81, - 0x84, 0x9e, 0x83, 0x0c, 0xcb, 0x80, 0x0d, 0x8d, 0x5a, 0x41, 0x42, 0x4a, 0x53, 0x42, 0xc5, 0x3d, - 0x62, 0xc4, 0xdd, 0x85, 0x3f, 0x17, 0x60, 0x96, 0xc5, 0x95, 0xb0, 0x78, 0xca, 0xe8, 0xe6, 0xce, - 0xd7, 0x21, 0xa3, 0x29, 0x8e, 0xc2, 0x4e, 0xf8, 0xc5, 0x47, 0x9e, 0xf0, 0x73, 0x87, 0x47, 0x92, - 0x9f, 0x9e, 0xf2, 0x43, 0x90, 0x24, 0xcf, 0xec, 0x64, 0xa4, 0x44, 0x9f, 0xfd, 0x1d, 0xfa, 0x60, - 0x71, 0xa3, 0xf4, 0x25, 0x7e, 0x38, 0xe5, 0x4e, 0x44, 0x51, 0xaa, 0xe1, 0x0b, 0x30, 0xcd, 0x01, - 0x32, 0x57, 0xc2, 0xd2, 0xb8, 0x31, 0xd0, 0xdd, 0x9b, 0xe3, 0x6c, 0x68, 0x15, 0x80, 0x05, 0x44, - 0xd2, 0x08, 0x93, 0xc4, 0x09, 0xb6, 0x51, 0x28, 0x1b, 0xa1, 0xa2, 0x4d, 0xc8, 0xb6, 0x9f, 0xa8, - 0xaa, 0xbc, 0xa7, 0xb7, 0x1c, 0x1e, 0x7c, 0x15, 0x1e, 0x71, 0xbc, 0xf1, 0xb0, 0x5c, 0xbe, 0x4b, - 0x33, 0xb1, 0x18, 0x28, 0xff, 0x5d, 0x02, 0x22, 0x81, 0x3d, 0xa3, 0x97, 0x81, 0x9f, 0xc7, 0x90, - 0x6d, 0xf7, 0x74, 0xd5, 0x6a, 0xfe, 0xd9, 0xf1, 0x62, 0x46, 0xa2, 0xd4, 0x7a, 0xbd, 0x21, 0x65, - 0x58, 0x86, 0xba, 0xed, 0xa0, 0x4b, 0x90, 0x37, 0xdb, 0xba, 0x23, 0xbb, 0xb3, 0x3e, 0x77, 0x6f, - 0x72, 0x84, 0xe8, 0x7a, 0x05, 0xa8, 0x01, 0xd7, 0xb0, 0x41, 0xfa, 0x02, 0xad, 0x27, 0x8b, 0xb4, - 0x97, 0x75, 0x87, 0xf5, 0x27, 0xd9, 0xec, 0x38, 0x7a, 0x5b, 0x7f, 0x4a, 0xb7, 0x30, 0xf9, 0xf6, - 0xc1, 0x25, 0x96, 0x9d, 0xd4, 0x8f, 0xc6, 0xde, 0xd7, 0x78, 0xde, 0xad, 0x40, 0x56, 0xf4, 0x55, - 0x81, 0x86, 0xf0, 0x13, 0x45, 0xca, 0xbb, 0x47, 0x72, 0x8b, 0x4c, 0x21, 0xba, 0x73, 0x24, 0x3f, - 0x7e, 0x52, 0x4c, 0xd3, 0xad, 0xb3, 0xcf, 0x0c, 0x6d, 0x0e, 0x77, 0xfb, 0xcc, 0x6d, 0x96, 0xa3, - 0x07, 0x9c, 0x79, 0xfd, 0x49, 0xc5, 0x70, 0xac, 0xa3, 0xd5, 0xf3, 0xcf, 0x8e, 0x17, 0xe7, 0x06, - 0x53, 0x1f, 0xd2, 0x63, 0x01, 0xfd, 0x2c, 0xf3, 0xfb, 0x50, 0x1c, 0x26, 0x09, 0x89, 0xfe, 0x1e, - 0x5a, 0x86, 0x6d, 0x9d, 0x7d, 0xaa, 0x17, 0xc5, 0x8f, 0x35, 0x1a, 0x17, 0xc7, 0xc7, 0x5f, 0x73, - 0x7b, 0xf6, 0xd7, 0x05, 0xc8, 0xaf, 0x76, 0x5b, 0x8f, 0xb7, 0x3a, 0xf5, 0x6e, 0xbb, 0xad, 0x58, - 0x47, 0x64, 0x50, 0x60, 0x3d, 0x52, 0x7f, 0xca, 0x42, 0x2f, 0x12, 0xbc, 0xcb, 0xe9, 0x4f, 0x31, - 0xe9, 0x72, 0x3c, 0xc8, 0x9b, 0xd0, 0x59, 0x04, 0xf7, 0x25, 0xc8, 0x53, 0x40, 0x2d, 0x63, 0xc3, - 0xb1, 0x74, 0xcc, 0xd6, 0x6b, 0x12, 0x52, 0x8e, 0x12, 0x2b, 0x8c, 0x86, 0xae, 0x40, 0xc1, 0x3e, - 0xb2, 0x1d, 0xdc, 0x96, 0xd9, 0x59, 0x6c, 0x86, 0x02, 0x13, 0x52, 0x9e, 0x51, 0x25, 0x46, 0x2c, - 0xfd, 0x2c, 0x01, 0x05, 0x57, 0xaf, 0x51, 0xba, 0xaa, 0xab, 0x30, 0xb5, 0xa7, 0xb7, 0xb0, 0xbb, - 0xfb, 0x7d, 0x75, 0x44, 0x73, 0xf2, 0x30, 0x60, 0xe2, 0x41, 0xb8, 0x10, 0x85, 0xb2, 0x46, 0xd1, - 0xc3, 0xe6, 0x7f, 0x23, 0x0e, 0x49, 0xea, 0x23, 0xde, 0x82, 0x24, 0x1d, 0xf2, 0x84, 0x49, 0x86, - 0x3c, 0x9a, 0xd5, 0x73, 0x65, 0xe2, 0x01, 0x57, 0x86, 0xf8, 0x05, 0xfb, 0xca, 0xab, 0xb7, 0x6e, - 0xd3, 0xde, 0x95, 0x93, 0xf8, 0x1b, 0x5a, 0xa5, 0x61, 0x19, 0xa6, 0xe5, 0x60, 0x8d, 0x7b, 0x68, - 0x61, 0xb6, 0xd1, 0xd3, 0xf0, 0xee, 0xf0, 0xea, 0xf2, 0xa1, 0x0b, 0x90, 0x20, 0xdd, 0x76, 0x9a, - 0x6d, 0xd9, 0x3e, 0x3b, 0x5e, 0x4c, 0x90, 0x0e, 0x4b, 0x68, 0xe8, 0x26, 0x64, 0x7b, 0xfb, 0x88, - 0x70, 0x3d, 0xc3, 0x46, 0x82, 0x80, 0x7d, 0x43, 0xcb, 0xb3, 0x5f, 0x86, 0x48, 0xee, 0x27, 0xd3, - 0x49, 0x71, 0xaa, 0xf4, 0xdd, 0x24, 0xe4, 0x6b, 0xed, 0xa8, 0x47, 0xd0, 0x95, 0xde, 0x16, 0x0e, - 0xf3, 0xb8, 0x7b, 0x3e, 0x1a, 0xd2, 0xc0, 0x3d, 0x73, 0x51, 0xe2, 0x64, 0x73, 0x51, 0x8d, 0x78, - 0x53, 0xfc, 0xbc, 0x39, 0xf9, 0xfe, 0x4b, 0x63, 0xbf, 0xdf, 0x20, 0xc3, 0x92, 0x44, 0x78, 0xfc, - 0xc0, 0x78, 0xba, 0xed, 0xfe, 0x26, 0x75, 0xda, 0x98, 0x95, 0xa5, 0x26, 0xb7, 0xb2, 0x69, 0x6c, - 0x68, 0xd4, 0xc6, 0x0e, 0xb9, 0x89, 0xbd, 0x06, 0x09, 0x4d, 0x1f, 0xa5, 0xd2, 0xb0, 0xf9, 0x84, - 0xb0, 0x8c, 0xb1, 0xb4, 0x64, 0xd0, 0xd2, 0x82, 0x88, 0x73, 0x7e, 0x0b, 0xc0, 0xaf, 0x15, 0x5a, - 0x82, 0x94, 0xd9, 0xd2, 0xdc, 0x98, 0xfe, 0xfc, 0x6a, 0xe6, 0xd9, 0xf1, 0xe2, 0xd4, 0x56, 0x4b, - 0xab, 0xad, 0x49, 0x53, 0x66, 0x4b, 0xab, 0x69, 0xf4, 0x98, 0x3e, 0x3e, 0x90, 0xbd, 0xc8, 0x99, - 0x9c, 0x34, 0x6d, 0xe0, 0x83, 0x35, 0x6c, 0xab, 0x7d, 0x3b, 0xfa, 0xc4, 0x6c, 0xfe, 0x50, 0x80, - 0x82, 0xab, 0xc1, 0x68, 0x87, 0x86, 0xb4, 0xde, 0xe6, 0x5d, 0x25, 0x71, 0xb2, 0xae, 0xe2, 0xf2, - 0xf1, 0xc3, 0x84, 0x5f, 0x13, 0x78, 0xd4, 0x64, 0x5d, 0x55, 0x1c, 0x32, 0x17, 0x46, 0x68, 0xde, - 0x2f, 0x82, 0x68, 0x29, 0x86, 0x66, 0xb6, 0xf5, 0xa7, 0x98, 0x2d, 0x2c, 0xd9, 0x7c, 0x3f, 0x65, - 0xc6, 0xa3, 0xd3, 0x95, 0x13, 0x77, 0x5d, 0xec, 0xdf, 0x04, 0x1e, 0x61, 0xe9, 0x15, 0x26, 0x4a, - 0xa5, 0xad, 0x43, 0xca, 0x62, 0x71, 0x5a, 0xac, 0xbb, 0xbd, 0x12, 0x22, 0x24, 0xec, 0xeb, 0x2c, - 0x0c, 0xca, 0x33, 0x78, 0x2a, 0x62, 0xfe, 0x0b, 0x30, 0x45, 0xc9, 0xa7, 0x18, 0x14, 0xb9, 0xe6, - 0xff, 0x38, 0x0e, 0xb3, 0x2b, 0x9a, 0x56, 0xaf, 0x73, 0xf3, 0x8b, 0x4e, 0xef, 0xae, 0x8f, 0x19, - 0xf7, 0x7d, 0x4c, 0xf4, 0x0a, 0x20, 0x4d, 0xb7, 0xd9, 0x21, 0x72, 0x7b, 0x5f, 0xd1, 0xcc, 0x03, - 0x7f, 0x97, 0x6d, 0xd6, 0x4d, 0xa9, 0xbb, 0x09, 0xe8, 0x1d, 0xa0, 0x3e, 0x91, 0x6c, 0x3b, 0x8a, - 0xb7, 0xf8, 0xf9, 0xf2, 0x49, 0x8e, 0x2b, 0x30, 0x9f, 0xc9, 0x7b, 0x95, 0x32, 0x44, 0x1c, 0x7d, - 0x44, 0xd7, 0x41, 0xd4, 0x89, 0x0e, 0x1d, 0x59, 0xb1, 0xdd, 0x18, 0x71, 0x76, 0x8a, 0xbd, 0xc0, - 0xe8, 0x2b, 0x76, 0x30, 0xf4, 0x9b, 0x85, 0xae, 0xfa, 0x7a, 0x8a, 0xd2, 0x31, 0xee, 0x40, 0x81, - 0x87, 0xb5, 0x47, 0xbc, 0x74, 0x4f, 0xab, 0xc5, 0x8d, 0x9d, 0xbd, 0xf8, 0x27, 0xcb, 0xbd, 0x2f, - 0x46, 0x59, 0x93, 0x2e, 0xcc, 0xb9, 0x72, 0xa3, 0xde, 0x25, 0x1b, 0x55, 0x1d, 0xba, 0x04, 0x1a, - 0xfc, 0x6c, 0x94, 0x75, 0xfa, 0x67, 0x01, 0x0a, 0xf5, 0xee, 0x2e, 0xbb, 0x5e, 0x24, 0xba, 0xfa, - 0x54, 0x20, 0xd3, 0xc2, 0x7b, 0x8e, 0x7c, 0xaa, 0xe0, 0xc7, 0x34, 0x61, 0xa5, 0x01, 0xa0, 0x2b, - 0x00, 0x16, 0x3d, 0xe6, 0x40, 0xe5, 0x24, 0x26, 0x95, 0x23, 0x65, 0x28, 0x97, 0x3f, 0x61, 0x94, - 0xbe, 0x1b, 0x87, 0x19, 0xaf, 0x9a, 0x51, 0x0e, 0x78, 0xff, 0xbf, 0xa7, 0x13, 0x27, 0x4e, 0xd1, - 0x89, 0x67, 0x89, 0xcc, 0xa1, 0x1d, 0x79, 0x19, 0xe6, 0xe8, 0xa8, 0x2e, 0x2b, 0x9d, 0x4e, 0x4b, - 0xc7, 0x9a, 0xcc, 0x36, 0xac, 0x92, 0x74, 0xc3, 0x6a, 0x96, 0x26, 0xad, 0xb0, 0x94, 0x1a, 0xdd, - 0xbc, 0xba, 0x0b, 0xb9, 0x3d, 0x0b, 0xe3, 0xa7, 0x58, 0xa6, 0xce, 0xe5, 0x49, 0xb6, 0x31, 0xb3, - 0x8c, 0xb1, 0x4e, 0xf8, 0xf8, 0xf8, 0xf9, 0x2e, 0xcc, 0x52, 0xd5, 0x46, 0x7d, 0x54, 0x8c, 0xb7, - 0xca, 0xbf, 0x0a, 0x80, 0x82, 0xf2, 0x3f, 0xba, 0x86, 0x89, 0x47, 0xde, 0x30, 0x2f, 0x03, 0x62, - 0x91, 0x25, 0xb6, 0xdc, 0xc1, 0x96, 0x6c, 0x63, 0xd5, 0xe4, 0x77, 0x62, 0x08, 0x92, 0xc8, 0x53, - 0xb6, 0xb1, 0x55, 0xa7, 0xf4, 0xd2, 0x7f, 0x5c, 0x80, 0x1c, 0xd7, 0xc9, 0x8e, 0x41, 0x90, 0xe5, - 0x2d, 0x48, 0x34, 0xf9, 0x42, 0x59, 0x36, 0x14, 0x4a, 0xfb, 0xf7, 0xf2, 0x54, 0x63, 0x12, 0xc9, - 0x4b, 0x58, 0x3a, 0x5d, 0x27, 0x24, 0x12, 0xd2, 0x0f, 0x9b, 0x0b, 0xb2, 0x74, 0xba, 0x0e, 0xaa, - 0xc3, 0x8c, 0xea, 0xdf, 0x4b, 0x22, 0x13, 0xf6, 0xc4, 0xd0, 0x93, 0x53, 0xa1, 0xb7, 0xbb, 0x54, - 0x63, 0x52, 0x41, 0xed, 0x49, 0x40, 0xe5, 0xe0, 0x45, 0x18, 0xc9, 0xa1, 0x4b, 0xc5, 0xfd, 0x97, - 0x70, 0x54, 0x63, 0x81, 0xfb, 0x32, 0xd0, 0xeb, 0x90, 0xd2, 0xe8, 0x05, 0x0b, 0xdc, 0x42, 0xc3, - 0x8c, 0xa8, 0xe7, 0x4e, 0x8b, 0x6a, 0x4c, 0xe2, 0x1c, 0xe8, 0x3e, 0xe4, 0xd8, 0x13, 0x3b, 0x56, - 0xcf, 0x9d, 0xe1, 0x2b, 0xc3, 0x25, 0x04, 0x46, 0xeb, 0x6a, 0x4c, 0xca, 0x6a, 0x3e, 0x15, 0x7d, - 0x12, 0x92, 0xb6, 0xaa, 0x18, 0x7c, 0x85, 0x79, 0x61, 0xc8, 0x29, 0x6a, 0x9f, 0x99, 0xe6, 0x46, - 0x8f, 0x60, 0x96, 0xae, 0x9d, 0xc9, 0x8e, 0x1f, 0x68, 0x40, 0xd1, 0x4e, 0x6f, 0x6c, 0x83, 0xe7, - 0x24, 0x86, 0x1f, 0x1e, 0xac, 0xc6, 0x24, 0x71, 0xb7, 0x2f, 0x89, 0x34, 0x19, 0xf5, 0xf2, 0x03, - 0x82, 0x33, 0x43, 0x9b, 0x2c, 0xf4, 0x38, 0x1f, 0x69, 0x32, 0xdc, 0x93, 0x80, 0xee, 0x41, 0x56, - 0x21, 0x5e, 0x97, 0x4c, 0x0f, 0xd5, 0x14, 0x61, 0xe8, 0x56, 0xc1, 0xc0, 0x81, 0xa8, 0x2a, 0x3d, - 0x09, 0xe9, 0x12, 0x7d, 0x41, 0x6d, 0x6c, 0x35, 0x71, 0x31, 0x3b, 0x5a, 0x50, 0x30, 0x3a, 0xc1, - 0x13, 0x44, 0x89, 0x68, 0x03, 0xf2, 0xfb, 0x6e, 0xc0, 0x34, 0x8d, 0x0c, 0xc9, 0x0d, 0xdd, 0x2f, - 0x08, 0x09, 0xf8, 0xae, 0xc6, 0xa4, 0xdc, 0x7e, 0x80, 0x8c, 0x96, 0x21, 0xde, 0x54, 0x8b, 0x79, - 0x2a, 0xe3, 0xf9, 0x51, 0xe1, 0xcc, 0xd5, 0x98, 0x14, 0x6f, 0xaa, 0x04, 0x4b, 0xb1, 0x58, 0xd1, - 0x43, 0xa3, 0x58, 0x18, 0x3a, 0xc8, 0xf4, 0x46, 0xf5, 0x56, 0x63, 0x12, 0x8d, 0x7d, 0x25, 0xdf, - 0xdb, 0x86, 0x82, 0xc5, 0xc2, 0x3b, 0xdc, 0x20, 0x26, 0x91, 0x4a, 0xb9, 0x16, 0x3e, 0x54, 0x0d, - 0xc4, 0x31, 0x55, 0x63, 0x52, 0xde, 0x0a, 0xd2, 0xd1, 0x97, 0xe1, 0x4c, 0xaf, 0x44, 0x6e, 0xdc, - 0xb3, 0x03, 0x23, 0x57, 0xb8, 0xdc, 0x5e, 0x1b, 0x47, 0xd6, 0x40, 0x22, 0xfa, 0x34, 0x4c, 0xb1, - 0x56, 0x43, 0x54, 0x64, 0xd8, 0xce, 0x62, 0x5f, 0x83, 0xb1, 0xfc, 0xa4, 0xbf, 0x39, 0x3c, 0xae, - 0x41, 0x6e, 0x99, 0xcd, 0xe2, 0xdc, 0xd0, 0xfe, 0x36, 0x18, 0xa7, 0x41, 0xfa, 0x9b, 0xe3, 0x53, - 0x49, 0xbb, 0x5b, 0x2c, 0x85, 0x6f, 0x83, 0x9f, 0x19, 0xda, 0xee, 0x21, 0xe1, 0x0e, 0x55, 0x1a, - 0xa3, 0xe9, 0x93, 0x49, 0xd1, 0x2c, 0x76, 0x71, 0x81, 0x4c, 0xbb, 0xf1, 0xd9, 0xa1, 0x45, 0x1b, - 0xbc, 0x8c, 0x81, 0x14, 0xcd, 0xf2, 0xa9, 0xe8, 0x21, 0x88, 0xfc, 0x70, 0xb2, 0xbf, 0xd4, 0x78, - 0x6e, 0xe8, 0xc6, 0x53, 0xf8, 0xbe, 0x71, 0x35, 0x26, 0xcd, 0xa8, 0xbd, 0x29, 0x64, 0xb0, 0xa0, - 0xf2, 0x64, 0xd5, 0x3f, 0x55, 0x5e, 0x2c, 0x0e, 0x1d, 0x2c, 0x86, 0xdc, 0x43, 0x40, 0x06, 0x0b, - 0xb5, 0x2f, 0x89, 0x98, 0xb1, 0x6e, 0xe8, 0x0e, 0x1d, 0xd8, 0xe7, 0x87, 0x9a, 0x71, 0xef, 0xd5, - 0x51, 0xc4, 0x8c, 0x75, 0x46, 0x21, 0x66, 0xec, 0xf0, 0x18, 0x09, 0xde, 0x1c, 0xcf, 0x0f, 0x35, - 0xe3, 0xb0, 0x60, 0x0a, 0x62, 0xc6, 0x4e, 0x90, 0x4e, 0xcc, 0x98, 0x0d, 0x10, 0x7d, 0x72, 0x5f, - 0x18, 0x6a, 0xc6, 0x43, 0x8f, 0xb5, 0x11, 0x33, 0x56, 0x06, 0x12, 0xd1, 0x1a, 0x00, 0xf3, 0x88, - 0x74, 0x63, 0xcf, 0x2c, 0x2e, 0x0c, 0x9d, 0x7f, 0xfa, 0xa3, 0x24, 0xc8, 0xfc, 0xd3, 0x72, 0x69, - 0x64, 0x20, 0xa3, 0x3e, 0xb6, 0x4c, 0xf7, 0x35, 0x8a, 0x8b, 0x43, 0x07, 0xb2, 0x81, 0xed, 0x0d, - 0x32, 0x90, 0x1d, 0x78, 0x44, 0x32, 0x91, 0xb1, 0x95, 0xb1, 0xe2, 0xd2, 0x98, 0x05, 0x95, 0xc0, - 0x44, 0xc6, 0x38, 0xd0, 0x0a, 0x64, 0x88, 0xa7, 0x70, 0x44, 0x87, 0xa1, 0x8b, 0x43, 0xbd, 0xdb, - 0xbe, 0x20, 0xe4, 0x6a, 0x4c, 0x4a, 0xbf, 0xc7, 0x49, 0xe4, 0xf3, 0x6c, 0xb5, 0xa1, 0x58, 0x1a, - 0xfa, 0xf9, 0x9e, 0xf5, 0x25, 0xf2, 0x79, 0xc6, 0x81, 0x54, 0x38, 0xcb, 0xda, 0x8a, 0x9f, 0x2a, - 0xb3, 0xf8, 0x11, 0xa8, 0xe2, 0x25, 0x2a, 0x6a, 0x28, 0x76, 0x0f, 0x3d, 0xec, 0x56, 0x8d, 0x49, - 0x73, 0xca, 0x60, 0x2a, 0xe9, 0xf0, 0x7c, 0xea, 0x61, 0x88, 0xbf, 0x78, 0x79, 0x68, 0x87, 0x0f, - 0x59, 0x23, 0x21, 0x1d, 0x5e, 0x09, 0x90, 0xd9, 0x04, 0xa4, 0xc9, 0xb6, 0xcd, 0x76, 0xc1, 0xae, - 0x8c, 0x98, 0x80, 0xfa, 0x60, 0x3f, 0x9b, 0x80, 0xb4, 0x3a, 0xe3, 0x24, 0x82, 0xd4, 0x16, 0x56, - 0x2c, 0x3e, 0xcc, 0x5e, 0x1d, 0x2a, 0x68, 0xe0, 0x3a, 0x26, 0x22, 0x48, 0xf5, 0x88, 0x64, 0xc2, - 0xb6, 0xdc, 0x5b, 0x0d, 0xb8, 0xb7, 0x79, 0x6d, 0xe8, 0x84, 0x1d, 0x7a, 0xf9, 0x02, 0x99, 0xb0, - 0xad, 0x9e, 0x04, 0xf4, 0x39, 0x98, 0xe6, 0x47, 0xc4, 0x8b, 0xd7, 0x47, 0xf8, 0xc0, 0x41, 0x58, - 0x4d, 0xfa, 0x35, 0xe7, 0x61, 0xa3, 0x2c, 0x3b, 0x61, 0xce, 0xaa, 0xf7, 0xe2, 0x88, 0x51, 0x76, - 0x00, 0xd1, 0xb2, 0x51, 0xd6, 0x27, 0x93, 0x51, 0x96, 0xd9, 0x29, 0x9f, 0xeb, 0x6e, 0x0c, 0x1d, - 0x65, 0x07, 0x23, 0xa0, 0xc9, 0x28, 0xfb, 0x9e, 0x4f, 0x25, 0x35, 0xb3, 0x19, 0x10, 0x2b, 0xbe, - 0x34, 0xb4, 0x66, 0xbd, 0x88, 0x94, 0xd4, 0x8c, 0xf3, 0x90, 0x66, 0x63, 0xc1, 0x79, 0x4c, 0xd3, - 0x2f, 0x0f, 0x3f, 0xc0, 0xd9, 0x8f, 0x5b, 0xaa, 0xee, 0x55, 0x9d, 0x4c, 0xc3, 0xde, 0x40, 0x65, - 0xf1, 0xe3, 0x6a, 0x5c, 0x53, 0xaf, 0x8c, 0x1e, 0xa8, 0xc2, 0x4e, 0xe2, 0x79, 0x03, 0x55, 0x4f, - 0x22, 0x2d, 0x2a, 0x3b, 0x4f, 0x40, 0xfb, 0xf7, 0xf2, 0x88, 0xb3, 0xa6, 0x7d, 0x47, 0x3c, 0x68, - 0x51, 0x3d, 0xa2, 0xdf, 0x85, 0xba, 0xec, 0x50, 0x74, 0xf1, 0xe6, 0xe8, 0x2e, 0xd4, 0x7b, 0x38, - 0xdb, 0xeb, 0x42, 0x9c, 0xec, 0xcd, 0x99, 0xae, 0x87, 0xf1, 0x89, 0xd1, 0x73, 0x66, 0xbf, 0x6b, - 0xc1, 0xe6, 0x4c, 0x7e, 0x6b, 0xd5, 0x34, 0xdf, 0x68, 0xba, 0x9f, 0x4c, 0xcf, 0x88, 0xe2, 0xfd, - 0x64, 0xfa, 0xbc, 0x58, 0xbc, 0x9f, 0x4c, 0x5f, 0x10, 0xe7, 0xef, 0x27, 0xd3, 0xcf, 0x89, 0xcf, - 0x97, 0x7e, 0x72, 0x01, 0xf2, 0x2e, 0x56, 0x63, 0xc8, 0xe7, 0x76, 0x10, 0xf9, 0x2c, 0x0c, 0x43, - 0x3e, 0x1c, 0xdd, 0x71, 0xe8, 0x73, 0x3b, 0x08, 0x7d, 0x16, 0x86, 0x41, 0x1f, 0x9f, 0x87, 0x60, - 0x9f, 0xc6, 0x30, 0xec, 0xf3, 0xe2, 0x04, 0xd8, 0xc7, 0x13, 0xd5, 0x0f, 0x7e, 0xd6, 0x06, 0xc1, - 0xcf, 0xe5, 0xd1, 0xe0, 0xc7, 0x13, 0x15, 0x40, 0x3f, 0x6f, 0xf4, 0xa1, 0x9f, 0x8b, 0x23, 0xd0, - 0x8f, 0xc7, 0xef, 0xc2, 0x9f, 0xf5, 0x50, 0xf8, 0x73, 0x75, 0x1c, 0xfc, 0xf1, 0xe4, 0xf4, 0xe0, - 0x9f, 0x57, 0x7b, 0xf0, 0xcf, 0xe2, 0x50, 0xfc, 0xe3, 0x71, 0x33, 0x00, 0xf4, 0xce, 0x70, 0x00, - 0xf4, 0xd2, 0x44, 0x00, 0xc8, 0x93, 0x37, 0x88, 0x80, 0x1a, 0xc3, 0x10, 0xd0, 0x8b, 0x13, 0x20, - 0x20, 0xbf, 0xe1, 0xfa, 0x20, 0x50, 0x35, 0x0c, 0x02, 0x5d, 0x19, 0x03, 0x81, 0x3c, 0x69, 0x41, - 0x0c, 0x54, 0x0d, 0xc3, 0x40, 0x57, 0xc6, 0x60, 0xa0, 0x3e, 0x49, 0x0c, 0x04, 0x6d, 0x86, 0x83, - 0xa0, 0x6b, 0x63, 0x41, 0x90, 0x27, 0xad, 0x17, 0x05, 0xdd, 0x0c, 0xa0, 0xa0, 0x17, 0x86, 0xa0, - 0x20, 0x8f, 0x95, 0xc0, 0xa0, 0xcf, 0x0f, 0xc0, 0xa0, 0xd2, 0x28, 0x18, 0xe4, 0xf1, 0x7a, 0x38, - 0xe8, 0xad, 0x21, 0x38, 0xe8, 0xfa, 0x78, 0x1c, 0xe4, 0x09, 0xeb, 0x03, 0x42, 0xca, 0x48, 0x20, - 0xf4, 0xca, 0x84, 0x40, 0xc8, 0x93, 0x1e, 0x86, 0x84, 0x5e, 0xeb, 0x45, 0x42, 0x4b, 0xc3, 0x91, - 0x90, 0x27, 0x86, 0x43, 0xa1, 0xf5, 0x50, 0x28, 0x74, 0x75, 0x1c, 0x14, 0xf2, 0xfb, 0x5e, 0x10, - 0x0b, 0x6d, 0x86, 0x63, 0xa1, 0x6b, 0x63, 0xb1, 0x90, 0xdf, 0xfc, 0x3d, 0x60, 0x68, 0x3d, 0x14, - 0x0c, 0x5d, 0x1d, 0x07, 0x86, 0xfc, 0xc2, 0x05, 0xd1, 0xd0, 0xdb, 0x43, 0xd1, 0xd0, 0x8d, 0x49, - 0xd0, 0x90, 0x27, 0x74, 0x00, 0x0e, 0xbd, 0x33, 0x1c, 0x0e, 0xbd, 0x74, 0x82, 0xfb, 0xb8, 0x42, - 0xf1, 0xd0, 0xe7, 0x07, 0xf0, 0x50, 0x69, 0x14, 0x1e, 0xf2, 0xed, 0xd9, 0x05, 0x44, 0xca, 0x48, - 0xf8, 0xf2, 0xca, 0x84, 0xf0, 0xc5, 0x37, 0xbe, 0x10, 0xfc, 0x52, 0x09, 0xc1, 0x2f, 0x97, 0x47, - 0xe3, 0x17, 0x7f, 0x0a, 0xf1, 0x01, 0x4c, 0x35, 0x0c, 0xc0, 0x5c, 0x19, 0x03, 0x60, 0xfc, 0x51, - 0x28, 0x80, 0x60, 0xde, 0xe8, 0x43, 0x30, 0x17, 0xc7, 0x06, 0x41, 0x04, 0x20, 0xcc, 0xea, 0x20, - 0x84, 0xb9, 0x34, 0x12, 0xc2, 0x78, 0x12, 0x7c, 0x0c, 0xf3, 0x46, 0x1f, 0x86, 0xb9, 0x38, 0x02, - 0xc3, 0xf8, 0x05, 0xe0, 0x20, 0x46, 0x1b, 0x0d, 0x62, 0x96, 0x27, 0x05, 0x31, 0x9e, 0xe0, 0x50, - 0x14, 0xb3, 0x19, 0x8e, 0x62, 0xae, 0x4d, 0xb8, 0xbd, 0x39, 0x00, 0x63, 0xaa, 0x61, 0x30, 0xe6, - 0xca, 0x18, 0x18, 0x13, 0x9c, 0x43, 0x3c, 0x1c, 0x53, 0x0d, 0xc3, 0x31, 0x57, 0xc6, 0xe0, 0x18, - 0x5f, 0x52, 0x00, 0xc8, 0x34, 0x86, 0x01, 0x99, 0x17, 0x27, 0x00, 0x32, 0xfe, 0xbc, 0xdb, 0x87, - 0x64, 0xde, 0xec, 0x47, 0x32, 0xa5, 0x51, 0x48, 0xc6, 0xef, 0x91, 0x2e, 0x94, 0xd9, 0x0c, 0x87, - 0x32, 0xd7, 0xc6, 0x42, 0x99, 0xe0, 0x20, 0x19, 0xc0, 0x32, 0xeb, 0xa1, 0x58, 0xe6, 0xea, 0x38, - 0x2c, 0xe3, 0x0f, 0x92, 0x41, 0x30, 0xf3, 0x66, 0x3f, 0x98, 0x29, 0x8d, 0x02, 0x33, 0x7e, 0xe5, - 0x5c, 0x34, 0x53, 0x0d, 0x43, 0x33, 0x57, 0xc6, 0xa0, 0x19, 0xbf, 0xf1, 0x02, 0x70, 0x46, 0x19, - 0x09, 0x67, 0x5e, 0x99, 0x10, 0xce, 0xf4, 0x0d, 0x5c, 0xbd, 0x78, 0xa6, 0x1a, 0x86, 0x67, 0xae, - 0x8c, 0xc1, 0x33, 0x81, 0xc2, 0xfa, 0x80, 0x66, 0x33, 0x1c, 0xd0, 0x5c, 0x1b, 0x0b, 0x68, 0xfa, - 0x7a, 0x93, 0x8b, 0x68, 0xd6, 0x43, 0x11, 0xcd, 0xd5, 0x71, 0x88, 0xa6, 0x6f, 0xe2, 0x9b, 0x10, - 0xd2, 0xdc, 0x4f, 0xa6, 0x9f, 0x17, 0x5f, 0x28, 0xfd, 0x72, 0x0a, 0x52, 0x55, 0x37, 0xc4, 0x28, - 0x70, 0x51, 0x85, 0x70, 0x9a, 0x8b, 0x2a, 0xd0, 0x1a, 0xe9, 0x25, 0x74, 0xac, 0x19, 0x7f, 0x27, - 0xd1, 0xe0, 0x7d, 0x39, 0x9c, 0xf5, 0x14, 0x27, 0xd7, 0xd0, 0xab, 0x90, 0xef, 0xda, 0xd8, 0x92, - 0x3b, 0x96, 0x6e, 0x5a, 0xba, 0xc3, 0xa2, 0x97, 0x85, 0x55, 0xf1, 0xc3, 0xe3, 0xc5, 0xdc, 0x8e, - 0x8d, 0xad, 0x6d, 0x4e, 0x97, 0x72, 0xdd, 0xc0, 0x9b, 0xfb, 0xa7, 0x1d, 0x53, 0x93, 0xff, 0x69, - 0xc7, 0x5b, 0x20, 0x5a, 0x58, 0xd1, 0x7a, 0x66, 0x7d, 0x76, 0x03, 0x44, 0x78, 0x3b, 0xd1, 0xd0, - 0x7d, 0x37, 0x27, 0xbd, 0x09, 0x62, 0xc6, 0xea, 0x25, 0xa2, 0x5b, 0x70, 0xb6, 0xad, 0x1c, 0xd2, - 0xb0, 0x2c, 0xd9, 0x75, 0xa4, 0x68, 0xa8, 0x55, 0x9a, 0x86, 0x10, 0xa2, 0xb6, 0x72, 0x48, 0xff, - 0x01, 0x84, 0x25, 0xd1, 0xbb, 0xbf, 0xaf, 0x40, 0x41, 0xd3, 0x6d, 0x47, 0x37, 0x54, 0xf7, 0xca, - 0x3f, 0x76, 0x55, 0x44, 0xde, 0xa5, 0xb2, 0xab, 0xf7, 0x6e, 0xc0, 0x2c, 0x0f, 0x50, 0xf5, 0xff, - 0x13, 0x84, 0x42, 0x86, 0x34, 0x29, 0x05, 0x49, 0xf0, 0xff, 0x0c, 0xa6, 0x0c, 0x33, 0x4d, 0xc5, - 0xc1, 0x07, 0xca, 0x91, 0xec, 0x9e, 0x1e, 0xc8, 0xd2, 0x1b, 0xb4, 0x9e, 0x7b, 0x76, 0xbc, 0x98, - 0xbf, 0xc7, 0x92, 0x06, 0x0e, 0x11, 0xe4, 0x9b, 0x81, 0x04, 0x0d, 0xad, 0x40, 0x8e, 0xde, 0xe9, - 0x6b, 0xb2, 0xab, 0xa3, 0x39, 0x10, 0x18, 0xb6, 0x1d, 0xc5, 0x2f, 0x98, 0x96, 0xe8, 0x3d, 0xc0, - 0xee, 0x6d, 0xd3, 0xd7, 0x60, 0x46, 0xb1, 0x8f, 0x0c, 0x95, 0x6a, 0x18, 0x1b, 0x76, 0xd7, 0xa6, - 0x48, 0x20, 0x2d, 0x15, 0x28, 0xb9, 0xec, 0x52, 0xd1, 0x6b, 0x70, 0x41, 0xc3, 0xc4, 0xb5, 0x61, - 0xfe, 0x83, 0x63, 0x9a, 0xb2, 0xd9, 0xd2, 0x64, 0x7a, 0x0c, 0x9c, 0xa2, 0x80, 0xb4, 0x74, 0x96, - 0x66, 0xa0, 0x9e, 0x43, 0xc3, 0x34, 0xb7, 0x5a, 0x5a, 0x85, 0x24, 0xf2, 0x0b, 0x02, 0x7f, 0x47, - 0x80, 0x5c, 0x4f, 0xbc, 0xf7, 0x1b, 0x7d, 0xfb, 0xb5, 0x17, 0xc2, 0xf1, 0xcb, 0xb0, 0xf8, 0xbc, - 0x34, 0x6f, 0x3b, 0x37, 0x66, 0x68, 0x71, 0xb8, 0xff, 0x4b, 0x57, 0x10, 0xdc, 0x28, 0x01, 0x97, - 0xed, 0xf5, 0xe4, 0xef, 0xbd, 0xbf, 0x18, 0x2b, 0xfd, 0x22, 0x01, 0xf9, 0xde, 0xb8, 0xee, 0x5a, - 0x5f, 0xb9, 0xc2, 0xc6, 0x97, 0x1e, 0x8e, 0xe5, 0x11, 0xf7, 0x24, 0x65, 0xfc, 0x3b, 0x84, 0x59, - 0x31, 0x97, 0x46, 0xec, 0x4a, 0x07, 0xcb, 0xe9, 0x33, 0xce, 0x7f, 0x3f, 0xee, 0x8d, 0x19, 0xcb, - 0x30, 0xc5, 0x14, 0x2e, 0x0c, 0x3d, 0x0d, 0x47, 0x75, 0x2e, 0xb1, 0x6c, 0x64, 0x8c, 0x69, 0x9c, - 0xea, 0x32, 0x1c, 0x8f, 0x70, 0x8a, 0x3f, 0xda, 0xe1, 0x57, 0x22, 0x4d, 0x9d, 0xec, 0x4a, 0x24, - 0xb6, 0xeb, 0xdc, 0x6a, 0x61, 0xd5, 0xe1, 0xff, 0xac, 0xe4, 0xfe, 0x9d, 0xce, 0xe5, 0x7e, 0x11, - 0xfc, 0x7f, 0x98, 0x96, 0x25, 0xfe, 0x3f, 0x4c, 0x81, 0x30, 0xae, 0x82, 0x27, 0x82, 0x76, 0x49, - 0x16, 0xec, 0xc7, 0x9b, 0xfa, 0x37, 0x05, 0x10, 0x69, 0x07, 0xbc, 0x8b, 0xb1, 0x16, 0x89, 0x15, - 0xba, 0x11, 0x66, 0xf1, 0x89, 0x23, 0xcc, 0x4a, 0x0a, 0x14, 0xbc, 0x32, 0xb0, 0xff, 0x15, 0x19, - 0x71, 0x97, 0xd1, 0xa9, 0x8e, 0x55, 0x97, 0x7e, 0x5f, 0x80, 0x39, 0xef, 0x1b, 0x65, 0xef, 0x34, - 0xdf, 0x69, 0x82, 0x84, 0x25, 0xfa, 0x9f, 0x49, 0x04, 0x08, 0xd3, 0xa3, 0xb6, 0x13, 0x59, 0x10, - 0xe2, 0x01, 0x10, 0xc0, 0x01, 0xb6, 0xd6, 0xa8, 0xd3, 0x7f, 0x53, 0x62, 0xcf, 0x76, 0xe9, 0x6e, - 0x40, 0x03, 0xd4, 0x58, 0x49, 0x35, 0x27, 0xb2, 0x6a, 0xb7, 0x9a, 0x34, 0x73, 0xe9, 0x87, 0x42, - 0x50, 0xd0, 0x13, 0xe2, 0x58, 0xdd, 0x81, 0xc4, 0x13, 0xa5, 0x35, 0x2a, 0xfe, 0xa3, 0x47, 0xf5, - 0x12, 0xc9, 0x8d, 0xee, 0xf6, 0x1c, 0x82, 0x8c, 0x0f, 0x77, 0x02, 0x06, 0x55, 0x1a, 0x3c, 0x2c, - 0x89, 0x3e, 0xed, 0xd6, 0x22, 0x31, 0xfe, 0xf3, 0xc1, 0x4e, 0xfa, 0x7a, 0xf2, 0x83, 0xf7, 0x17, - 0x85, 0x1b, 0x75, 0x98, 0x0b, 0x99, 0xbe, 0x50, 0x01, 0x20, 0x70, 0xad, 0x33, 0xff, 0xcb, 0xa6, - 0x95, 0x35, 0x79, 0x67, 0xb3, 0xbc, 0xb5, 0xb1, 0x51, 0x6b, 0x34, 0x2a, 0x6b, 0xa2, 0x80, 0x44, - 0xc8, 0xf5, 0x5c, 0x0a, 0xcd, 0xff, 0xa9, 0xe9, 0xc6, 0xa7, 0x00, 0xfc, 0xeb, 0xdc, 0x89, 0xac, - 0xf5, 0xca, 0x23, 0xf9, 0xe1, 0xca, 0x83, 0x9d, 0x4a, 0x5d, 0x8c, 0x21, 0x04, 0x85, 0xd5, 0x95, - 0x46, 0xb9, 0x2a, 0x4b, 0x95, 0xfa, 0xf6, 0xd6, 0x66, 0xbd, 0x22, 0x0a, 0x9c, 0x6f, 0x0d, 0x72, - 0xc1, 0xe3, 0xa2, 0x68, 0x0e, 0x66, 0xca, 0xd5, 0x4a, 0x79, 0x5d, 0x7e, 0x58, 0x5b, 0x91, 0xdf, - 0xda, 0xa9, 0xec, 0x54, 0xc4, 0x18, 0x2d, 0x1a, 0x25, 0xde, 0xdd, 0x79, 0xf0, 0x40, 0x14, 0xd0, - 0x0c, 0x64, 0xd9, 0x3b, 0xbd, 0x40, 0x5a, 0x8c, 0xdf, 0xd8, 0x80, 0x6c, 0xe0, 0x4e, 0x26, 0xf2, - 0xb9, 0xed, 0x9d, 0x7a, 0x55, 0x6e, 0xd4, 0x36, 0x2a, 0xf5, 0xc6, 0xca, 0xc6, 0x36, 0x93, 0x41, - 0x69, 0x2b, 0xab, 0x5b, 0x52, 0x43, 0x14, 0xbc, 0xf7, 0xc6, 0xd6, 0x4e, 0xb9, 0xea, 0xfd, 0xe1, - 0x54, 0x32, 0x9d, 0x10, 0x13, 0x37, 0x4c, 0x38, 0x1b, 0x7a, 0xfe, 0x12, 0x65, 0x61, 0x7a, 0xc7, - 0xa0, 0xb7, 0xcb, 0x88, 0x31, 0x94, 0x0f, 0x1c, 0xc1, 0x14, 0x05, 0x94, 0x66, 0x07, 0xed, 0xc4, - 0x38, 0x4a, 0x41, 0xbc, 0x7e, 0x47, 0x4c, 0x90, 0x62, 0x06, 0xce, 0x31, 0x8a, 0x49, 0x94, 0xe1, - 0x47, 0xbd, 0xc4, 0x29, 0x94, 0xf3, 0xcf, 0x5a, 0x89, 0xa9, 0x1b, 0x17, 0x21, 0x70, 0x14, 0x05, - 0x01, 0xa4, 0x1e, 0x28, 0x0e, 0xb6, 0x1d, 0x31, 0x86, 0xa6, 0x21, 0xb1, 0xd2, 0x6a, 0x89, 0xc2, - 0xed, 0xbf, 0x10, 0x20, 0xed, 0xde, 0x1d, 0x8c, 0x1e, 0xc0, 0x14, 0xc3, 0xc6, 0x8b, 0xc3, 0xa7, - 0x0c, 0x3a, 0xea, 0xcc, 0x2f, 0x8d, 0x9b, 0x53, 0x4a, 0x31, 0xf4, 0x36, 0xff, 0xef, 0x38, 0x62, - 0x2f, 0xe8, 0xd2, 0x28, 0x6b, 0x72, 0xa5, 0x8e, 0x36, 0x39, 0xd2, 0x43, 0x4a, 0xb1, 0x4f, 0x08, - 0xab, 0x2f, 0x7e, 0xf0, 0xb3, 0x85, 0xd8, 0x07, 0xcf, 0x16, 0x84, 0x1f, 0x3d, 0x5b, 0x10, 0x7e, - 0xfa, 0x6c, 0x41, 0xf8, 0xa7, 0x67, 0x0b, 0xc2, 0x6f, 0xff, 0x7c, 0x21, 0xf6, 0xa3, 0x9f, 0x2f, - 0xc4, 0x7e, 0xfa, 0xf3, 0x85, 0xd8, 0x3b, 0xd3, 0x9c, 0x7b, 0x37, 0x45, 0xff, 0xc6, 0xee, 0xce, - 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xf9, 0xfd, 0x79, 0xcb, 0x6f, 0x00, 0x00, + 0xd8, 0x7d, 0xaa, 0xce, 0xe9, 0xaa, 0x53, 0xa7, 0xaa, 0xce, 0xaf, 0xea, 0x54, 0x11, 0x66, 0x2c, + 0x53, 0x51, 0xf7, 0xdb, 0xbb, 0xb7, 0x94, 0xb6, 0xbe, 0xdc, 0xb6, 0x4c, 0xc7, 0x44, 0x33, 0xaa, + 0xa9, 0x3e, 0xa1, 0xe4, 0x65, 0x9e, 0x38, 0x8f, 0xdc, 0x5c, 0x9a, 0xe2, 0x28, 0x2c, 0xdb, 0xfc, + 0x9c, 0x4b, 0xc3, 0x96, 0x65, 0x5a, 0x36, 0xa7, 0x9e, 0x77, 0xa9, 0x2d, 0xec, 0x28, 0x81, 0xdc, + 0x45, 0xdb, 0x31, 0x2d, 0xa5, 0x81, 0x6f, 0x61, 0xa3, 0xa1, 0x1b, 0xee, 0x0f, 0xc9, 0xf7, 0x54, + 0x55, 0x79, 0x9e, 0xcb, 0xc3, 0xf2, 0xdc, 0xe5, 0x99, 0x0a, 0x1d, 0x47, 0x6f, 0xde, 0xda, 0x6f, + 0xaa, 0xb7, 0x1c, 0xbd, 0x85, 0x6d, 0x47, 0x69, 0xb5, 0x79, 0xca, 0x12, 0x4d, 0x71, 0x2c, 0x45, + 0xd5, 0x8d, 0xc6, 0x2d, 0x0b, 0xab, 0xa6, 0xa5, 0x61, 0x4d, 0xb6, 0xdb, 0x8a, 0xe1, 0x16, 0xb9, + 0x61, 0x36, 0x4c, 0xfa, 0x78, 0x8b, 0x3c, 0x31, 0x6a, 0xf1, 0xd7, 0x21, 0x2d, 0x29, 0x46, 0x03, + 0x57, 0x8d, 0x3d, 0x13, 0x7d, 0x16, 0x12, 0x1a, 0xb6, 0xd5, 0x82, 0xb0, 0x24, 0xdc, 0xc8, 0xdc, + 0x29, 0x2e, 0xf7, 0xe9, 0x62, 0x99, 0xe6, 0x5d, 0xc3, 0xb6, 0x6a, 0xe9, 0x6d, 0xc7, 0xb4, 0x56, + 0x13, 0x1f, 0x1c, 0x2f, 0x4e, 0x48, 0x94, 0x0b, 0x7d, 0x12, 0x26, 0x9b, 0x58, 0xb1, 0x71, 0x21, + 0x46, 0xd9, 0x0b, 0x21, 0xec, 0x0f, 0x49, 0x3a, 0x67, 0x62, 0x99, 0x8b, 0x7f, 0x23, 0x40, 0x4e, + 0xc2, 0xef, 0x75, 0xb0, 0xed, 0x54, 0xb0, 0xa2, 0x61, 0x0b, 0x5d, 0x84, 0xf8, 0x13, 0x7c, 0x54, + 0x88, 0x2f, 0x09, 0x37, 0xb2, 0xab, 0x53, 0x1f, 0x1e, 0x2f, 0xc6, 0xd7, 0xf1, 0x91, 0x44, 0x68, + 0x68, 0x09, 0xa6, 0xb0, 0xa1, 0xc9, 0x24, 0x39, 0xd1, 0x9d, 0x9c, 0xc4, 0x86, 0xb6, 0x8e, 0x8f, + 0x90, 0x0a, 0x29, 0x9b, 0x48, 0x33, 0x54, 0x5c, 0x98, 0x5c, 0x12, 0x6e, 0x4c, 0xae, 0xde, 0xff, + 0xf0, 0x78, 0xb1, 0xd4, 0xd0, 0x9d, 0xfd, 0xce, 0xee, 0xb2, 0x6a, 0xb6, 0x6e, 0x79, 0xa5, 0xd2, + 0x76, 0xfd, 0xe7, 0x5b, 0xed, 0x27, 0x8d, 0x5b, 0x03, 0x5a, 0x60, 0xb9, 0x7e, 0x68, 0xd4, 0xf0, + 0x7b, 0x92, 0x27, 0xf8, 0xf5, 0xc4, 0x2f, 0xde, 0x5f, 0x14, 0x1e, 0x24, 0x52, 0x82, 0x18, 0x7b, + 0x90, 0x48, 0xc5, 0xc4, 0x78, 0xf1, 0xeb, 0x71, 0xc8, 0x4b, 0xd8, 0x6e, 0x9b, 0x86, 0x8d, 0x79, + 0x35, 0x3e, 0x01, 0x71, 0xe7, 0xd0, 0xa0, 0xd5, 0xc8, 0xdc, 0x59, 0x08, 0x51, 0x46, 0xdd, 0x52, + 0x0c, 0x5b, 0x51, 0x1d, 0xdd, 0x34, 0x24, 0x92, 0x15, 0xbd, 0x06, 0x19, 0x0b, 0xdb, 0x9d, 0x16, + 0xa6, 0xcd, 0x46, 0x6b, 0x98, 0xb9, 0x73, 0x21, 0x84, 0xb3, 0xd6, 0x56, 0x0c, 0x09, 0x58, 0x5e, + 0xf2, 0x8c, 0x2e, 0x42, 0xca, 0xe8, 0xb4, 0x88, 0x5e, 0x6c, 0x5a, 0xeb, 0xb8, 0x34, 0x65, 0x74, + 0x5a, 0xeb, 0xf8, 0xc8, 0x46, 0x25, 0xc8, 0x58, 0xa4, 0xd1, 0x64, 0xdd, 0xd8, 0x33, 0xed, 0x42, + 0x72, 0x29, 0x7e, 0x23, 0x73, 0xe7, 0xf9, 0x41, 0x4d, 0x4b, 0xcc, 0x80, 0xb7, 0x0f, 0x58, 0x2e, + 0xc1, 0x46, 0x35, 0xc8, 0xf1, 0x92, 0x59, 0x58, 0xb1, 0x4d, 0xa3, 0x30, 0xb5, 0x24, 0xdc, 0xc8, + 0xdf, 0x59, 0x0e, 0x13, 0xd3, 0xa5, 0x05, 0xf2, 0xda, 0x69, 0x61, 0x89, 0x72, 0x49, 0x59, 0x2b, + 0xf0, 0x56, 0x7c, 0x0c, 0xd9, 0x60, 0x2a, 0x42, 0x90, 0x97, 0xca, 0xb5, 0x9d, 0x8d, 0xb2, 0xbc, + 0xb3, 0xb9, 0xbe, 0xb9, 0xf5, 0xf6, 0xa6, 0x38, 0x81, 0xe6, 0x40, 0xe4, 0xb4, 0xf5, 0xf2, 0x63, + 0xf9, 0x61, 0x75, 0xa3, 0x5a, 0x17, 0x05, 0x74, 0x11, 0xce, 0x71, 0xaa, 0xb4, 0xb2, 0x79, 0xbf, + 0x2c, 0xaf, 0x6e, 0xed, 0x6c, 0xae, 0xad, 0x48, 0x8f, 0xc5, 0xd8, 0x7c, 0xe2, 0xb7, 0xbe, 0xb3, + 0x30, 0x51, 0x7c, 0x04, 0x70, 0x1f, 0x3b, 0xdc, 0xac, 0xd0, 0x2a, 0x24, 0xf7, 0x69, 0x69, 0xb8, + 0x61, 0x2f, 0x85, 0x16, 0x3b, 0x60, 0x82, 0xab, 0x29, 0xa2, 0x81, 0x1f, 0x1f, 0x2f, 0x0a, 0x12, + 0xe7, 0x64, 0x4d, 0x5e, 0xfc, 0x81, 0x00, 0x19, 0x2a, 0x98, 0xd5, 0x11, 0x95, 0x7a, 0x24, 0x5f, + 0x1a, 0xa9, 0x90, 0x7e, 0xd1, 0x68, 0x19, 0x26, 0x9f, 0x2a, 0xcd, 0xce, 0xb0, 0x7e, 0xf3, 0x88, + 0xa4, 0x4b, 0x2c, 0x1b, 0x7a, 0x03, 0xb2, 0xba, 0xe1, 0x60, 0xc3, 0x91, 0x19, 0x5b, 0x7c, 0x04, + 0x5b, 0x86, 0xe5, 0xa6, 0x2f, 0xc5, 0xbf, 0x14, 0x00, 0xb6, 0x3b, 0x51, 0xaa, 0x86, 0xf4, 0xfb, + 0xb1, 0xca, 0xef, 0xf6, 0x7b, 0x56, 0x8b, 0xf3, 0x90, 0xd4, 0x8d, 0xa6, 0x6e, 0xb0, 0xf2, 0xa7, + 0x24, 0xfe, 0x86, 0xe6, 0x60, 0x72, 0xb7, 0xa9, 0x1b, 0x1a, 0x35, 0xff, 0x94, 0xc4, 0x5e, 0xb8, + 0xfa, 0x25, 0xc8, 0xd0, 0xb2, 0x47, 0xa8, 0xfd, 0xe2, 0x37, 0x63, 0x70, 0xae, 0x64, 0x1a, 0x9a, + 0x4e, 0xfa, 0xa1, 0xd2, 0xfc, 0x58, 0xe8, 0xe6, 0x55, 0x48, 0xe3, 0xc3, 0xf6, 0x98, 0xcd, 0x9b, + 0xc2, 0x87, 0x6d, 0xfa, 0x14, 0xae, 0x3a, 0xf4, 0x49, 0xb8, 0xa0, 0x34, 0x9b, 0xe6, 0x81, 0xac, + 0xef, 0xc9, 0x9a, 0x89, 0x6d, 0xd9, 0x30, 0x1d, 0x19, 0x1f, 0xea, 0xb6, 0x43, 0x87, 0x8a, 0x94, + 0x34, 0x4b, 0x93, 0xab, 0x7b, 0x6b, 0x26, 0xb6, 0x37, 0x4d, 0xa7, 0x4c, 0x92, 0xb8, 0xc2, 0xdf, + 0x85, 0xf3, 0xbd, 0xba, 0x89, 0x52, 0xf7, 0x7f, 0x27, 0x40, 0xbe, 0x6a, 0xe8, 0xce, 0xc7, 0x42, + 0xe9, 0x9e, 0xf6, 0xe2, 0x41, 0xed, 0xdd, 0x04, 0x71, 0x4f, 0xd1, 0x9b, 0x5b, 0x46, 0xdd, 0x6c, + 0xed, 0xda, 0x8e, 0x69, 0x60, 0x9b, 0xab, 0xb7, 0x8f, 0xce, 0x75, 0xf6, 0x08, 0xa6, 0xbd, 0x3a, + 0x45, 0xa9, 0xac, 0x67, 0x20, 0x56, 0x0d, 0xd5, 0xc2, 0x2d, 0x6c, 0x44, 0xaa, 0xad, 0xe7, 0x21, + 0xad, 0xbb, 0x72, 0xa9, 0xc6, 0xe2, 0x92, 0x4f, 0xe0, 0x75, 0xea, 0xc0, 0x4c, 0xe0, 0xdb, 0x51, + 0x0e, 0x7e, 0xcf, 0x41, 0xda, 0xc0, 0x07, 0xb2, 0xdf, 0x5e, 0x71, 0x29, 0x65, 0xe0, 0x03, 0x36, + 0x58, 0x3d, 0x86, 0xdc, 0x1a, 0x6e, 0x62, 0x07, 0x47, 0x3f, 0x92, 0xef, 0x40, 0xde, 0x15, 0x1d, + 0x65, 0x23, 0xfd, 0x81, 0x00, 0x88, 0xcb, 0x25, 0xb3, 0x67, 0x94, 0xed, 0xb4, 0x48, 0xbc, 0x03, + 0xa7, 0x63, 0x19, 0x6c, 0x9a, 0x67, 0x56, 0x0a, 0x8c, 0x44, 0x67, 0x7a, 0x7f, 0x44, 0x4d, 0x04, + 0x47, 0x54, 0xcf, 0x5b, 0x21, 0x7e, 0xca, 0x01, 0xcc, 0x76, 0x15, 0x2f, 0xda, 0xa6, 0x4c, 0xd0, + 0x92, 0xc5, 0x96, 0xe2, 0x41, 0xcf, 0x8c, 0x12, 0x8b, 0xef, 0xc2, 0x4c, 0xa9, 0x89, 0x15, 0x2b, + 0x6a, 0xb5, 0xf0, 0xe6, 0x7c, 0x0c, 0x28, 0x28, 0x3e, 0xca, 0x26, 0xfd, 0x43, 0x01, 0x90, 0x84, + 0x9f, 0x62, 0xcb, 0x89, 0xbc, 0x49, 0xd7, 0x20, 0xe3, 0x28, 0x56, 0x03, 0x3b, 0x32, 0x71, 0xe7, + 0xf9, 0x70, 0xf5, 0x42, 0x40, 0x10, 0x71, 0xea, 0x97, 0xf7, 0x9b, 0xea, 0x72, 0xdd, 0x75, 0xf7, + 0x5d, 0xe7, 0x8c, 0xf1, 0x11, 0x32, 0xd7, 0xc0, 0x3b, 0x30, 0xdb, 0x55, 0xca, 0x28, 0x55, 0xa0, + 0x43, 0xa6, 0xa6, 0x2a, 0xc6, 0x56, 0x9b, 0xcc, 0x03, 0x36, 0xba, 0x0b, 0xe7, 0x6d, 0xc7, 0x6c, + 0xcb, 0x8a, 0x23, 0x33, 0xd7, 0x72, 0xd7, 0xec, 0x18, 0x9a, 0x62, 0x1d, 0xd1, 0x6f, 0xa4, 0xa4, + 0x59, 0x92, 0xba, 0xc2, 0x0a, 0xb2, 0xca, 0x93, 0x88, 0xf9, 0xb6, 0x74, 0x43, 0x26, 0x1e, 0x60, + 0xd3, 0xb1, 0x79, 0x57, 0x87, 0x96, 0x6e, 0x48, 0x8c, 0xc2, 0xab, 0xf1, 0x1d, 0x81, 0x7d, 0x2b, + 0x4a, 0x35, 0xbf, 0x09, 0x19, 0x5b, 0x55, 0x0c, 0x79, 0xcf, 0xb4, 0x5a, 0x8a, 0x43, 0x7b, 0x47, + 0xbe, 0x4b, 0xcd, 0x9e, 0x5f, 0xad, 0x2a, 0xc6, 0x3d, 0x9a, 0x49, 0x02, 0xdb, 0x7b, 0x0e, 0x76, + 0xa0, 0x07, 0x89, 0x54, 0x5c, 0x4c, 0x14, 0x7f, 0x29, 0x40, 0x96, 0x95, 0x32, 0xca, 0x0e, 0xf4, + 0x2a, 0x24, 0x2c, 0xf3, 0x80, 0x75, 0xa0, 0xcc, 0x9d, 0xe7, 0x42, 0x44, 0xac, 0xe3, 0xa3, 0xe0, + 0xcc, 0x45, 0xb3, 0xa3, 0x55, 0xe0, 0x1e, 0x9e, 0x4c, 0xb9, 0xe3, 0xe3, 0x72, 0x03, 0xe3, 0x92, + 0x88, 0x8c, 0xeb, 0x30, 0xbd, 0xab, 0x38, 0xea, 0x3e, 0x69, 0x1f, 0x5a, 0x48, 0x32, 0xcb, 0xc5, + 0x6f, 0x64, 0xa5, 0x3c, 0x25, 0xbb, 0x45, 0xb7, 0x8b, 0x7f, 0xe2, 0xf6, 0x06, 0x1b, 0x7f, 0xfc, + 0x9b, 0xe9, 0xbf, 0x04, 0xde, 0x29, 0xdc, 0xc2, 0xfe, 0x5f, 0x6b, 0xad, 0x6f, 0xc7, 0xe0, 0x42, + 0x69, 0x1f, 0xab, 0x4f, 0x4a, 0xa6, 0x61, 0xeb, 0xb6, 0x83, 0x0d, 0xf5, 0x28, 0xca, 0x26, 0x7b, + 0x0e, 0xd2, 0x07, 0xba, 0xb3, 0x2f, 0x6b, 0xfa, 0xde, 0x1e, 0xed, 0xd2, 0x29, 0x29, 0x45, 0x08, + 0x6b, 0xfa, 0xde, 0x1e, 0xba, 0x0b, 0x89, 0x96, 0xa9, 0x31, 0x07, 0x36, 0x7f, 0x67, 0x31, 0x44, + 0x3c, 0x2d, 0x9a, 0xdd, 0x69, 0x6d, 0x98, 0x1a, 0x96, 0x68, 0x66, 0xb4, 0x00, 0xa0, 0x12, 0x6a, + 0xdb, 0xd4, 0x0d, 0x87, 0x4f, 0x64, 0x01, 0x0a, 0xaa, 0x40, 0xda, 0xc1, 0x56, 0x4b, 0x37, 0x14, + 0x87, 0x00, 0x7c, 0xa2, 0xbc, 0x2b, 0xa1, 0x05, 0x6f, 0x37, 0x75, 0x55, 0xe9, 0x5b, 0xa9, 0xf0, + 0x99, 0xf9, 0x78, 0xf3, 0x8d, 0x04, 0x14, 0xfa, 0x35, 0x14, 0xa5, 0x9d, 0x6c, 0x43, 0x92, 0x0d, + 0x7a, 0xdc, 0x52, 0xee, 0x0c, 0x52, 0x44, 0x48, 0x09, 0x96, 0xd9, 0xe0, 0xc8, 0x0b, 0xcf, 0xe5, + 0xcc, 0xff, 0x95, 0x00, 0x49, 0x96, 0x80, 0x6e, 0x43, 0x8a, 0xa3, 0x7b, 0x8d, 0x96, 0x31, 0xbe, + 0x7a, 0xfe, 0xe4, 0x78, 0x71, 0x8a, 0x61, 0xf9, 0xb5, 0x0f, 0xfd, 0x47, 0x69, 0x8a, 0xc1, 0x79, + 0x8d, 0xb4, 0x99, 0xed, 0x28, 0x96, 0x43, 0x57, 0x51, 0x48, 0x9b, 0x65, 0xa5, 0x14, 0x25, 0xac, + 0xe3, 0x23, 0xf4, 0x00, 0x92, 0xb6, 0xa3, 0x38, 0x1d, 0x9b, 0xb7, 0xda, 0xa9, 0x0a, 0x5b, 0xa3, + 0x9c, 0x12, 0x97, 0x40, 0xfc, 0x11, 0x0d, 0x3b, 0x8a, 0xde, 0xa4, 0xcd, 0x98, 0x96, 0xf8, 0x5b, + 0xf1, 0x5b, 0x02, 0x24, 0x59, 0x56, 0x74, 0x01, 0x66, 0x19, 0x82, 0xaf, 0x6e, 0xae, 0x95, 0xeb, + 0x65, 0x69, 0xa3, 0xba, 0xb9, 0x52, 0x2f, 0x8b, 0x13, 0xe8, 0x3c, 0x20, 0x37, 0xa1, 0xb4, 0xb5, + 0x59, 0xab, 0xd6, 0xea, 0xe5, 0x4d, 0x82, 0xfc, 0xe7, 0x40, 0x64, 0xf4, 0x00, 0x35, 0x86, 0xae, + 0xc0, 0x52, 0x2f, 0x55, 0xae, 0xd5, 0x57, 0xea, 0x35, 0xb9, 0x5c, 0xab, 0x57, 0x37, 0x56, 0xea, + 0xe5, 0x35, 0x31, 0x3e, 0x24, 0x17, 0xf9, 0x88, 0x24, 0x95, 0x4b, 0x75, 0x31, 0x51, 0x7c, 0x06, + 0xe7, 0x24, 0xac, 0x9a, 0xad, 0x76, 0xc7, 0xc1, 0xa4, 0x94, 0x76, 0x94, 0xfd, 0xe5, 0x02, 0x4c, + 0x69, 0xd6, 0x91, 0x6c, 0x75, 0x0c, 0xde, 0x5b, 0x92, 0x9a, 0x75, 0x24, 0x75, 0x0c, 0x6e, 0x8c, + 0x7f, 0x21, 0xc0, 0xf9, 0xde, 0x8f, 0x47, 0x69, 0x8a, 0x5f, 0x84, 0x8c, 0xa2, 0x69, 0x58, 0x93, + 0x35, 0xdc, 0x74, 0x14, 0xee, 0x6f, 0xdc, 0x0e, 0x48, 0xe2, 0x2b, 0x60, 0xcb, 0x6c, 0xe9, 0x6b, + 0xd9, 0x5b, 0x01, 0xdb, 0x78, 0x54, 0x2a, 0xd1, 0xf2, 0xac, 0x11, 0x46, 0x77, 0x44, 0xa2, 0xb2, + 0x28, 0xa5, 0xa8, 0xc2, 0x85, 0x55, 0xdc, 0xd0, 0x8d, 0xe0, 0x9a, 0x56, 0xe4, 0x4e, 0x9e, 0x0c, + 0x85, 0xfe, 0x8f, 0x44, 0xea, 0xea, 0x25, 0xe0, 0x5c, 0xd9, 0xd0, 0x3e, 0x9a, 0x4a, 0x90, 0xfe, + 0xa0, 0x9a, 0xad, 0x96, 0xee, 0xb8, 0x6d, 0xcf, 0xde, 0xd0, 0x67, 0x20, 0xa5, 0x61, 0x45, 0xf3, + 0xd6, 0x42, 0x46, 0xb9, 0x80, 0x92, 0x97, 0x1d, 0x7d, 0x19, 0x2e, 0x90, 0x69, 0xc1, 0x32, 0x94, + 0xa6, 0xcc, 0xa4, 0xc9, 0x8e, 0xa5, 0x37, 0x1a, 0xd8, 0xe2, 0xab, 0x87, 0x37, 0x42, 0xca, 0x59, + 0xe5, 0x1c, 0x25, 0xca, 0x50, 0x67, 0xf9, 0xa5, 0x73, 0x7a, 0x18, 0x19, 0x7d, 0xc1, 0x5b, 0x6c, + 0xb2, 0xdb, 0x8a, 0x61, 0xf3, 0x21, 0x77, 0xd0, 0xa2, 0x24, 0xb7, 0x0c, 0x3e, 0xc3, 0x11, 0x8a, + 0x8d, 0x6e, 0x11, 0xdc, 0xf2, 0x5e, 0x47, 0xb7, 0xb0, 0x7c, 0xbb, 0xad, 0x16, 0x92, 0xa4, 0xee, + 0xab, 0xf9, 0x93, 0xe3, 0x45, 0x90, 0x18, 0xf9, 0xf6, 0x76, 0x89, 0xe0, 0x18, 0xf6, 0xdc, 0x56, + 0xd1, 0x0d, 0x10, 0x0d, 0x53, 0xb6, 0xf0, 0x9e, 0x85, 0xed, 0x7d, 0xfe, 0xd9, 0x14, 0xd5, 0x58, + 0xde, 0x30, 0x25, 0x46, 0x66, 0xa2, 0xcf, 0x43, 0xb2, 0x6d, 0xea, 0xb6, 0x69, 0x14, 0xd2, 0x4c, + 0xa3, 0xec, 0x0d, 0xbd, 0x05, 0xa2, 0x6e, 0xc8, 0x7b, 0x4d, 0xbd, 0xb1, 0xef, 0xc8, 0x07, 0x96, + 0xee, 0x60, 0xbb, 0x30, 0x43, 0x0b, 0x1e, 0x66, 0x16, 0x35, 0xbe, 0xac, 0xab, 0xbd, 0x4d, 0x72, + 0xf2, 0x2a, 0xe4, 0x75, 0xe3, 0x1e, 0xe5, 0xa7, 0x44, 0xdb, 0x73, 0x2e, 0xa6, 0xc4, 0x54, 0xf1, + 0x5f, 0x05, 0x38, 0xdf, 0x6b, 0x26, 0x51, 0x76, 0xd3, 0x1b, 0x20, 0x9a, 0x06, 0x96, 0xdb, 0xfb, + 0x8a, 0x8d, 0x79, 0xb3, 0xf2, 0x99, 0x30, 0x6f, 0x1a, 0x78, 0x9b, 0x90, 0x59, 0x23, 0xa1, 0x6d, + 0x98, 0xb1, 0x1d, 0xa5, 0xa1, 0x1b, 0x0d, 0xd9, 0xdb, 0x10, 0xa0, 0xab, 0x3a, 0x63, 0xc2, 0x08, + 0x91, 0x73, 0x7b, 0xf4, 0x2e, 0xf7, 0xe9, 0x1f, 0x05, 0x98, 0x59, 0xd1, 0x5a, 0xba, 0x51, 0x6b, + 0x37, 0xf5, 0x48, 0xd7, 0x1c, 0xae, 0x40, 0xda, 0x26, 0x32, 0xfd, 0x39, 0xc8, 0xc7, 0x8b, 0x29, + 0x9a, 0x42, 0x26, 0xa3, 0x87, 0x30, 0x8d, 0x0f, 0xdb, 0xba, 0xa5, 0x10, 0x15, 0x33, 0x88, 0x94, + 0x18, 0xbf, 0x6e, 0x79, 0x9f, 0xd7, 0x87, 0x49, 0xbc, 0x66, 0x8f, 0x01, 0x05, 0x2b, 0x16, 0xe5, + 0x18, 0x22, 0xc3, 0x2c, 0x15, 0xbd, 0x63, 0xd8, 0x11, 0x6b, 0x8d, 0x8f, 0x82, 0x5f, 0x82, 0xb9, + 0xee, 0x0f, 0x44, 0x59, 0xfa, 0x77, 0x79, 0x8b, 0x6f, 0x60, 0xeb, 0x23, 0x82, 0xe9, 0x41, 0xf1, + 0x51, 0x96, 0xfc, 0x6b, 0x02, 0x5c, 0xa4, 0xb2, 0x69, 0xb7, 0xdc, 0xc3, 0x16, 0xdd, 0x6b, 0x8a, + 0xd2, 0x68, 0x2f, 0x43, 0x92, 0xa1, 0x6e, 0x6a, 0xb1, 0x93, 0xab, 0x19, 0xe2, 0x5e, 0xd5, 0x1c, + 0xd3, 0x22, 0xee, 0x15, 0x4f, 0xe2, 0xf5, 0x54, 0x60, 0x3e, 0xac, 0x2c, 0x11, 0x2f, 0x4b, 0xcc, + 0x70, 0x2f, 0x97, 0x98, 0x78, 0x69, 0x9f, 0xb8, 0x77, 0xa8, 0x0c, 0x19, 0x95, 0x3e, 0xc9, 0xce, + 0x51, 0x1b, 0x53, 0xf9, 0xf9, 0x61, 0x0e, 0x32, 0x63, 0xab, 0x1f, 0xb5, 0x31, 0xf1, 0xb2, 0xdd, + 0x67, 0xa2, 0xae, 0x40, 0x55, 0x87, 0xba, 0xd8, 0xb4, 0x7f, 0xd1, 0xbc, 0xae, 0x97, 0xda, 0xa5, + 0x89, 0xef, 0xc7, 0xb9, 0x2a, 0xd8, 0x97, 0x38, 0x53, 0xa4, 0x4e, 0xd5, 0x3b, 0x70, 0x5e, 0xc3, + 0x6d, 0x0b, 0xab, 0x8a, 0x83, 0x35, 0x39, 0x58, 0xfd, 0xd8, 0x29, 0xaa, 0x3f, 0xe7, 0xcb, 0xf0, + 0xa9, 0xe8, 0x31, 0xa0, 0x80, 0x6c, 0x56, 0x33, 0x17, 0xb4, 0x9d, 0x46, 0x29, 0x33, 0xbe, 0x14, + 0x46, 0xb7, 0x51, 0x09, 0x52, 0xf8, 0xb0, 0x2d, 0xd3, 0x0d, 0xd7, 0xc4, 0x29, 0x37, 0x5c, 0xa7, + 0xf0, 0x61, 0x9b, 0x10, 0xd1, 0x0e, 0x99, 0xe9, 0x5c, 0x07, 0x80, 0x16, 0xdb, 0x1e, 0x8d, 0x8a, + 0x7c, 0x7b, 0xe1, 0xe2, 0xa6, 0xbd, 0xb9, 0x9f, 0x89, 0xe0, 0x6d, 0xf7, 0xbe, 0x00, 0xcf, 0x85, + 0xb6, 0x5d, 0x94, 0x93, 0x9d, 0xbb, 0xe7, 0x1c, 0x3b, 0xcb, 0x9e, 0x73, 0xf1, 0x4f, 0xdd, 0x5e, + 0x2f, 0xe1, 0xa6, 0x49, 0xd4, 0xfb, 0x11, 0xac, 0xd1, 0x4d, 0xb9, 0xcd, 0x1e, 0x3b, 0x75, 0xb3, + 0xbb, 0xac, 0x3d, 0xc3, 0x42, 0x4f, 0x61, 0xa3, 0x1c, 0x16, 0x7e, 0x57, 0x80, 0xd9, 0x0a, 0x56, + 0x2c, 0x67, 0x17, 0x2b, 0x4e, 0xfd, 0x30, 0x52, 0x07, 0xf6, 0x55, 0x88, 0x1b, 0xe6, 0xc1, 0x69, + 0x96, 0x29, 0x49, 0x7e, 0x7f, 0xda, 0xea, 0x2e, 0x57, 0x94, 0xb5, 0xfe, 0xdb, 0x18, 0xa4, 0xef, + 0x97, 0xa2, 0xac, 0xeb, 0x67, 0xf9, 0x62, 0x36, 0xeb, 0xea, 0x61, 0x66, 0xe9, 0x7d, 0x6f, 0xf9, + 0x7e, 0x69, 0x1d, 0x1f, 0xb9, 0x66, 0x49, 0xb8, 0xd0, 0x0a, 0xa4, 0x9d, 0x7d, 0xe2, 0xa7, 0x9a, + 0x4d, 0xed, 0x34, 0x3e, 0x8b, 0xcf, 0x35, 0xff, 0x04, 0x26, 0xa9, 0x5c, 0x37, 0x1c, 0x42, 0x08, + 0x09, 0x87, 0x20, 0x9f, 0xf1, 0xdc, 0xbe, 0xd8, 0x69, 0x3e, 0xe3, 0x12, 0x58, 0xe3, 0x78, 0xbe, + 0xd1, 0xa4, 0x98, 0x2c, 0xbe, 0x05, 0x40, 0xaa, 0x16, 0x65, 0xf3, 0x7c, 0x3f, 0x0e, 0xf9, 0xed, + 0x8e, 0xbd, 0x1f, 0xb1, 0x3d, 0x96, 0x00, 0xda, 0x1d, 0x7b, 0x1f, 0x5b, 0xb2, 0x73, 0x68, 0xf0, + 0xfa, 0x8f, 0x08, 0xb4, 0x70, 0x15, 0xc0, 0xf8, 0xea, 0x87, 0x06, 0xda, 0xe2, 0x42, 0xb0, 0xec, + 0x47, 0x6b, 0xdc, 0x1c, 0x03, 0x12, 0xd7, 0x0f, 0x8d, 0x0d, 0xec, 0x61, 0x61, 0x26, 0x10, 0x13, + 0x81, 0x9f, 0x85, 0x29, 0xf2, 0x22, 0x3b, 0xe6, 0x69, 0x5a, 0x3e, 0x49, 0x78, 0xea, 0x26, 0x7a, + 0x03, 0xd2, 0x8c, 0x9b, 0xcc, 0x5f, 0x49, 0x3a, 0x7f, 0x85, 0x55, 0x89, 0x6b, 0x93, 0xce, 0x5c, + 0x29, 0xca, 0x4a, 0x66, 0xab, 0x39, 0x98, 0xdc, 0x33, 0x2d, 0x15, 0xd3, 0xf0, 0x8c, 0x94, 0xc4, + 0x5e, 0xd0, 0x4d, 0x98, 0xd1, 0x0d, 0xb5, 0xd9, 0xb1, 0xf5, 0xa7, 0x58, 0x76, 0x8b, 0xc6, 0x00, + 0xd3, 0xb4, 0x97, 0x40, 0x05, 0x9a, 0x41, 0x43, 0x78, 0x90, 0x48, 0xa5, 0xc4, 0x74, 0xf1, 0x5b, + 0x02, 0x4c, 0x7b, 0x6d, 0x17, 0xe5, 0xc0, 0x5f, 0xea, 0x52, 0xfc, 0xe9, 0x5b, 0x8f, 0x28, 0xbb, + 0xf8, 0xf7, 0xd4, 0x0b, 0x52, 0xcd, 0xa7, 0xb4, 0x31, 0xa3, 0x34, 0xae, 0x55, 0x16, 0xbe, 0x13, + 0x3b, 0xa3, 0x41, 0xd0, 0x80, 0x9e, 0xdb, 0x30, 0xa7, 0xb7, 0xc8, 0xcc, 0xa0, 0x3b, 0xcd, 0x23, + 0x8e, 0xe4, 0x1c, 0xec, 0xee, 0x30, 0xcf, 0xfa, 0x69, 0x25, 0x37, 0x89, 0x0f, 0x96, 0x6c, 0xcf, + 0xc9, 0xaf, 0x56, 0x94, 0x7a, 0xaf, 0x42, 0xce, 0x62, 0xa2, 0x89, 0x47, 0x73, 0x4a, 0xd5, 0x67, + 0x3d, 0x56, 0xa2, 0xfd, 0xef, 0xc6, 0x60, 0xfa, 0xad, 0x0e, 0xb6, 0x8e, 0x3e, 0x86, 0xba, 0xbf, + 0x06, 0xd3, 0x07, 0x8a, 0xee, 0xc8, 0x7b, 0xa6, 0x25, 0x77, 0xda, 0x9a, 0xe2, 0xb8, 0x81, 0x26, + 0x39, 0x42, 0xbe, 0x67, 0x5a, 0x3b, 0x94, 0x88, 0x30, 0xa0, 0x27, 0x86, 0x79, 0x60, 0xc8, 0x84, + 0x4c, 0x81, 0xf4, 0xa1, 0xc1, 0x97, 0xd3, 0x57, 0x3f, 0xfd, 0x4f, 0xc7, 0x8b, 0x77, 0xc7, 0x0a, + 0x1d, 0xa3, 0xd1, 0x77, 0x9d, 0x8e, 0xae, 0x2d, 0xef, 0xec, 0x54, 0xd7, 0x24, 0x91, 0x8a, 0x7c, + 0x9b, 0x49, 0xac, 0x1f, 0x1a, 0xae, 0x03, 0xf0, 0xa1, 0x00, 0xa2, 0xaf, 0xb0, 0x28, 0x5b, 0xb5, + 0x0c, 0x99, 0xf7, 0x3a, 0xd8, 0xd2, 0xcf, 0xd0, 0xa6, 0xc0, 0x19, 0xc9, 0xe0, 0xf5, 0x0e, 0x64, + 0xbb, 0xf4, 0x10, 0xff, 0xd5, 0xf4, 0x90, 0x39, 0xf0, 0x55, 0x50, 0xfc, 0x91, 0x00, 0x88, 0x56, + 0xbe, 0xca, 0x76, 0x32, 0x3e, 0x66, 0x06, 0x73, 0x03, 0x44, 0x1a, 0xcc, 0x29, 0xeb, 0x7b, 0x72, + 0x4b, 0xb7, 0x6d, 0xdd, 0x68, 0x70, 0x8b, 0xc9, 0x53, 0x7a, 0x75, 0x6f, 0x83, 0x51, 0x79, 0x5b, + 0xfe, 0x1a, 0xcc, 0x76, 0xd5, 0x26, 0xca, 0xd6, 0xbc, 0x04, 0xd9, 0x3d, 0xb3, 0x63, 0x68, 0x32, + 0x5b, 0x48, 0xe3, 0x0b, 0x86, 0x19, 0x4a, 0x63, 0xdf, 0x2b, 0x7e, 0x35, 0x06, 0x73, 0x12, 0xb6, + 0xcd, 0xe6, 0x53, 0x1c, 0xbd, 0x3e, 0xb7, 0x80, 0x6f, 0x37, 0xc9, 0xbf, 0x8a, 0x5a, 0xd3, 0x4c, + 0x06, 0x9b, 0x14, 0xbb, 0xf7, 0x15, 0xae, 0x0c, 0xb7, 0xcc, 0xfe, 0x9d, 0x04, 0xbe, 0xce, 0x97, + 0x08, 0xae, 0xf3, 0xf1, 0x86, 0xf8, 0x7f, 0x70, 0xae, 0x47, 0x11, 0x51, 0xfa, 0x2e, 0x3f, 0x89, + 0xc1, 0xc5, 0x6e, 0xf1, 0x51, 0x23, 0x8c, 0xff, 0x1d, 0xca, 0x46, 0x15, 0xc8, 0xb5, 0x74, 0xe3, + 0x6c, 0xeb, 0x8c, 0xd9, 0x96, 0x6e, 0xd4, 0xbb, 0x7d, 0x4e, 0x02, 0x86, 0xc2, 0xf4, 0x1a, 0x65, + 0xdb, 0x7d, 0x43, 0x80, 0x6c, 0xd4, 0x2b, 0x59, 0x67, 0x8b, 0x2e, 0xe3, 0x75, 0xae, 0x43, 0xee, + 0x23, 0x58, 0xfa, 0xfa, 0x63, 0x01, 0x50, 0xdd, 0xea, 0x18, 0x04, 0x52, 0x3e, 0x34, 0x1b, 0x51, + 0x56, 0x76, 0x0e, 0x26, 0x75, 0x43, 0xc3, 0x87, 0xb4, 0xb2, 0x09, 0x89, 0xbd, 0x74, 0xed, 0x3a, + 0xc6, 0xc7, 0xda, 0x75, 0xf4, 0x83, 0x54, 0xba, 0x0a, 0x1a, 0xa5, 0x16, 0xbe, 0x1b, 0x83, 0x59, + 0x5e, 0x9d, 0xc8, 0x97, 0xfe, 0xce, 0x14, 0xda, 0x8e, 0x3e, 0x07, 0xd0, 0xb6, 0xf0, 0x53, 0x99, + 0xb1, 0xc6, 0xc7, 0x62, 0x4d, 0x13, 0x0e, 0x4a, 0x40, 0x5f, 0x84, 0x69, 0xd2, 0xe1, 0xda, 0x96, + 0xd9, 0x36, 0x6d, 0x32, 0xaf, 0xdb, 0xe3, 0x01, 0x8a, 0x99, 0x93, 0xe3, 0xc5, 0xdc, 0x86, 0x6e, + 0x6c, 0x73, 0xc6, 0x7a, 0x4d, 0x22, 0x3d, 0xd7, 0x7b, 0x75, 0x9d, 0x91, 0x7f, 0x10, 0x60, 0xee, + 0x23, 0x5b, 0x2c, 0xfd, 0x9f, 0xd0, 0x98, 0x37, 0x1f, 0x88, 0xf4, 0xb5, 0x6a, 0xec, 0x99, 0xd1, + 0x2f, 0x61, 0x7f, 0x43, 0x80, 0x99, 0x80, 0xf8, 0x28, 0x67, 0xfd, 0xb3, 0x1d, 0xa0, 0xf8, 0x12, + 0xf1, 0x03, 0x82, 0x66, 0x1f, 0x65, 0xa7, 0xfa, 0xeb, 0x18, 0x9c, 0x2f, 0xb1, 0xfd, 0x68, 0x37, + 0x58, 0x23, 0x4a, 0x2b, 0x29, 0xc0, 0xd4, 0x53, 0x6c, 0xd9, 0xba, 0xc9, 0xe6, 0xbd, 0x9c, 0xe4, + 0xbe, 0xa2, 0x79, 0x48, 0xd9, 0x86, 0xd2, 0xb6, 0xf7, 0x4d, 0x77, 0xef, 0xcb, 0x7b, 0xf7, 0x02, + 0x4b, 0x26, 0xcf, 0x1e, 0x58, 0x92, 0x1c, 0x1e, 0x58, 0x32, 0xf5, 0x2b, 0x07, 0x96, 0xf0, 0x8d, + 0xa6, 0x1f, 0x0a, 0x70, 0xa1, 0x4f, 0x7f, 0x51, 0xda, 0xcc, 0x57, 0x20, 0xa3, 0x72, 0xc1, 0x64, + 0x34, 0x66, 0x7b, 0x69, 0x55, 0x92, 0xed, 0x8c, 0x3e, 0xfb, 0xc9, 0xf1, 0x22, 0xb8, 0x45, 0xad, + 0xae, 0x71, 0x15, 0x91, 0x67, 0xad, 0xf8, 0x9f, 0x00, 0xb9, 0xf2, 0x61, 0xdb, 0xb4, 0x9c, 0x1a, + 0x73, 0x49, 0xd0, 0x1a, 0xa4, 0xda, 0x96, 0xf9, 0x54, 0x77, 0x2b, 0x91, 0x0f, 0xdd, 0x70, 0xee, + 0xe2, 0xd9, 0xe6, 0xf9, 0x25, 0x8f, 0x13, 0x49, 0x90, 0x7e, 0x68, 0xaa, 0x4a, 0xf3, 0x9e, 0xde, + 0x74, 0x6d, 0x7f, 0x79, 0x94, 0x98, 0x65, 0x8f, 0x63, 0x5b, 0x71, 0xf6, 0xdd, 0x46, 0xf0, 0x88, + 0xe8, 0x3e, 0xa4, 0x2a, 0x8e, 0xd3, 0x26, 0x89, 0x7c, 0x1c, 0xb9, 0x3a, 0x52, 0x24, 0x61, 0xe0, + 0x92, 0x3c, 0x66, 0x24, 0xc1, 0xcc, 0x7d, 0xd3, 0x6c, 0x34, 0x71, 0xa9, 0x69, 0x76, 0xb4, 0x92, + 0x69, 0xec, 0xe9, 0x0d, 0x3e, 0x0e, 0x5f, 0x19, 0x29, 0xf1, 0x7e, 0xa9, 0x26, 0xf5, 0xb3, 0xa3, + 0xcf, 0x43, 0xaa, 0x76, 0x97, 0x8b, 0x62, 0x5e, 0xd4, 0xe5, 0x91, 0xa2, 0x6a, 0x77, 0x25, 0x8f, + 0x09, 0x55, 0x20, 0xb3, 0xf2, 0xac, 0x63, 0x61, 0x2e, 0x23, 0x49, 0x65, 0x5c, 0x1b, 0x29, 0x83, + 0xf2, 0x48, 0x41, 0x56, 0xf4, 0x16, 0xe4, 0xdf, 0x36, 0xad, 0x27, 0x4d, 0x53, 0x71, 0xeb, 0x36, + 0x45, 0x85, 0xbd, 0x38, 0x52, 0x98, 0xcb, 0x26, 0xf5, 0x08, 0x98, 0xff, 0x22, 0xe4, 0xba, 0x1a, + 0x07, 0x21, 0x48, 0xb4, 0x49, 0x3b, 0x08, 0x34, 0x0c, 0x88, 0x3e, 0xa3, 0x57, 0x60, 0xca, 0x30, + 0x35, 0xec, 0xda, 0x6c, 0x6e, 0x75, 0xee, 0xe4, 0x78, 0x31, 0xb9, 0x69, 0x6a, 0xcc, 0x81, 0xe0, + 0x4f, 0x52, 0x92, 0x64, 0x72, 0xdd, 0x87, 0xf9, 0x6b, 0x90, 0x20, 0xed, 0x42, 0x86, 0x8d, 0x5d, + 0xc5, 0xc6, 0x3b, 0x96, 0xce, 0x65, 0xba, 0xaf, 0x3c, 0xdf, 0x4f, 0x05, 0x88, 0xd5, 0xee, 0x12, + 0x4f, 0x76, 0xb7, 0xa3, 0x3e, 0xc1, 0x0e, 0xcf, 0xc5, 0xdf, 0xa8, 0x87, 0x6b, 0xe1, 0x3d, 0x9d, + 0x79, 0x35, 0x69, 0x89, 0xbf, 0xa1, 0x17, 0x00, 0x14, 0x55, 0xc5, 0xb6, 0x2d, 0xbb, 0xe7, 0xcf, + 0xd2, 0x52, 0x9a, 0x51, 0xd6, 0xf1, 0x11, 0x61, 0xb3, 0xb1, 0x6a, 0x61, 0xc7, 0x8d, 0x67, 0x62, + 0x6f, 0x84, 0xcd, 0xc1, 0xad, 0xb6, 0xec, 0x98, 0x4f, 0xb0, 0x41, 0xdb, 0x33, 0x4d, 0x86, 0x83, + 0x56, 0xbb, 0x4e, 0x08, 0x64, 0x24, 0xc3, 0x86, 0xe6, 0x0f, 0x3b, 0x69, 0xc9, 0x7b, 0x27, 0x22, + 0x2d, 0xdc, 0xd0, 0xf9, 0x81, 0xaa, 0xb4, 0xc4, 0xdf, 0x88, 0xc6, 0x94, 0x8e, 0xb3, 0x4f, 0xc3, + 0x1e, 0xd2, 0x12, 0x7d, 0xe6, 0x55, 0xfb, 0xa6, 0x00, 0xf1, 0xfb, 0xa5, 0xda, 0xa9, 0xeb, 0xe6, + 0x4a, 0x8c, 0xfb, 0x12, 0x69, 0x18, 0xa1, 0xde, 0x6c, 0x12, 0xb0, 0xdf, 0xb6, 0xcc, 0xaf, 0x60, + 0xd5, 0xad, 0x59, 0x9e, 0x93, 0xb7, 0x19, 0x15, 0x2d, 0x41, 0x46, 0xb5, 0xb0, 0x86, 0x0d, 0x47, + 0x57, 0x9a, 0x36, 0xaf, 0x62, 0x90, 0xc4, 0x0b, 0xf7, 0x55, 0x01, 0x26, 0xa9, 0x71, 0xa1, 0xe7, + 0x21, 0xad, 0x9a, 0x86, 0xa3, 0xe8, 0x06, 0x1f, 0x19, 0xd2, 0x92, 0x4f, 0x18, 0x58, 0xc8, 0x4b, + 0x90, 0x55, 0x54, 0xd5, 0xec, 0x18, 0x8e, 0x6c, 0x28, 0x2d, 0xcc, 0x0b, 0x9b, 0xe1, 0xb4, 0x4d, + 0xa5, 0x85, 0xd1, 0x22, 0xb8, 0xaf, 0xde, 0x29, 0xc0, 0xb4, 0x04, 0x9c, 0xb4, 0x8e, 0x8f, 0x78, + 0x49, 0x7e, 0x28, 0x40, 0xca, 0x35, 0x4b, 0x52, 0x98, 0x06, 0x36, 0xb0, 0xa5, 0x38, 0xa6, 0x57, + 0x18, 0x8f, 0xd0, 0x3b, 0x07, 0xa5, 0xfd, 0x39, 0x68, 0x0e, 0x26, 0x1d, 0x65, 0xb7, 0xe9, 0x96, + 0x83, 0xbd, 0xd0, 0x45, 0xd6, 0xa6, 0xd2, 0x60, 0x6b, 0x44, 0x69, 0x89, 0xbd, 0x90, 0x2a, 0xf1, + 0xb8, 0x55, 0xa6, 0x1d, 0xfe, 0x46, 0xca, 0xcb, 0x42, 0x35, 0x77, 0x71, 0x43, 0x37, 0xa8, 0x01, + 0xc4, 0x25, 0xa0, 0x24, 0x1a, 0xcb, 0x84, 0x9e, 0x83, 0x34, 0xcb, 0x80, 0x0d, 0x8d, 0x5a, 0x41, + 0x5c, 0x4a, 0x51, 0x42, 0xd9, 0x3d, 0xf6, 0xc4, 0x1d, 0x8f, 0x3f, 0x13, 0x60, 0x86, 0x45, 0xa8, + 0xb0, 0x18, 0xcf, 0xe8, 0x66, 0xe1, 0xd7, 0x21, 0xad, 0x29, 0x8e, 0xc2, 0x4e, 0x1d, 0xc6, 0x86, + 0x9e, 0x3a, 0x74, 0x87, 0x47, 0x92, 0x9f, 0x9e, 0x3c, 0x44, 0x90, 0x20, 0xcf, 0xec, 0xb4, 0xa6, + 0x44, 0x9f, 0xfd, 0xbd, 0xfe, 0x60, 0x71, 0xa3, 0xf4, 0x4a, 0x7e, 0x34, 0xe9, 0x4e, 0x44, 0x51, + 0xaa, 0xe1, 0x0b, 0x30, 0xc5, 0xa1, 0x36, 0x57, 0xc2, 0xd2, 0xa8, 0x31, 0xd0, 0xdd, 0xe5, 0xe3, + 0x6c, 0x68, 0x15, 0x80, 0x85, 0x56, 0xd2, 0x58, 0x95, 0xf8, 0x29, 0x36, 0x64, 0x28, 0x1b, 0xa1, + 0xa2, 0x4d, 0xc8, 0xb4, 0x9e, 0xaa, 0xaa, 0xbc, 0xa7, 0x37, 0x1d, 0x1e, 0xc6, 0x15, 0x1e, 0x05, + 0xbd, 0xf1, 0xa8, 0x54, 0xba, 0x47, 0x33, 0xb1, 0x68, 0x2a, 0xff, 0x5d, 0x02, 0x22, 0x81, 0x3d, + 0xa3, 0x97, 0x81, 0x9f, 0x11, 0x91, 0x6d, 0xf7, 0xc4, 0xd7, 0x6a, 0xee, 0xe4, 0x78, 0x31, 0x2d, + 0x51, 0x6a, 0xad, 0x56, 0x97, 0xd2, 0x2c, 0x43, 0xcd, 0x76, 0xd0, 0x65, 0xc8, 0x99, 0x2d, 0xdd, + 0x91, 0xdd, 0x59, 0x9f, 0x3b, 0x4a, 0x59, 0x42, 0x74, 0xbd, 0x02, 0x54, 0x87, 0xeb, 0xd8, 0x20, + 0x7d, 0x81, 0xd6, 0x93, 0x45, 0xff, 0xcb, 0xba, 0xc3, 0xfa, 0x93, 0x6c, 0xb6, 0x1d, 0xbd, 0xa5, + 0x3f, 0xa3, 0x9b, 0xa1, 0x7c, 0x23, 0xe2, 0x32, 0xcb, 0x4e, 0xea, 0x47, 0xcf, 0x03, 0x54, 0x79, + 0xde, 0xad, 0x40, 0x56, 0xf4, 0x55, 0x81, 0x1e, 0x2b, 0x20, 0x8a, 0x94, 0x77, 0x8f, 0xe4, 0x26, + 0x99, 0x42, 0x74, 0xe7, 0x48, 0x7e, 0xf2, 0xb4, 0x90, 0xa2, 0xee, 0xd8, 0x67, 0x06, 0x36, 0x87, + 0xbb, 0x11, 0xe7, 0x36, 0xcb, 0xd1, 0x43, 0xce, 0xbc, 0xfe, 0xb4, 0x6c, 0x38, 0xd6, 0xd1, 0xea, + 0x85, 0x93, 0xe3, 0xc5, 0xd9, 0xfe, 0xd4, 0x47, 0xf4, 0xa8, 0x42, 0x2f, 0xcb, 0xfc, 0x3e, 0x14, + 0x06, 0x49, 0x42, 0xa2, 0xbf, 0x1b, 0x97, 0x66, 0x9b, 0x70, 0x9f, 0xea, 0x5e, 0x0f, 0x18, 0x69, + 0x34, 0xee, 0x8a, 0x40, 0xec, 0x35, 0xb7, 0x67, 0x7f, 0x5d, 0x80, 0xdc, 0x6a, 0xa7, 0xf9, 0x64, + 0xab, 0x5d, 0xeb, 0xb4, 0x5a, 0x8a, 0x75, 0x44, 0x06, 0x05, 0xd6, 0x23, 0xf5, 0x67, 0x2c, 0x88, + 0x23, 0xce, 0xbb, 0x9c, 0xfe, 0x0c, 0x93, 0x2e, 0xc7, 0x03, 0xcf, 0x09, 0x9d, 0x45, 0x95, 0x5f, + 0x86, 0x1c, 0x85, 0xe6, 0x32, 0x36, 0x1c, 0x4b, 0xc7, 0x6c, 0xe5, 0x27, 0x2e, 0x65, 0x29, 0xb1, + 0xcc, 0x68, 0xe8, 0x2a, 0xe4, 0xed, 0x23, 0xdb, 0xc1, 0x2d, 0x99, 0x9d, 0x0f, 0x67, 0x78, 0x32, + 0x2e, 0xe5, 0x18, 0x55, 0x62, 0xc4, 0xe2, 0xcf, 0xe2, 0x90, 0x77, 0xf5, 0x1a, 0xa5, 0xab, 0xba, + 0x0a, 0x93, 0x7b, 0x7a, 0x13, 0xbb, 0xfb, 0xe8, 0xd7, 0x86, 0x34, 0x27, 0x0f, 0x28, 0x26, 0x1e, + 0x84, 0x0b, 0x76, 0x28, 0x6b, 0x14, 0x3d, 0x6c, 0xfe, 0x37, 0x62, 0x90, 0xa0, 0x3e, 0xe2, 0x6d, + 0x48, 0xd0, 0x21, 0x4f, 0x18, 0x67, 0xc8, 0xa3, 0x59, 0x3d, 0x57, 0x26, 0x16, 0x70, 0x65, 0x88, + 0x5f, 0xb0, 0xaf, 0xbc, 0x7a, 0xfb, 0x0e, 0xed, 0x5d, 0x59, 0x89, 0xbf, 0xa1, 0x55, 0x1a, 0xe0, + 0x61, 0x5a, 0x0e, 0xd6, 0xb8, 0x87, 0x16, 0x66, 0x1b, 0x5d, 0x0d, 0xef, 0x0e, 0xaf, 0x2e, 0x1f, + 0xba, 0x08, 0x71, 0xd2, 0x6d, 0xa7, 0xd8, 0xe6, 0xef, 0xc9, 0xf1, 0x62, 0x9c, 0x74, 0x58, 0x42, + 0x43, 0xb7, 0x20, 0xd3, 0xdd, 0x47, 0x84, 0x1b, 0x69, 0x36, 0x12, 0x04, 0xec, 0x1b, 0x9a, 0x9e, + 0xfd, 0x32, 0x44, 0xf2, 0x20, 0x91, 0x4a, 0x88, 0x93, 0xc5, 0xef, 0x25, 0x20, 0x57, 0x6d, 0x45, + 0x3d, 0x82, 0xae, 0x74, 0xb7, 0x70, 0x98, 0xc7, 0xdd, 0xf5, 0xd1, 0x90, 0x06, 0xee, 0x9a, 0x8b, + 0xe2, 0xa7, 0x9b, 0x8b, 0xaa, 0xc4, 0x9b, 0xe2, 0x67, 0xe0, 0xc9, 0xf7, 0x5f, 0x1a, 0xf9, 0xfd, + 0x3a, 0x19, 0x96, 0x24, 0xc2, 0xe3, 0x87, 0xd8, 0xd3, 0x0d, 0xfc, 0x37, 0xa9, 0xd3, 0xc6, 0xac, + 0x2c, 0x39, 0xbe, 0x95, 0x4d, 0x61, 0x43, 0xa3, 0x36, 0x76, 0xc8, 0x4d, 0xec, 0x35, 0x88, 0x6b, + 0xfa, 0x30, 0x95, 0x86, 0xcd, 0x27, 0x84, 0x65, 0x84, 0xa5, 0x25, 0x82, 0x96, 0x16, 0x44, 0x9c, + 0xf3, 0x5b, 0x00, 0x7e, 0xad, 0xd0, 0x12, 0x24, 0xcd, 0xa6, 0xe6, 0x9e, 0x0e, 0xc8, 0xad, 0xa6, + 0x4f, 0x8e, 0x17, 0x27, 0xb7, 0x9a, 0x5a, 0x75, 0x4d, 0x9a, 0x34, 0x9b, 0x5a, 0x55, 0xa3, 0x57, + 0x07, 0xe0, 0x03, 0xd9, 0x8b, 0xc1, 0xc9, 0x4a, 0x53, 0x06, 0x3e, 0x20, 0xf8, 0xb6, 0x27, 0x36, + 0x80, 0x98, 0xcd, 0xb7, 0x05, 0xc8, 0xbb, 0x1a, 0x8c, 0x76, 0x68, 0x48, 0xe9, 0x2d, 0xde, 0x55, + 0xe2, 0xa7, 0xeb, 0x2a, 0x2e, 0x1f, 0x3f, 0xe0, 0xf8, 0x35, 0x81, 0xc7, 0x5f, 0xd6, 0x54, 0xc5, + 0x21, 0x73, 0x61, 0x84, 0xe6, 0xfd, 0x22, 0x88, 0x96, 0x62, 0x68, 0x66, 0x4b, 0x7f, 0x86, 0xd9, + 0x12, 0x95, 0xcd, 0x77, 0x66, 0xa6, 0x3d, 0x3a, 0x5d, 0x83, 0x71, 0x57, 0xd8, 0xfe, 0x5d, 0xe0, + 0xb1, 0x9a, 0x5e, 0x61, 0xa2, 0x54, 0xda, 0x3a, 0x24, 0x2d, 0x16, 0xf1, 0xc5, 0xba, 0xdb, 0x2b, + 0x21, 0x42, 0xc2, 0xbe, 0xce, 0x02, 0xaa, 0x3c, 0x83, 0xa7, 0x22, 0xe6, 0xbf, 0x00, 0x93, 0x94, + 0x7c, 0x86, 0x41, 0x91, 0x6b, 0xfe, 0x8f, 0x62, 0x30, 0xb3, 0xa2, 0x69, 0xb5, 0x1a, 0x37, 0xbf, + 0xe8, 0xf4, 0xee, 0xfa, 0x98, 0x31, 0xdf, 0xc7, 0x44, 0xaf, 0x00, 0xd2, 0x74, 0x9b, 0x1d, 0x6c, + 0xb7, 0xf7, 0x15, 0xcd, 0x3c, 0xf0, 0xf7, 0xeb, 0x66, 0xdc, 0x94, 0x9a, 0x9b, 0x80, 0xde, 0x01, + 0xea, 0x13, 0xc9, 0xb6, 0xa3, 0x78, 0xcb, 0xa8, 0x2f, 0x9f, 0xe6, 0xe0, 0x03, 0xf3, 0x99, 0xbc, + 0x57, 0x29, 0x4d, 0xc4, 0xd1, 0x47, 0x74, 0x03, 0x44, 0x9d, 0xe8, 0xd0, 0x91, 0x15, 0xdb, 0x8d, + 0x36, 0x67, 0x27, 0xeb, 0xf3, 0x8c, 0xbe, 0x62, 0x07, 0x83, 0xc8, 0x59, 0x10, 0xac, 0xaf, 0xa7, + 0x28, 0x1d, 0xe3, 0x36, 0xe4, 0x79, 0x80, 0x7c, 0xc4, 0x9b, 0x00, 0xb4, 0x5a, 0xdc, 0xd8, 0xd9, + 0x8b, 0x7f, 0xda, 0xdd, 0xfb, 0x62, 0x94, 0x35, 0xe9, 0xc0, 0xac, 0x2b, 0x37, 0xea, 0xfd, 0xb6, + 0x61, 0xd5, 0xa1, 0x8b, 0xa9, 0xc1, 0xcf, 0x46, 0x59, 0xa7, 0x7f, 0x11, 0x20, 0x5f, 0xeb, 0xec, + 0xb2, 0x2b, 0x4f, 0xa2, 0xab, 0x4f, 0x19, 0xd2, 0x4d, 0xbc, 0xe7, 0xc8, 0x67, 0x0a, 0xa3, 0x4c, + 0x11, 0x56, 0x1a, 0x4a, 0xba, 0x02, 0x60, 0xd1, 0x03, 0x13, 0x54, 0x4e, 0x7c, 0x5c, 0x39, 0x52, + 0x9a, 0x72, 0xf9, 0x13, 0x46, 0xf1, 0x7b, 0x31, 0x98, 0xf6, 0xaa, 0x19, 0xe5, 0x80, 0xf7, 0xff, + 0xbb, 0x3a, 0x71, 0xfc, 0x0c, 0x9d, 0x78, 0x86, 0xc8, 0x1c, 0xd8, 0x91, 0x97, 0x61, 0x96, 0x8e, + 0xea, 0xb2, 0xd2, 0x6e, 0x37, 0x75, 0xac, 0xc9, 0x6c, 0xeb, 0x2b, 0x41, 0xb7, 0xbe, 0x66, 0x68, + 0xd2, 0x0a, 0x4b, 0xa9, 0xd2, 0x6d, 0xb0, 0x7b, 0x90, 0xdd, 0xb3, 0x30, 0x7e, 0x86, 0x65, 0xea, + 0x5c, 0x9e, 0x66, 0x43, 0x34, 0xc3, 0x18, 0x6b, 0x84, 0x8f, 0x8f, 0x9f, 0xef, 0xc2, 0x0c, 0x55, + 0x6d, 0xd4, 0x87, 0xce, 0x78, 0xab, 0xfc, 0x9b, 0x00, 0x28, 0x28, 0xff, 0xa3, 0x6b, 0x98, 0x58, + 0xe4, 0x0d, 0xf3, 0x32, 0x20, 0x16, 0xa3, 0x62, 0xcb, 0x6d, 0x6c, 0xc9, 0x36, 0x56, 0x4d, 0x7e, + 0x4f, 0x87, 0x20, 0x89, 0x3c, 0x65, 0x1b, 0x5b, 0x35, 0x4a, 0x2f, 0xfe, 0xc7, 0x45, 0xc8, 0x72, + 0x9d, 0xec, 0x18, 0x04, 0x59, 0xde, 0x86, 0x78, 0x83, 0x2f, 0x94, 0x65, 0x42, 0xa1, 0xb4, 0x7f, + 0x57, 0x50, 0x65, 0x42, 0x22, 0x79, 0x09, 0x4b, 0xbb, 0xe3, 0x84, 0xc4, 0x54, 0xfa, 0x01, 0x78, + 0x41, 0x96, 0x76, 0xc7, 0x41, 0x35, 0x98, 0x56, 0xfd, 0xbb, 0x52, 0x64, 0xc2, 0x1e, 0x1f, 0x78, + 0x06, 0x2b, 0xf4, 0xc6, 0x99, 0xca, 0x84, 0x94, 0x57, 0xbb, 0x12, 0x50, 0x29, 0x78, 0x39, 0x47, + 0x62, 0xe0, 0x52, 0x71, 0xef, 0xc5, 0x20, 0x95, 0x89, 0xc0, 0x1d, 0x1e, 0xe8, 0x75, 0x48, 0x6a, + 0xf4, 0xd2, 0x07, 0x6e, 0xa1, 0x61, 0x46, 0xd4, 0x75, 0xcf, 0x46, 0x65, 0x42, 0xe2, 0x1c, 0xe8, + 0x01, 0x64, 0xd9, 0x13, 0x3b, 0xea, 0xcf, 0x9d, 0xe1, 0xab, 0x83, 0x25, 0x04, 0x46, 0xeb, 0xca, + 0x84, 0x94, 0xd1, 0x7c, 0x2a, 0xfa, 0x24, 0x24, 0x6c, 0x55, 0x31, 0xf8, 0x0a, 0xf3, 0xc2, 0x80, + 0x93, 0xdd, 0x3e, 0x33, 0xcd, 0x8d, 0x1e, 0xc3, 0x0c, 0x5d, 0x3b, 0x93, 0x1d, 0x3f, 0x64, 0x81, + 0xa2, 0x9d, 0xee, 0x28, 0x09, 0xcf, 0x49, 0x0c, 0x3f, 0x86, 0x58, 0x99, 0x90, 0xc4, 0xdd, 0x9e, + 0x24, 0xd2, 0x64, 0xd4, 0xcb, 0x0f, 0x08, 0x4e, 0x0f, 0x6c, 0xb2, 0xd0, 0x83, 0x81, 0xa4, 0xc9, + 0x70, 0x57, 0x02, 0xba, 0x0f, 0x19, 0x85, 0x78, 0x5d, 0x32, 0x3d, 0x9e, 0x53, 0x80, 0x81, 0x5b, + 0x05, 0x7d, 0x47, 0xab, 0x2a, 0xf4, 0x4c, 0xa5, 0x4b, 0xf4, 0x05, 0xb5, 0xb0, 0xd5, 0xc0, 0x85, + 0xcc, 0x70, 0x41, 0xc1, 0x38, 0x07, 0x4f, 0x10, 0x25, 0xa2, 0x0d, 0xc8, 0xed, 0xbb, 0xa1, 0xd7, + 0x34, 0xc6, 0x24, 0x3b, 0x70, 0xbf, 0x20, 0x24, 0x74, 0xbc, 0x32, 0x21, 0x65, 0xf7, 0x03, 0x64, + 0xb4, 0x0c, 0xb1, 0x86, 0x5a, 0xc8, 0x51, 0x19, 0xcf, 0x0f, 0x0b, 0x8c, 0xae, 0x4c, 0x48, 0xb1, + 0x86, 0x4a, 0xb0, 0x14, 0x8b, 0x3a, 0x3d, 0x34, 0x0a, 0xf9, 0x81, 0x83, 0x4c, 0x77, 0x7c, 0x70, + 0x65, 0x42, 0xa2, 0x51, 0xb4, 0xe4, 0x7b, 0xdb, 0x90, 0xb7, 0x58, 0xa0, 0x88, 0x1b, 0x0e, 0x25, + 0x52, 0x29, 0xd7, 0xc3, 0x87, 0xaa, 0xbe, 0x88, 0xa8, 0xca, 0x84, 0x94, 0xb3, 0x82, 0x74, 0xf4, + 0x65, 0x98, 0xeb, 0x96, 0xc8, 0x8d, 0x7b, 0xa6, 0x6f, 0xe4, 0x0a, 0x97, 0xdb, 0x6d, 0xe3, 0xc8, + 0xea, 0x4b, 0x44, 0x9f, 0x86, 0x49, 0xd6, 0x6a, 0x88, 0x8a, 0x0c, 0xdb, 0xa3, 0xec, 0x69, 0x30, + 0x96, 0x9f, 0xf4, 0x37, 0x87, 0x47, 0x48, 0xc8, 0x4d, 0xb3, 0x51, 0x98, 0x1d, 0xd8, 0xdf, 0xfa, + 0x23, 0x3e, 0x48, 0x7f, 0x73, 0x7c, 0x2a, 0x69, 0x77, 0x8b, 0xa5, 0xf0, 0x0d, 0xf5, 0xb9, 0x81, + 0xed, 0x1e, 0x12, 0x38, 0x51, 0xa1, 0xd1, 0x9e, 0x3e, 0x99, 0x14, 0xcd, 0x62, 0x97, 0x29, 0xc8, + 0xb4, 0x1b, 0x9f, 0x1b, 0x58, 0xb4, 0xfe, 0x0b, 0x22, 0x48, 0xd1, 0x2c, 0x9f, 0x8a, 0x1e, 0x81, + 0xc8, 0x8f, 0x39, 0xfb, 0x4b, 0x8d, 0xe7, 0x07, 0x6e, 0x3c, 0x85, 0xef, 0x40, 0x57, 0x26, 0xa4, + 0x69, 0xb5, 0x3b, 0x85, 0x0c, 0x16, 0x54, 0x9e, 0xac, 0xfa, 0xe7, 0xd3, 0x0b, 0x85, 0x81, 0x83, + 0xc5, 0x80, 0xbb, 0x11, 0xc8, 0x60, 0xa1, 0xf6, 0x24, 0x11, 0x33, 0xd6, 0x0d, 0xdd, 0xa1, 0x03, + 0xfb, 0xfc, 0x40, 0x33, 0xee, 0xbe, 0xce, 0x8a, 0x98, 0xb1, 0xce, 0x28, 0xc4, 0x8c, 0x1d, 0x1e, + 0x6d, 0xc1, 0x9b, 0xe3, 0xf9, 0x81, 0x66, 0x1c, 0x16, 0x96, 0x41, 0xcc, 0xd8, 0x09, 0xd2, 0x89, + 0x19, 0xb3, 0x01, 0xa2, 0x47, 0xee, 0x0b, 0x03, 0xcd, 0x78, 0xe0, 0x01, 0x39, 0x62, 0xc6, 0x4a, + 0x5f, 0x22, 0x5a, 0x03, 0x60, 0x1e, 0x91, 0x6e, 0xec, 0x99, 0x85, 0x85, 0x81, 0xf3, 0x4f, 0x6f, + 0xbc, 0x05, 0x99, 0x7f, 0x9a, 0x2e, 0x8d, 0x0c, 0x64, 0xd4, 0xc7, 0x96, 0xe9, 0xbe, 0x46, 0x61, + 0x71, 0xe0, 0x40, 0xd6, 0xb7, 0xbd, 0x41, 0x06, 0xb2, 0x03, 0x8f, 0x48, 0x26, 0x32, 0xb6, 0x32, + 0x56, 0x58, 0x1a, 0xb1, 0xa0, 0x12, 0x98, 0xc8, 0x18, 0x07, 0x5a, 0x81, 0x34, 0xf1, 0x14, 0x8e, + 0xe8, 0x30, 0x74, 0x69, 0xa0, 0x77, 0xdb, 0x13, 0xce, 0x5c, 0x99, 0x90, 0x52, 0xef, 0x71, 0x12, + 0xf9, 0x3c, 0x5b, 0x6d, 0x28, 0x14, 0x07, 0x7e, 0xbe, 0x6b, 0x7d, 0x89, 0x7c, 0x9e, 0x71, 0x20, + 0x15, 0xce, 0xb1, 0xb6, 0xe2, 0xe7, 0xd3, 0x2c, 0x7e, 0x98, 0xaa, 0x70, 0x99, 0x8a, 0x1a, 0x88, + 0xdd, 0x43, 0x8f, 0xcd, 0x55, 0x26, 0xa4, 0x59, 0xa5, 0x3f, 0x95, 0x74, 0x78, 0x3e, 0xf5, 0x30, + 0xc4, 0x5f, 0xb8, 0x32, 0xb0, 0xc3, 0x87, 0xac, 0x91, 0x90, 0x0e, 0xaf, 0x04, 0xc8, 0x6c, 0x02, + 0xd2, 0x64, 0xdb, 0x66, 0xbb, 0x60, 0x57, 0x87, 0x4c, 0x40, 0x3d, 0xb0, 0x9f, 0x4d, 0x40, 0x5a, + 0x8d, 0x71, 0x12, 0x41, 0x6a, 0x13, 0x2b, 0x16, 0x1f, 0x66, 0xaf, 0x0d, 0x14, 0xd4, 0x77, 0x45, + 0x14, 0x11, 0xa4, 0x7a, 0x44, 0x32, 0x61, 0x5b, 0xee, 0xfd, 0x08, 0xdc, 0xdb, 0xbc, 0x3e, 0x70, + 0xc2, 0x0e, 0xbd, 0xc6, 0x81, 0x4c, 0xd8, 0x56, 0x57, 0x02, 0xfa, 0x1c, 0x4c, 0xf1, 0xc3, 0xe6, + 0x85, 0x1b, 0x43, 0x7c, 0xe0, 0x20, 0xac, 0x26, 0xfd, 0x9a, 0xf3, 0xb0, 0x51, 0x96, 0x9d, 0x55, + 0x67, 0xd5, 0x7b, 0x71, 0xc8, 0x28, 0xdb, 0x87, 0x68, 0xd9, 0x28, 0xeb, 0x93, 0xc9, 0x28, 0xcb, + 0xec, 0x94, 0xcf, 0x75, 0x37, 0x07, 0x8e, 0xb2, 0xfd, 0xb1, 0xd4, 0x64, 0x94, 0x7d, 0xcf, 0xa7, + 0x92, 0x9a, 0xd9, 0x0c, 0x88, 0x15, 0x5e, 0x1a, 0x58, 0xb3, 0x6e, 0x44, 0x4a, 0x6a, 0xc6, 0x79, + 0x48, 0xb3, 0xb1, 0x30, 0x3f, 0xa6, 0xe9, 0x97, 0x07, 0x1f, 0x05, 0xed, 0xc5, 0x2d, 0x15, 0xf7, + 0xfa, 0x50, 0xa6, 0x61, 0x6f, 0xa0, 0xb2, 0xf8, 0xc1, 0x37, 0xae, 0xa9, 0x57, 0x86, 0x0f, 0x54, + 0x61, 0x67, 0xfa, 0xbc, 0x81, 0xaa, 0x2b, 0x91, 0x16, 0x95, 0x9d, 0x4c, 0xa0, 0xfd, 0x7b, 0x79, + 0xc8, 0xa9, 0xd5, 0x9e, 0xc3, 0x22, 0xb4, 0xa8, 0x1e, 0xd1, 0xef, 0x42, 0x1d, 0x76, 0xbc, 0xba, + 0x70, 0x6b, 0x78, 0x17, 0xea, 0x3e, 0xe6, 0xed, 0x75, 0x21, 0x4e, 0xf6, 0xe6, 0x4c, 0xd7, 0xc3, + 0xf8, 0xc4, 0xf0, 0x39, 0xb3, 0xd7, 0xb5, 0x60, 0x73, 0x26, 0xbf, 0x49, 0x6b, 0x8a, 0x6f, 0x34, + 0x3d, 0x48, 0xa4, 0xa6, 0x45, 0xf1, 0x41, 0x22, 0x75, 0x41, 0x2c, 0x3c, 0x48, 0xa4, 0x2e, 0x8a, + 0xf3, 0x0f, 0x12, 0xa9, 0xe7, 0xc4, 0xe7, 0x8b, 0x3f, 0xb9, 0x08, 0x39, 0x17, 0xab, 0x31, 0xe4, + 0x73, 0x27, 0x88, 0x7c, 0x16, 0x06, 0x21, 0x1f, 0x8e, 0xee, 0x38, 0xf4, 0xb9, 0x13, 0x84, 0x3e, + 0x0b, 0x83, 0xa0, 0x8f, 0xcf, 0x43, 0xb0, 0x4f, 0x7d, 0x10, 0xf6, 0x79, 0x71, 0x0c, 0xec, 0xe3, + 0x89, 0xea, 0x05, 0x3f, 0x6b, 0xfd, 0xe0, 0xe7, 0xca, 0x70, 0xf0, 0xe3, 0x89, 0x0a, 0xa0, 0x9f, + 0x37, 0x7a, 0xd0, 0xcf, 0xa5, 0x21, 0xe8, 0xc7, 0xe3, 0x77, 0xe1, 0xcf, 0x7a, 0x28, 0xfc, 0xb9, + 0x36, 0x0a, 0xfe, 0x78, 0x72, 0xba, 0xf0, 0xcf, 0xab, 0x5d, 0xf8, 0x67, 0x71, 0x20, 0xfe, 0xf1, + 0xb8, 0x19, 0x00, 0x7a, 0x67, 0x30, 0x00, 0x7a, 0x69, 0x2c, 0x00, 0xe4, 0xc9, 0xeb, 0x47, 0x40, + 0xf5, 0x41, 0x08, 0xe8, 0xc5, 0x31, 0x10, 0x90, 0xdf, 0x70, 0x3d, 0x10, 0xa8, 0x12, 0x06, 0x81, + 0xae, 0x8e, 0x80, 0x40, 0x9e, 0xb4, 0x20, 0x06, 0xaa, 0x84, 0x61, 0xa0, 0xab, 0x23, 0x30, 0x50, + 0x8f, 0x24, 0x06, 0x82, 0x36, 0xc3, 0x41, 0xd0, 0xf5, 0x91, 0x20, 0xc8, 0x93, 0xd6, 0x8d, 0x82, + 0x6e, 0x05, 0x50, 0xd0, 0x0b, 0x03, 0x50, 0x90, 0xc7, 0x4a, 0x60, 0xd0, 0xe7, 0xfb, 0x60, 0x50, + 0x71, 0x18, 0x0c, 0xf2, 0x78, 0x3d, 0x1c, 0xf4, 0xd6, 0x00, 0x1c, 0x74, 0x63, 0x34, 0x0e, 0xf2, + 0x84, 0xf5, 0x00, 0x21, 0x65, 0x28, 0x10, 0x7a, 0x65, 0x4c, 0x20, 0xe4, 0x49, 0x0f, 0x43, 0x42, + 0xaf, 0x75, 0x23, 0xa1, 0xa5, 0xc1, 0x48, 0xc8, 0x13, 0xc3, 0xa1, 0xd0, 0x7a, 0x28, 0x14, 0xba, + 0x36, 0x0a, 0x0a, 0xf9, 0x7d, 0x2f, 0x88, 0x85, 0x36, 0xc3, 0xb1, 0xd0, 0xf5, 0x91, 0x58, 0xc8, + 0x6f, 0xfe, 0x2e, 0x30, 0xb4, 0x1e, 0x0a, 0x86, 0xae, 0x8d, 0x02, 0x43, 0x7e, 0xe1, 0x82, 0x68, + 0xe8, 0xed, 0x81, 0x68, 0xe8, 0xe6, 0x38, 0x68, 0xc8, 0x13, 0xda, 0x07, 0x87, 0xde, 0x19, 0x0c, + 0x87, 0x5e, 0x3a, 0xc5, 0xcd, 0x5e, 0xa1, 0x78, 0xe8, 0xf3, 0x7d, 0x78, 0xa8, 0x38, 0x0c, 0x0f, + 0xf9, 0xf6, 0xec, 0x02, 0x22, 0x65, 0x28, 0x7c, 0x79, 0x65, 0x4c, 0xf8, 0xe2, 0x1b, 0x5f, 0x08, + 0x7e, 0x29, 0x87, 0xe0, 0x97, 0x2b, 0xc3, 0xf1, 0x8b, 0x3f, 0x85, 0xf8, 0x00, 0xa6, 0x12, 0x06, + 0x60, 0xae, 0x8e, 0x00, 0x30, 0xfe, 0x28, 0x14, 0x40, 0x30, 0x6f, 0xf4, 0x20, 0x98, 0x4b, 0x23, + 0x83, 0x20, 0x02, 0x10, 0x66, 0xb5, 0x1f, 0xc2, 0x5c, 0x1e, 0x0a, 0x61, 0x3c, 0x09, 0x3e, 0x86, + 0x79, 0xa3, 0x07, 0xc3, 0x5c, 0x1a, 0x82, 0x61, 0xfc, 0x02, 0x70, 0x10, 0xa3, 0x0d, 0x07, 0x31, + 0xcb, 0xe3, 0x82, 0x18, 0x4f, 0x70, 0x28, 0x8a, 0xd9, 0x0c, 0x47, 0x31, 0xd7, 0xc7, 0xdc, 0xde, + 0xec, 0x83, 0x31, 0x95, 0x30, 0x18, 0x73, 0x75, 0x04, 0x8c, 0x09, 0xce, 0x21, 0x1e, 0x8e, 0xa9, + 0x84, 0xe1, 0x98, 0xab, 0x23, 0x70, 0x8c, 0x2f, 0x29, 0x00, 0x64, 0xea, 0x83, 0x80, 0xcc, 0x8b, + 0x63, 0x00, 0x19, 0x7f, 0xde, 0xed, 0x41, 0x32, 0x6f, 0xf6, 0x22, 0x99, 0xe2, 0x30, 0x24, 0xe3, + 0xf7, 0x48, 0x17, 0xca, 0x6c, 0x86, 0x43, 0x99, 0xeb, 0x23, 0xa1, 0x4c, 0x70, 0x90, 0x0c, 0x60, + 0x99, 0xf5, 0x50, 0x2c, 0x73, 0x6d, 0x14, 0x96, 0xf1, 0x07, 0xc9, 0x20, 0x98, 0x79, 0xb3, 0x17, + 0xcc, 0x14, 0x87, 0x81, 0x19, 0xbf, 0x72, 0x2e, 0x9a, 0xa9, 0x84, 0xa1, 0x99, 0xab, 0x23, 0xd0, + 0x8c, 0xdf, 0x78, 0x01, 0x38, 0xa3, 0x0c, 0x85, 0x33, 0xaf, 0x8c, 0x09, 0x67, 0x7a, 0x06, 0xae, + 0x6e, 0x3c, 0x53, 0x09, 0xc3, 0x33, 0x57, 0x47, 0xe0, 0x99, 0x40, 0x61, 0x7d, 0x40, 0xb3, 0x19, + 0x0e, 0x68, 0xae, 0x8f, 0x04, 0x34, 0x3d, 0xbd, 0xc9, 0x45, 0x34, 0xeb, 0xa1, 0x88, 0xe6, 0xda, + 0x28, 0x44, 0xd3, 0x33, 0xf1, 0x8d, 0x09, 0x69, 0x1e, 0x24, 0x52, 0xcf, 0x8b, 0x2f, 0x14, 0x7f, + 0x39, 0x09, 0xc9, 0x8a, 0x1b, 0x62, 0x14, 0xb8, 0xf2, 0x42, 0x38, 0xcb, 0x95, 0x17, 0x68, 0x8d, + 0xf4, 0x12, 0x3a, 0xd6, 0x8c, 0xbe, 0xdd, 0xa8, 0xff, 0xe6, 0x1d, 0xce, 0x7a, 0x86, 0x33, 0x70, + 0xe8, 0x55, 0xc8, 0x75, 0x6c, 0x6c, 0xc9, 0x6d, 0x4b, 0x37, 0x2d, 0xdd, 0x61, 0xd1, 0xcb, 0xc2, + 0xaa, 0xf8, 0xe1, 0xf1, 0x62, 0x76, 0xc7, 0xc6, 0xd6, 0x36, 0xa7, 0x4b, 0xd9, 0x4e, 0xe0, 0xcd, + 0xfd, 0x23, 0x91, 0xc9, 0xf1, 0xff, 0x48, 0xe4, 0x2d, 0x10, 0x2d, 0xac, 0x68, 0x5d, 0xb3, 0x3e, + 0xbb, 0x4b, 0x22, 0xbc, 0x9d, 0x68, 0xe8, 0xbe, 0x9b, 0x93, 0xde, 0x29, 0x31, 0x6d, 0x75, 0x13, + 0xd1, 0x6d, 0x38, 0xd7, 0x52, 0x0e, 0x69, 0x58, 0x96, 0xec, 0x3a, 0x52, 0x34, 0xd4, 0x2a, 0x45, + 0x43, 0x08, 0x51, 0x4b, 0x39, 0xa4, 0xff, 0x4a, 0xc2, 0x92, 0xe8, 0x7d, 0xe4, 0x57, 0x21, 0xaf, + 0xe9, 0xb6, 0xa3, 0x1b, 0xaa, 0x7b, 0x79, 0x20, 0xbb, 0x74, 0x22, 0xe7, 0x52, 0xd9, 0x25, 0x7e, + 0x37, 0x61, 0x86, 0x07, 0xa8, 0xfa, 0xff, 0x53, 0x42, 0x21, 0x43, 0x8a, 0x94, 0x82, 0x24, 0xf8, + 0x7f, 0x50, 0x53, 0x82, 0xe9, 0x86, 0xe2, 0xe0, 0x03, 0xe5, 0x48, 0x76, 0x4f, 0x0f, 0x64, 0xe8, + 0x5d, 0x5c, 0xcf, 0x9d, 0x1c, 0x2f, 0xe6, 0xee, 0xb3, 0xa4, 0xbe, 0x43, 0x04, 0xb9, 0x46, 0x20, + 0x41, 0x43, 0x2b, 0x90, 0xa5, 0xf7, 0x0c, 0x9b, 0xec, 0x3a, 0x6b, 0x0e, 0x04, 0x06, 0x6d, 0x47, + 0xf1, 0x4b, 0xaf, 0x25, 0x7a, 0x37, 0xb1, 0x7b, 0x03, 0xf6, 0x75, 0x98, 0x56, 0xec, 0x23, 0x43, + 0xa5, 0x1a, 0xc6, 0x86, 0xdd, 0xb1, 0x29, 0x12, 0x48, 0x49, 0x79, 0x4a, 0x2e, 0xb9, 0x54, 0xf4, + 0x1a, 0x5c, 0xd4, 0x30, 0x71, 0x6d, 0x98, 0xff, 0xe0, 0x98, 0xa6, 0x6c, 0x36, 0x35, 0x99, 0x1e, + 0x28, 0xa7, 0x28, 0x20, 0x25, 0x9d, 0xa3, 0x19, 0xa8, 0xe7, 0x50, 0x37, 0xcd, 0xad, 0xa6, 0x56, + 0x26, 0x89, 0xfc, 0xaa, 0xc1, 0xdf, 0x11, 0x20, 0xdb, 0x15, 0xef, 0xfd, 0x46, 0xcf, 0x7e, 0xed, + 0xc5, 0x70, 0xfc, 0x32, 0x28, 0x3e, 0x2f, 0xc5, 0xdb, 0xce, 0x8d, 0x19, 0x5a, 0x1c, 0xec, 0xff, + 0xd2, 0x15, 0x04, 0x37, 0x4a, 0xc0, 0x65, 0x7b, 0x3d, 0xf1, 0x7b, 0xef, 0x2f, 0x4e, 0x14, 0x7f, + 0x11, 0x87, 0x5c, 0x77, 0x5c, 0x77, 0xb5, 0xa7, 0x5c, 0x61, 0xe3, 0x4b, 0x17, 0xc7, 0xf2, 0x90, + 0x1b, 0x97, 0xd2, 0xfe, 0xbd, 0xc6, 0xac, 0x98, 0x4b, 0x43, 0x76, 0xa5, 0x83, 0xe5, 0xf4, 0x19, + 0xe7, 0x7f, 0x10, 0xf3, 0xc6, 0x8c, 0x65, 0x98, 0x64, 0x0a, 0x17, 0x06, 0x9e, 0xab, 0xa3, 0x3a, + 0x97, 0x58, 0x36, 0x32, 0xc6, 0xd4, 0xcf, 0x74, 0xad, 0x8e, 0x47, 0x38, 0xc3, 0x9f, 0xff, 0xf0, + 0xcb, 0x95, 0x26, 0x4f, 0x77, 0xb9, 0x12, 0xdb, 0x75, 0x6e, 0x36, 0xb1, 0xea, 0xf0, 0x7f, 0x7b, + 0x72, 0xff, 0xe2, 0xe7, 0x4a, 0xaf, 0x08, 0xfe, 0xdf, 0x50, 0xcb, 0x12, 0xff, 0x6f, 0xa8, 0x40, + 0x18, 0x57, 0xde, 0x13, 0x41, 0xbb, 0x24, 0x0b, 0xf6, 0xe3, 0x4d, 0xfd, 0x9b, 0x02, 0x88, 0xb4, + 0x03, 0xde, 0xc3, 0x58, 0x8b, 0xc4, 0x0a, 0xdd, 0x08, 0xb3, 0xd8, 0xd8, 0x11, 0x66, 0x45, 0x05, + 0xf2, 0x5e, 0x19, 0xd8, 0x7f, 0x9d, 0x0c, 0xb9, 0x15, 0xe9, 0x4c, 0x07, 0xb4, 0x8b, 0xbf, 0x2f, + 0xc0, 0xac, 0xf7, 0x8d, 0x92, 0x7f, 0x2e, 0xf0, 0x0c, 0x41, 0xc2, 0x12, 0xfd, 0x1f, 0x27, 0x02, + 0x84, 0xe9, 0xa1, 0xdd, 0xb1, 0x2c, 0x08, 0xf1, 0x00, 0x08, 0xe0, 0x00, 0x5b, 0xab, 0xd7, 0xe8, + 0x3f, 0x3c, 0xb1, 0x67, 0xbb, 0x78, 0x2f, 0xa0, 0x01, 0x6a, 0xac, 0xa4, 0x9a, 0x63, 0x59, 0xb5, + 0x5b, 0x4d, 0x9a, 0xb9, 0xf8, 0x23, 0x21, 0x28, 0xe8, 0x29, 0x71, 0xac, 0xee, 0x42, 0xfc, 0xa9, + 0xd2, 0x1c, 0x16, 0xff, 0xd1, 0xa5, 0x7a, 0x89, 0xe4, 0x46, 0xf7, 0xba, 0x8e, 0x53, 0xc6, 0x06, + 0x3b, 0x01, 0xfd, 0x2a, 0xed, 0x3a, 0x76, 0xf9, 0x69, 0xb7, 0x16, 0xf1, 0xd1, 0x9f, 0x0f, 0x76, + 0xd2, 0xd7, 0x13, 0x1f, 0xbc, 0xbf, 0x28, 0xdc, 0xac, 0xc1, 0x6c, 0xc8, 0xf4, 0x85, 0xf2, 0x00, + 0x81, 0x0b, 0xa2, 0xf9, 0xdf, 0x48, 0xad, 0xac, 0xc9, 0x3b, 0x9b, 0xa5, 0xad, 0x8d, 0x8d, 0x6a, + 0xbd, 0x5e, 0x5e, 0x13, 0x05, 0x24, 0x42, 0xb6, 0xeb, 0x7a, 0x69, 0xfe, 0xef, 0x51, 0x37, 0x3f, + 0x05, 0xe0, 0x5f, 0x31, 0x4f, 0x64, 0xad, 0x97, 0x1f, 0xcb, 0x8f, 0x56, 0x1e, 0xee, 0x94, 0x6b, + 0xe2, 0x04, 0x42, 0x90, 0x5f, 0x5d, 0xa9, 0x97, 0x2a, 0xb2, 0x54, 0xae, 0x6d, 0x6f, 0x6d, 0xd6, + 0xca, 0xa2, 0xc0, 0xf9, 0xd6, 0x20, 0x1b, 0x3c, 0x78, 0x8a, 0x66, 0x61, 0xba, 0x54, 0x29, 0x97, + 0xd6, 0xe5, 0x47, 0xd5, 0x15, 0xf9, 0xad, 0x9d, 0xf2, 0x4e, 0x59, 0x9c, 0xa0, 0x45, 0xa3, 0xc4, + 0x7b, 0x3b, 0x0f, 0x1f, 0x8a, 0x02, 0x9a, 0x86, 0x0c, 0x7b, 0xa7, 0x57, 0x51, 0x8b, 0xb1, 0x9b, + 0x1b, 0x90, 0x09, 0xdc, 0xee, 0x44, 0x3e, 0xb7, 0xbd, 0x53, 0xab, 0xc8, 0xf5, 0xea, 0x46, 0xb9, + 0x56, 0x5f, 0xd9, 0xd8, 0x66, 0x32, 0x28, 0x6d, 0x65, 0x75, 0x4b, 0xaa, 0x8b, 0x82, 0xf7, 0x5e, + 0xdf, 0xda, 0x29, 0x55, 0xbc, 0x3f, 0xc1, 0x4a, 0xa4, 0xe2, 0x62, 0xfc, 0xa6, 0x09, 0xe7, 0x42, + 0xcf, 0x5f, 0xa2, 0x0c, 0x4c, 0xed, 0x18, 0xf4, 0x9e, 0x1a, 0x71, 0x02, 0xe5, 0x02, 0x47, 0x30, + 0x45, 0x01, 0xa5, 0xd8, 0x41, 0x3b, 0x31, 0x86, 0x92, 0x10, 0xab, 0xdd, 0x15, 0xe3, 0xa4, 0x98, + 0x81, 0x73, 0x8c, 0x62, 0x02, 0xa5, 0xf9, 0x51, 0x2f, 0x71, 0x12, 0x65, 0xfd, 0xb3, 0x56, 0x62, + 0xf2, 0xe6, 0x25, 0x08, 0x1c, 0x45, 0x41, 0x00, 0xc9, 0x87, 0x8a, 0x83, 0x6d, 0x47, 0x9c, 0x40, + 0x53, 0x10, 0x5f, 0x69, 0x36, 0x45, 0xe1, 0xce, 0x9f, 0x0b, 0x90, 0x72, 0x6f, 0x21, 0x46, 0x0f, + 0x61, 0x92, 0x61, 0xe3, 0xc5, 0xc1, 0x53, 0x06, 0x1d, 0x75, 0xe6, 0x97, 0x46, 0xcd, 0x29, 0xc5, + 0x09, 0xf4, 0x36, 0xff, 0x3f, 0x3b, 0x62, 0x2f, 0xe8, 0xf2, 0x30, 0x6b, 0x72, 0xa5, 0x0e, 0x37, + 0x39, 0xd2, 0x43, 0x8a, 0x13, 0x9f, 0x10, 0x56, 0x5f, 0xfc, 0xe0, 0x67, 0x0b, 0x13, 0x1f, 0x9c, + 0x2c, 0x08, 0x3f, 0x3e, 0x59, 0x10, 0x7e, 0x7a, 0xb2, 0x20, 0xfc, 0xf3, 0xc9, 0x82, 0xf0, 0xdb, + 0x3f, 0x5f, 0x98, 0xf8, 0xf1, 0xcf, 0x17, 0x26, 0x7e, 0xfa, 0xf3, 0x85, 0x89, 0x77, 0xa6, 0x38, + 0xf7, 0x6e, 0x92, 0xfe, 0xb5, 0xde, 0xdd, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x14, 0x6e, + 0x65, 0x5f, 0x70, 0x00, 0x00, } diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto index bf4c25ee0f9f..1e2a2b656dbb 100644 --- a/pkg/roachpb/api.proto +++ b/pkg/roachpb/api.proto @@ -485,6 +485,13 @@ message CheckConsistencyRequest { // in-time backup of the database. It will be put into the engines' auxiliary // directory and needs to be removed manually to avoid leaking disk space. bool checkpoint = 4; + // A list of nodes that the consistency check wants to terminate. This is + // typically set when Checkpoint above is also set, as part of a second round + // after a first consistency check that did find a divergence. The second + // round is concerned with damage control and wants the nodes it suspects hold + // anomalous data to be shut down, so that this data isn't served to clients + // (or worse, spread to other replicas). + repeated ReplicaDescriptor terminate = 5 [(gogoproto.nullable) = false]; } // A CheckConsistencyResponse is the return value from the CheckConsistency() method. @@ -1204,6 +1211,11 @@ message ComputeChecksumRequest { // we want to preserve as much state as possible. The checkpoint will be stored // in the engine's auxiliary directory. bool checkpoint = 6; + // If non-empty, specifies the replicas which are the most likely source of the + // inconsistency. After evaluating the command, these replicas will terminate. + // + // See the field of the same name in CheckConsistencyRequest for details. + repeated ReplicaDescriptor terminate = 7 [(gogoproto.nullable) = false]; } // A ComputeChecksumResponse is the response to a ComputeChecksum() operation. diff --git a/pkg/storage/batcheval/cmd_compute_checksum.go b/pkg/storage/batcheval/cmd_compute_checksum.go index 56b7e55d93ec..fed404260292 100644 --- a/pkg/storage/batcheval/cmd_compute_checksum.go +++ b/pkg/storage/batcheval/cmd_compute_checksum.go @@ -59,6 +59,7 @@ func ComputeChecksum( SaveSnapshot: args.Snapshot, Mode: args.Mode, Checkpoint: args.Checkpoint, + Terminate: args.Terminate, } return pd, nil } diff --git a/pkg/storage/consistency_queue.go b/pkg/storage/consistency_queue.go index 3e0788748cd7..1076cf070c56 100644 --- a/pkg/storage/consistency_queue.go +++ b/pkg/storage/consistency_queue.go @@ -111,8 +111,9 @@ func (q *consistencyQueue) process( req := roachpb.CheckConsistencyRequest{ // Tell CheckConsistency that the caller is the queue. This triggers - // code to handle inconsistencies by recomputing with a diff and exiting - // with a fatal error, and triggers a stats readjustment if there is no + // code to handle inconsistencies by recomputing with a diff and + // instructing the nodes in the minority to terminate with a fatal + // error. It also triggers a stats readjustment if there is no // inconsistency but the persisted stats are found to disagree with // those reflected in the data. All of this really ought to be lifted // into the queue in the future. diff --git a/pkg/storage/consistency_queue_test.go b/pkg/storage/consistency_queue_test.go index c8f01175c4ff..21a600c9ff9b 100644 --- a/pkg/storage/consistency_queue_test.go +++ b/pkg/storage/consistency_queue_test.go @@ -202,7 +202,8 @@ func TestCheckConsistencyInconsistent(t *testing.T) { mtc.engines = append(mtc.engines, eng) } - // Store 0 will report a diff with inconsistent key "e". + // s1 will report a diff with inconsistent key "e", and only s2 has that + // write (s3 agrees with s1). diffKey := []byte("e") var diffTimestamp hlc.Timestamp notifyReportDiff := make(chan struct{}, 1) @@ -239,14 +240,14 @@ func TestCheckConsistencyInconsistent(t *testing.T) { notifyReportDiff <- struct{}{} } - // Store 0 will panic. - notifyPanic := make(chan struct{}, 1) - sc.TestingKnobs.ConsistencyTestingKnobs.BadChecksumPanic = func(s roachpb.StoreIdent) { - if s != *mtc.Store(0).Ident { - t.Errorf("BadChecksumPanic called from follower (StoreIdent = %v)", s) + // s2 (index 1) will panic. + notifyFatal := make(chan struct{}, 1) + sc.TestingKnobs.ConsistencyTestingKnobs.OnBadChecksumFatal = func(s roachpb.StoreIdent) { + if s != *mtc.Store(1).Ident { + t.Errorf("OnBadChecksumFatal called from %v", s) return } - notifyPanic <- struct{}{} + notifyFatal <- struct{}{} } defer mtc.Stop() @@ -294,7 +295,7 @@ func TestCheckConsistencyInconsistent(t *testing.T) { select { case <-notifyReportDiff: t.Fatal("unexpected diff") - case <-notifyPanic: + case <-notifyFatal: t.Fatal("unexpected panic") default: } @@ -323,7 +324,7 @@ func TestCheckConsistencyInconsistent(t *testing.T) { t.Fatal("CheckConsistency() failed to report a diff as expected") } select { - case <-notifyPanic: + case <-notifyFatal: case <-time.After(5 * time.Second): t.Fatal("CheckConsistency() failed to panic as expected") } @@ -554,7 +555,7 @@ func TestConsistencyQueueRecomputeStats(t *testing.T) { select { case resp := <-ccCh: - assert.Contains(t, resp.Result[0].Detail, `stats delta`) + assert.Contains(t, resp.Result[0].Detail, `KeyBytes`) // contains printed stats assert.Equal(t, roachpb.CheckConsistencyResponse_RANGE_CONSISTENT_STATS_INCORRECT, resp.Result[0].Status) default: t.Errorf("no response indicating the incorrect stats") diff --git a/pkg/storage/replica_consistency.go b/pkg/storage/replica_consistency.go index fbb451031aca..0d4954b1eaa8 100644 --- a/pkg/storage/replica_consistency.go +++ b/pkg/storage/replica_consistency.go @@ -85,6 +85,7 @@ func (r *Replica) CheckConsistency( Snapshot: args.WithDiff, Mode: args.Mode, Checkpoint: args.Checkpoint, + Terminate: args.Terminate, } isQueue := args.Mode == roachpb.ChecksumMode_CHECK_VIA_QUEUE @@ -133,7 +134,7 @@ func (r *Replica) CheckConsistency( for _, idx := range idxs { _, _ = fmt.Fprintf(&buf, "%s: checksum %x%s\n"+ "- stats: %+v\n"+ - "- recomputed delta: %+v\n", + "- stats.Sub(recomputation): %+v\n", &results[idx].Replica, sha, minority, @@ -165,13 +166,18 @@ func (r *Replica) CheckConsistency( } delta := enginepb.MVCCStats(results[0].Response.Delta) - delta.LastUpdateNanos = 0 + var haveDelta bool + { + d2 := delta + d2.AgeTo(0) + haveDelta = d2 != enginepb.MVCCStats{} + } res.StartKey = []byte(startKey) res.Status = roachpb.CheckConsistencyResponse_RANGE_CONSISTENT if minoritySHA != "" { res.Status = roachpb.CheckConsistencyResponse_RANGE_INCONSISTENT - } else if args.Mode != roachpb.ChecksumMode_CHECK_STATS && delta != (enginepb.MVCCStats{}) { + } else if args.Mode != roachpb.ChecksumMode_CHECK_STATS && haveDelta { if delta.ContainsEstimates { // When ContainsEstimates is set, it's generally expected that we'll get a different // result when we recompute from scratch. @@ -181,7 +187,7 @@ func (r *Replica) CheckConsistency( // result when we recompute from scratch. res.Status = roachpb.CheckConsistencyResponse_RANGE_CONSISTENT_STATS_INCORRECT } - res.Detail += fmt.Sprintf("stats delta: %+v\n", enginepb.MVCCStats(results[0].Response.Delta)) + res.Detail += fmt.Sprintf("stats - recomputation: %+v\n", enginepb.MVCCStats(results[0].Response.Delta)) } else if len(missing) > 0 { // No inconsistency was detected, but we didn't manage to inspect all replicas. res.Status = roachpb.CheckConsistencyResponse_RANGE_INDETERMINATE @@ -204,7 +210,7 @@ func (r *Replica) CheckConsistency( // logging below is relatively timid. // If there's no delta, there's nothing else to do. - if delta == (enginepb.MVCCStats{}) { + if !haveDelta { return resp, nil } @@ -233,44 +239,38 @@ func (r *Replica) CheckConsistency( return resp, roachpb.NewError(err) } - logFunc := log.Fatalf - if p := r.store.cfg.TestingKnobs.ConsistencyTestingKnobs.BadChecksumPanic; p != nil { - if !args.WithDiff { - // We'll call this recursively with WithDiff==true; let's let that call - // be the one to trigger the handler. - p(*r.store.Ident) - } - logFunc = log.Errorf - } - - // Diff was printed above, so call logFunc with a short message only. if args.WithDiff { - logFunc(ctx, "consistency check failed") + // A diff was already printed. Return because all the code below will do + // is request another consistency check, with a diff and with + // instructions to terminate the minority nodes. + log.Errorf(ctx, "consistency check failed") return resp, nil } // No diff was printed, so we want to re-run with diff. - // Note that this will call Fatal recursively in `CheckConsistency` (in the code above). - log.Errorf(ctx, "consistency check failed; fetching details") + // Note that this recursive call will be terminated in the `args.WithDiff` + // branch above. args.WithDiff = true args.Checkpoint = true + for _, idxs := range shaToIdxs[minoritySHA] { + args.Terminate = append(args.Terminate, results[idxs].Replica) + } + log.Errorf(ctx, "consistency check failed; fetching details and shutting down minority %v", args.Terminate) - // We've noticed in practice that if the diff is large, the log file in it - // is promptly rotated away. We already know we're going to fatal, and so we - // can afford disabling the log size limit altogether so that the diff can - // stick around. For reasons of cleanliness we try to reset things to normal - // in tests but morally speaking we're really just disabling it for good - // until the process crashes. + // We've noticed in practice that if the snapshot diff is large, the log + // file in it is promptly rotated away, so up the limits while the diff + // printing occurs. // // See: // https://github.com/cockroachdb/cockroach/issues/36861 oldLogLimit := atomic.LoadInt64(&log.LogFilesCombinedMaxSize) atomic.CompareAndSwapInt64(&log.LogFilesCombinedMaxSize, oldLogLimit, math.MaxInt64) + defer atomic.CompareAndSwapInt64(&log.LogFilesCombinedMaxSize, math.MaxInt64, oldLogLimit) + if _, pErr := r.CheckConsistency(ctx, args); pErr != nil { - log.Fatalf(ctx, "replica inconsistency detected; could not obtain actual diff: %s", pErr) + log.Errorf(ctx, "replica inconsistency detected; could not obtain actual diff: %s", pErr) } - // Not reached except in tests. - atomic.CompareAndSwapInt64(&log.LogFilesCombinedMaxSize, math.MaxInt64, oldLogLimit) + return resp, nil } @@ -402,6 +402,9 @@ func (r *Replica) getChecksum(ctx context.Context, id uuid.UUID) (ReplicaChecksu r.gcOldChecksumEntriesLocked(now) c, ok := r.mu.checksums[id] if !ok { + // TODO(tbg): we need to unconditionally set a gcTimestamp or this + // request can simply get stuck forever or cancel anyway and leak an + // entry in r.mu.checksums. if d, dOk := ctx.Deadline(); dOk { c.gcTimestamp = d } diff --git a/pkg/storage/replica_proposal.go b/pkg/storage/replica_proposal.go index 5908f351cb16..57cac2b4d06b 100644 --- a/pkg/storage/replica_proposal.go +++ b/pkg/storage/replica_proposal.go @@ -228,17 +228,45 @@ func (r *Replica) computeChecksumPostApply(ctx context.Context, cc storagepb.Com // Compute SHA asynchronously and store it in a map by UUID. if err := stopper.RunAsyncTask(ctx, "storage.Replica: computing checksum", func(ctx context.Context) { - defer snap.Close() - var snapshot *roachpb.RaftSnapshotData - if cc.SaveSnapshot { - snapshot = &roachpb.RaftSnapshotData{} + func() { + defer snap.Close() + var snapshot *roachpb.RaftSnapshotData + if cc.SaveSnapshot { + snapshot = &roachpb.RaftSnapshotData{} + } + result, err := r.sha512(ctx, desc, snap, snapshot, cc.Mode) + if err != nil { + log.Errorf(ctx, "%v", err) + result = nil + } + r.computeChecksumDone(ctx, cc.ChecksumID, result, snapshot) + }() + + var shouldFatal bool + for _, rDesc := range cc.Terminate { + if rDesc.StoreID == r.store.StoreID() && rDesc.ReplicaID == r.mu.replicaID { + shouldFatal = true + } } - result, err := r.sha512(ctx, desc, snap, snapshot, cc.Mode) - if err != nil { - log.Errorf(ctx, "%v", err) - result = nil + + if shouldFatal { + // This node should fatal as a result of a previous consistency + // check (i.e. this round is carried out only to obtain a diff). + // If we fatal too early, the diff won't make it back to the lease- + // holder and thus won't be printed to the logs. Since we're already + // in a goroutine that's about to end, simply sleep for a few seconds + // and then terminate. + if p := r.store.cfg.TestingKnobs.ConsistencyTestingKnobs.OnBadChecksumFatal; p != nil { + p(*r.store.Ident) + } else { + time.Sleep(10 * time.Second) + log.Fatalf(r.AnnotateCtx(context.Background()), + "this node is terminating because a replica inconsistency was detected "+ + "between %s and its other replicas. Please check your cluster-wide log files for "+ + "more information and contact the CockroachDB support team.", r) + } } - r.computeChecksumDone(ctx, cc.ChecksumID, result, snapshot) + }); err != nil { defer snap.Close() log.Error(ctx, errors.Wrapf(err, "could not run async checksum computation (ID = %s)", cc.ChecksumID)) diff --git a/pkg/storage/storagepb/proposer_kv.pb.go b/pkg/storage/storagepb/proposer_kv.pb.go index bf3416e64a63..5beee353f731 100644 --- a/pkg/storage/storagepb/proposer_kv.pb.go +++ b/pkg/storage/storagepb/proposer_kv.pb.go @@ -45,7 +45,7 @@ func (m *Split) Reset() { *m = Split{} } func (m *Split) String() string { return proto.CompactTextString(m) } func (*Split) ProtoMessage() {} func (*Split) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{0} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{0} } func (m *Split) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -80,7 +80,7 @@ func (m *Merge) Reset() { *m = Merge{} } func (m *Merge) String() string { return proto.CompactTextString(m) } func (*Merge) ProtoMessage() {} func (*Merge) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{1} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{1} } func (m *Merge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -114,7 +114,7 @@ type ChangeReplicas struct { func (m *ChangeReplicas) Reset() { *m = ChangeReplicas{} } func (*ChangeReplicas) ProtoMessage() {} func (*ChangeReplicas) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{2} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{2} } func (m *ChangeReplicas) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -157,13 +157,16 @@ type ComputeChecksum struct { // is expected to be set only if we already know that there is an // inconsistency and we want to preserve as much state as possible. Checkpoint bool `protobuf:"varint,4,opt,name=checkpoint,proto3" json:"checkpoint,omitempty"` + // Replicas processing this command which find themselves in this slice will + // terminate. See `CheckConsistencyRequest.Terminate`. + Terminate []roachpb.ReplicaDescriptor `protobuf:"bytes,6,rep,name=terminate,proto3" json:"terminate"` } func (m *ComputeChecksum) Reset() { *m = ComputeChecksum{} } func (m *ComputeChecksum) String() string { return proto.CompactTextString(m) } func (*ComputeChecksum) ProtoMessage() {} func (*ComputeChecksum) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{3} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{3} } func (m *ComputeChecksum) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -200,7 +203,7 @@ func (m *Compaction) Reset() { *m = Compaction{} } func (m *Compaction) String() string { return proto.CompactTextString(m) } func (*Compaction) ProtoMessage() {} func (*Compaction) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{4} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{4} } func (m *Compaction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -237,7 +240,7 @@ func (m *SuggestedCompaction) Reset() { *m = SuggestedCompaction{} } func (m *SuggestedCompaction) String() string { return proto.CompactTextString(m) } func (*SuggestedCompaction) ProtoMessage() {} func (*SuggestedCompaction) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{5} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{5} } func (m *SuggestedCompaction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -305,7 +308,7 @@ func (m *ReplicatedEvalResult) Reset() { *m = ReplicatedEvalResult{} } func (m *ReplicatedEvalResult) String() string { return proto.CompactTextString(m) } func (*ReplicatedEvalResult) ProtoMessage() {} func (*ReplicatedEvalResult) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{6} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{6} } func (m *ReplicatedEvalResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -349,7 +352,7 @@ func (m *ReplicatedEvalResult_AddSSTable) Reset() { *m = ReplicatedEvalR func (m *ReplicatedEvalResult_AddSSTable) String() string { return proto.CompactTextString(m) } func (*ReplicatedEvalResult_AddSSTable) ProtoMessage() {} func (*ReplicatedEvalResult_AddSSTable) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{6, 0} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{6, 0} } func (m *ReplicatedEvalResult_AddSSTable) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -386,7 +389,7 @@ func (m *WriteBatch) Reset() { *m = WriteBatch{} } func (m *WriteBatch) String() string { return proto.CompactTextString(m) } func (*WriteBatch) ProtoMessage() {} func (*WriteBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{7} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{7} } func (m *WriteBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -423,7 +426,7 @@ func (m *LogicalOpLog) Reset() { *m = LogicalOpLog{} } func (m *LogicalOpLog) String() string { return proto.CompactTextString(m) } func (*LogicalOpLog) ProtoMessage() {} func (*LogicalOpLog) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{8} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{8} } func (m *LogicalOpLog) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +530,7 @@ func (m *RaftCommand) Reset() { *m = RaftCommand{} } func (m *RaftCommand) String() string { return proto.CompactTextString(m) } func (*RaftCommand) ProtoMessage() {} func (*RaftCommand) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{9} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{9} } func (m *RaftCommand) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -566,7 +569,7 @@ func (m *RaftCommandFooter) Reset() { *m = RaftCommandFooter{} } func (m *RaftCommandFooter) String() string { return proto.CompactTextString(m) } func (*RaftCommandFooter) ProtoMessage() {} func (*RaftCommandFooter) Descriptor() ([]byte, []int) { - return fileDescriptor_proposer_kv_a5df942ba34d9382, []int{10} + return fileDescriptor_proposer_kv_3d8514282fa65643, []int{10} } func (m *RaftCommandFooter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -714,6 +717,14 @@ func (this *ComputeChecksum) Equal(that interface{}) bool { if this.Checkpoint != that1.Checkpoint { return false } + if len(this.Terminate) != len(that1.Terminate) { + return false + } + for i := range this.Terminate { + if !this.Terminate[i].Equal(&that1.Terminate[i]) { + return false + } + } return true } func (this *Compaction) Equal(that interface{}) bool { @@ -1007,6 +1018,18 @@ func (m *ComputeChecksum) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintProposerKv(dAtA, i, uint64(m.Version)) } + if len(m.Terminate) > 0 { + for _, msg := range m.Terminate { + dAtA[i] = 0x32 + i++ + i = encodeVarintProposerKv(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -1481,6 +1504,12 @@ func (m *ComputeChecksum) Size() (n int) { if m.Version != 0 { n += 1 + sovProposerKv(uint64(m.Version)) } + if len(m.Terminate) > 0 { + for _, e := range m.Terminate { + l = e.Size() + n += 1 + l + sovProposerKv(uint64(l)) + } + } return n } @@ -2085,6 +2114,37 @@ func (m *ComputeChecksum) Unmarshal(dAtA []byte) error { break } } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Terminate", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProposerKv + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProposerKv + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Terminate = append(m.Terminate, roachpb.ReplicaDescriptor{}) + if err := m.Terminate[len(m.Terminate)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipProposerKv(dAtA[iNdEx:]) @@ -3484,95 +3544,96 @@ var ( ) func init() { - proto.RegisterFile("storage/storagepb/proposer_kv.proto", fileDescriptor_proposer_kv_a5df942ba34d9382) -} - -var fileDescriptor_proposer_kv_a5df942ba34d9382 = []byte{ - // 1370 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x41, 0x6f, 0xdb, 0x46, - 0x16, 0xb6, 0x6c, 0xca, 0xa6, 0x9f, 0x6c, 0x89, 0x9e, 0x38, 0x09, 0x37, 0x8b, 0x48, 0x86, 0x12, - 0xec, 0x7a, 0x91, 0x80, 0xca, 0xda, 0x7b, 0x58, 0x64, 0x17, 0xbb, 0x88, 0xe4, 0xb6, 0xb1, 0x62, - 0x3b, 0xc9, 0xc8, 0x49, 0x8a, 0xf6, 0x40, 0x8c, 0xc8, 0x09, 0xc5, 0x9a, 0xd2, 0xb0, 0x9c, 0x91, - 0x12, 0xff, 0x8b, 0xf4, 0xd4, 0x9e, 0xda, 0xfc, 0x83, 0xfe, 0x8d, 0x1c, 0x73, 0x0c, 0x7a, 0x10, - 0x5a, 0xe7, 0xd2, 0x9f, 0x50, 0x04, 0x3d, 0x14, 0x33, 0x1c, 0x4a, 0x72, 0xad, 0xa8, 0x0e, 0x7a, - 0x91, 0xc8, 0x37, 0xef, 0x7d, 0xef, 0xcd, 0x9b, 0xef, 0x7d, 0x43, 0xb8, 0xc6, 0x05, 0x4b, 0x48, - 0x40, 0x6b, 0xfa, 0x3f, 0x6e, 0xd7, 0xe2, 0x84, 0xc5, 0x8c, 0xd3, 0xc4, 0x3d, 0x1a, 0x38, 0x71, - 0xc2, 0x04, 0x43, 0x7f, 0xf5, 0x98, 0x77, 0x94, 0x30, 0xe2, 0x75, 0x1c, 0xed, 0xe6, 0x8c, 0xdc, - 0xaf, 0xac, 0xa9, 0x85, 0xb8, 0x5d, 0x23, 0x71, 0x98, 0xfa, 0x5f, 0x41, 0x99, 0xc9, 0x27, 0x82, - 0x68, 0xdb, 0xa5, 0xcc, 0xd6, 0xa5, 0x82, 0x4c, 0xd8, 0xab, 0x59, 0x01, 0xb4, 0x17, 0x84, 0xbd, - 0xec, 0x4f, 0xfa, 0x0d, 0x3c, 0x4f, 0xfb, 0x5c, 0x9b, 0xe5, 0xb3, 0xad, 0x9d, 0xae, 0x9e, 0xdd, - 0x09, 0x17, 0x44, 0x50, 0xbd, 0x6c, 0xf7, 0x45, 0x18, 0xd5, 0x3a, 0x91, 0x57, 0x13, 0x61, 0x97, - 0x72, 0x41, 0xba, 0xb1, 0x5e, 0x59, 0x0f, 0x58, 0xc0, 0xd4, 0x63, 0x4d, 0x3e, 0xa5, 0xd6, 0xea, - 0xf7, 0x39, 0xc8, 0xb7, 0xe2, 0x28, 0x14, 0xa8, 0x01, 0x4b, 0x22, 0x09, 0x83, 0x80, 0x26, 0x76, - 0x6e, 0x23, 0xb7, 0x59, 0xd8, 0xaa, 0x38, 0xe3, 0x7e, 0xe8, 0x5d, 0x39, 0xca, 0xf5, 0x30, 0x75, - 0xab, 0x9b, 0xaf, 0x86, 0x95, 0xb9, 0xd7, 0xc3, 0x4a, 0x0e, 0x67, 0x91, 0xe8, 0x73, 0x58, 0x4e, - 0x3a, 0xdc, 0xf5, 0x69, 0x24, 0x88, 0x3d, 0xaf, 0x60, 0x6e, 0x3a, 0x67, 0xdb, 0x9a, 0xee, 0xcc, - 0xc9, 0x36, 0xe8, 0xec, 0x3f, 0x6e, 0x34, 0x5a, 0x82, 0x08, 0x5e, 0xb7, 0x24, 0xe6, 0xc9, 0xb0, - 0x62, 0xe2, 0xbb, 0xad, 0x1d, 0x89, 0x82, 0xcd, 0xa4, 0xc3, 0xd5, 0xd3, 0x6d, 0xe3, 0xe7, 0x97, - 0x95, 0x5c, 0x15, 0x43, 0x7e, 0x9f, 0x26, 0x01, 0x3d, 0x5f, 0xc1, 0xca, 0xf5, 0xfd, 0x05, 0x6b, - 0xcc, 0x0e, 0x14, 0x1b, 0x1d, 0xd2, 0x0b, 0x28, 0xa6, 0x71, 0x14, 0x7a, 0x84, 0xa3, 0xbd, 0xdf, - 0x83, 0x6f, 0x4e, 0x01, 0x3f, 0x1d, 0x33, 0x23, 0x8b, 0xf9, 0xcd, 0xcb, 0xca, 0x9c, 0xca, 0xf4, - 0xf5, 0x3c, 0x94, 0x1a, 0xac, 0x1b, 0xf7, 0x05, 0x6d, 0x74, 0xa8, 0x77, 0xc4, 0xfb, 0x5d, 0xf4, - 0x05, 0x14, 0x3c, 0xfd, 0xec, 0x86, 0xbe, 0xca, 0xb7, 0x52, 0xdf, 0x95, 0x28, 0x3f, 0x0c, 0x2b, - 0xdb, 0x41, 0x28, 0x3a, 0xfd, 0xb6, 0xe3, 0xb1, 0x6e, 0x6d, 0x54, 0x81, 0xdf, 0x1e, 0x3f, 0xd7, - 0xe2, 0xa3, 0xa0, 0xa6, 0x4e, 0xbd, 0xdf, 0x0f, 0x7d, 0xe7, 0xd1, 0xa3, 0xdd, 0x9d, 0x93, 0x61, - 0x05, 0x32, 0xf4, 0xdd, 0x1d, 0x0c, 0x19, 0xfa, 0xae, 0x8f, 0xae, 0xc1, 0x2a, 0x27, 0x03, 0xea, - 0xf2, 0x1e, 0x89, 0x79, 0x87, 0x09, 0x75, 0x48, 0x26, 0x5e, 0x91, 0xc6, 0x96, 0xb6, 0xa1, 0x6d, - 0x30, 0xba, 0xcc, 0xa7, 0xf6, 0xc2, 0x46, 0x6e, 0xb3, 0x38, 0xb5, 0xad, 0x19, 0xfa, 0x3e, 0xf3, - 0x29, 0x56, 0xce, 0xa8, 0x0c, 0x69, 0x9e, 0x98, 0x85, 0x3d, 0x61, 0x1b, 0x0a, 0x76, 0xc2, 0x82, - 0x6c, 0x58, 0x1a, 0xd0, 0x84, 0x87, 0xac, 0x67, 0xe7, 0x37, 0x72, 0x9b, 0xab, 0x38, 0x7b, 0xd5, - 0x67, 0xf0, 0x18, 0x40, 0x36, 0x86, 0x78, 0x22, 0x64, 0x3d, 0xb4, 0x0e, 0xf9, 0xf6, 0xb1, 0xa0, - 0x5c, 0x75, 0x63, 0x01, 0xa7, 0x2f, 0xe8, 0x26, 0x20, 0xde, 0x0f, 0x02, 0xca, 0x05, 0xf5, 0x5d, - 0x22, 0xdc, 0x1e, 0xe9, 0x31, 0xae, 0xb6, 0xb0, 0x80, 0xad, 0xd1, 0xca, 0x1d, 0x71, 0x20, 0xed, - 0x1a, 0xf7, 0xc5, 0x3c, 0x5c, 0x68, 0x65, 0x4b, 0x13, 0x19, 0x1e, 0xc2, 0x32, 0x17, 0x24, 0x11, - 0xee, 0x11, 0x3d, 0xd6, 0x3d, 0xff, 0xd7, 0xbb, 0x61, 0xe5, 0xd6, 0xb9, 0xfa, 0x9d, 0xf5, 0xe1, - 0x1e, 0x3d, 0xc6, 0xa6, 0x82, 0xb9, 0x47, 0x8f, 0xd1, 0x3e, 0x2c, 0xd1, 0x9e, 0xaf, 0x00, 0xe7, - 0xff, 0x04, 0xe0, 0x22, 0xed, 0xf9, 0x12, 0xee, 0x21, 0x80, 0x37, 0xaa, 0x57, 0x1d, 0x46, 0x61, - 0xeb, 0xef, 0xce, 0x0c, 0x91, 0x72, 0xc6, 0xdb, 0x9b, 0x60, 0xe1, 0x04, 0x88, 0x6e, 0xc9, 0xaf, - 0x26, 0xac, 0x6b, 0xd6, 0x0a, 0xea, 0x7f, 0x34, 0x20, 0x11, 0xa6, 0xbc, 0x1f, 0x09, 0x54, 0x81, - 0x42, 0x3b, 0x62, 0xde, 0x91, 0x9b, 0x50, 0xe2, 0xa7, 0xbd, 0x37, 0x31, 0x28, 0x13, 0x96, 0x16, - 0xf4, 0x7f, 0xc8, 0x2b, 0xb5, 0xd1, 0xb3, 0xfd, 0x8f, 0x99, 0xd5, 0xe8, 0x14, 0x72, 0xb0, 0x29, - 0x4e, 0xe3, 0xd0, 0xbf, 0x21, 0xcf, 0xa5, 0x86, 0xe8, 0xed, 0x54, 0x67, 0x02, 0x28, 0xb5, 0xc1, - 0x69, 0x80, 0x8c, 0xec, 0xca, 0x61, 0x56, 0xd4, 0xfa, 0xa3, 0x48, 0x35, 0xf6, 0x38, 0x0d, 0x40, - 0x9b, 0x60, 0x85, 0xdc, 0x8d, 0x28, 0xe1, 0xd4, 0x4d, 0xe8, 0x97, 0x7d, 0xca, 0x85, 0xbd, 0xa8, - 0xb6, 0x56, 0x0c, 0xf9, 0x9e, 0x34, 0xe3, 0xd4, 0x8a, 0xee, 0xc0, 0xf2, 0x48, 0x36, 0x6d, 0x53, - 0xe5, 0xb9, 0x3a, 0x91, 0x47, 0x4e, 0x99, 0xd3, 0x89, 0x3c, 0xe7, 0x30, 0x73, 0xaa, 0x1b, 0xb2, - 0xcd, 0x78, 0x1c, 0x85, 0x9e, 0x80, 0xe5, 0xd3, 0x38, 0xa1, 0xaa, 0xb5, 0x5a, 0x08, 0xe1, 0xc3, - 0x85, 0x10, 0x97, 0xc6, 0x28, 0x4a, 0xfd, 0xd0, 0x21, 0x94, 0x3c, 0xa5, 0x37, 0x6e, 0xa2, 0x05, - 0xc7, 0x5e, 0x51, 0xb8, 0x37, 0x66, 0x53, 0xe2, 0x94, 0x46, 0xe1, 0xa2, 0x77, 0x5a, 0xe7, 0xae, - 0x43, 0x31, 0x21, 0x4f, 0x85, 0x1b, 0xb1, 0x40, 0x17, 0xbb, 0xaa, 0xa6, 0x69, 0x45, 0x5a, 0xf7, - 0x58, 0x90, 0xe6, 0xee, 0x42, 0x81, 0xf8, 0xbe, 0xcb, 0xb9, 0x20, 0xed, 0x88, 0xda, 0x6b, 0x2a, - 0xef, 0x7f, 0xcf, 0x73, 0xf8, 0xa7, 0xf8, 0xe5, 0xdc, 0xf1, 0xfd, 0x56, 0xeb, 0x50, 0x62, 0xd4, - 0x8b, 0x52, 0xa4, 0xc6, 0xef, 0x18, 0x88, 0xef, 0xb7, 0x52, 0x7c, 0xb4, 0x0f, 0xf9, 0xb4, 0x16, - 0xa4, 0x12, 0xfd, 0xf3, 0x43, 0x1a, 0xa7, 0x0a, 0xd6, 0xc7, 0x92, 0xa2, 0xa0, 0x23, 0xb8, 0x38, - 0x56, 0x8d, 0xf1, 0x30, 0x70, 0xfb, 0xc2, 0xc6, 0xc2, 0x66, 0x61, 0xeb, 0xd6, 0x6c, 0x0e, 0x9e, - 0x95, 0x0e, 0x8d, 0xbe, 0xce, 0xcf, 0x2e, 0x71, 0xb4, 0x0f, 0x17, 0xe2, 0x84, 0x0e, 0x34, 0xdd, - 0xd2, 0x8f, 0x0c, 0x12, 0xd9, 0xeb, 0xe7, 0x20, 0x13, 0x5e, 0x93, 0x91, 0x8a, 0x90, 0x0f, 0x74, - 0x9c, 0xa4, 0x93, 0x97, 0x5e, 0x17, 0x6e, 0xa6, 0xe2, 0xf6, 0xc5, 0xf7, 0xd2, 0xe9, 0xb4, 0x12, - 0x4c, 0xdc, 0x31, 0xb8, 0xe4, 0x9d, 0x36, 0x5c, 0xf9, 0x04, 0x26, 0xba, 0x8f, 0x10, 0x18, 0xf2, - 0x63, 0x25, 0xd5, 0x41, 0xac, 0x9e, 0x51, 0x05, 0xf2, 0x5e, 0xe2, 0x6d, 0x6f, 0xa9, 0x59, 0x5f, - 0xad, 0x2f, 0x9f, 0x0c, 0x2b, 0xf9, 0x06, 0x6e, 0x6c, 0x6f, 0xe1, 0xd4, 0x9e, 0x8a, 0x49, 0xfa, - 0xdb, 0x34, 0xcc, 0xbc, 0xb5, 0xd8, 0x34, 0xcc, 0x25, 0xcb, 0x6c, 0x1a, 0xe6, 0xb2, 0x05, 0x4d, - 0xc3, 0x2c, 0x5a, 0xa5, 0xa6, 0x61, 0x96, 0x2c, 0xab, 0x69, 0x98, 0x96, 0xb5, 0xd6, 0x5c, 0x34, - 0xbf, 0x3a, 0xb0, 0xbe, 0x3d, 0xa8, 0x6e, 0x00, 0x3c, 0x49, 0x42, 0x41, 0xeb, 0x44, 0x78, 0x9d, - 0x69, 0xa9, 0xab, 0x9f, 0xc2, 0xca, 0x1e, 0x0b, 0x42, 0x8f, 0x44, 0xf7, 0xe3, 0x3d, 0x16, 0xa0, - 0xbb, 0xb0, 0xc0, 0x62, 0xa9, 0x47, 0xef, 0x3b, 0xaf, 0x69, 0x74, 0x18, 0x21, 0xe8, 0xf3, 0x92, - 0x10, 0xd5, 0x5f, 0x0c, 0x28, 0x60, 0xf2, 0x54, 0x34, 0x58, 0xb7, 0x4b, 0x7a, 0x3e, 0x7a, 0x04, - 0xd6, 0xe8, 0x43, 0x50, 0xcf, 0x95, 0xd6, 0xb6, 0xeb, 0x53, 0xae, 0x3d, 0x4d, 0xea, 0x1d, 0xca, - 0xbd, 0x24, 0x8c, 0x05, 0x4b, 0x34, 0x74, 0x29, 0xc3, 0xd0, 0x0e, 0xe8, 0x6f, 0x50, 0xea, 0x92, - 0xe7, 0x9a, 0x04, 0x61, 0xcf, 0xa7, 0xcf, 0x95, 0x6c, 0x19, 0x78, 0xb5, 0x4b, 0x9e, 0xab, 0x13, - 0xde, 0x95, 0x46, 0x74, 0x08, 0x7f, 0x99, 0x50, 0x8b, 0x51, 0x25, 0x2a, 0x4e, 0x5d, 0x93, 0x85, - 0x2d, 0x7b, 0x4a, 0x1d, 0xa9, 0x68, 0x5d, 0x1e, 0x87, 0x3e, 0xd0, 0x91, 0x6a, 0x01, 0x0d, 0xe0, - 0xf2, 0x69, 0x28, 0x97, 0x4b, 0x81, 0xeb, 0x79, 0x54, 0xe9, 0xde, 0x42, 0xfd, 0x7f, 0xef, 0x86, - 0x95, 0xdb, 0x1f, 0x74, 0x2f, 0x29, 0xe0, 0x96, 0x46, 0xc1, 0x17, 0xe3, 0xc9, 0x7c, 0x99, 0x19, - 0x75, 0xe1, 0x52, 0x32, 0x1a, 0x7b, 0x97, 0x0e, 0x48, 0xe4, 0x26, 0x6a, 0xf0, 0x95, 0xa8, 0x4c, - 0x1f, 0xe4, 0xd9, 0x8a, 0x91, 0x8d, 0x5a, 0x32, 0xed, 0xb6, 0xba, 0x0b, 0x85, 0x67, 0x92, 0x47, - 0x6e, 0x5b, 0x12, 0xc9, 0x2e, 0x9e, 0xe3, 0x82, 0x1c, 0xf3, 0x0e, 0xc3, 0xb3, 0x31, 0x07, 0xef, - 0x43, 0x31, 0x4a, 0xd9, 0xe2, 0xb2, 0x58, 0x6a, 0xa1, 0x5d, 0x3a, 0xc7, 0xfd, 0x36, 0x49, 0x51, - 0xbc, 0x12, 0x4d, 0xbc, 0x35, 0x0d, 0x73, 0xc1, 0x32, 0x9a, 0x86, 0x99, 0xb3, 0xe6, 0x53, 0xda, - 0x7f, 0x77, 0x50, 0xfd, 0x0f, 0xac, 0x4d, 0x30, 0xef, 0x63, 0xc6, 0x04, 0x4d, 0xce, 0x4b, 0x94, - 0xfa, 0x8d, 0x57, 0x3f, 0x95, 0xe7, 0x5e, 0x9d, 0x94, 0x73, 0xaf, 0x4f, 0xca, 0xb9, 0x37, 0x27, - 0xe5, 0xdc, 0x8f, 0x27, 0xe5, 0xdc, 0x8b, 0xb7, 0xe5, 0xb9, 0xd7, 0x6f, 0xcb, 0x73, 0x6f, 0xde, - 0x96, 0xe7, 0x3e, 0x5b, 0x1e, 0x15, 0xd6, 0x5e, 0x54, 0xdf, 0xf6, 0xdb, 0xbf, 0x05, 0x00, 0x00, - 0xff, 0xff, 0x2e, 0xf3, 0xa0, 0x74, 0xf6, 0x0c, 0x00, 0x00, + proto.RegisterFile("storage/storagepb/proposer_kv.proto", fileDescriptor_proposer_kv_3d8514282fa65643) +} + +var fileDescriptor_proposer_kv_3d8514282fa65643 = []byte{ + // 1386 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xc1, 0x6e, 0xdb, 0x46, + 0x13, 0xb6, 0x6c, 0xca, 0xa6, 0x47, 0xb6, 0x44, 0x6f, 0x9c, 0x84, 0x7f, 0x7e, 0x44, 0x32, 0x94, + 0xe0, 0xff, 0x5d, 0x24, 0xa0, 0x52, 0xbb, 0x87, 0x22, 0x2d, 0x5a, 0x44, 0x72, 0x5b, 0x5b, 0xb1, + 0x9d, 0x64, 0xe5, 0x24, 0x45, 0x7b, 0x20, 0x56, 0xe4, 0x86, 0x62, 0x4d, 0x8a, 0x2c, 0x77, 0xa5, + 0xc4, 0x6f, 0x91, 0xde, 0x7a, 0x6a, 0xf3, 0x06, 0x7d, 0x8d, 0x1c, 0x73, 0x0c, 0x7a, 0x10, 0x1a, + 0xe7, 0xd2, 0x47, 0x28, 0x82, 0x1e, 0x8a, 0x5d, 0x2e, 0x25, 0xb9, 0x56, 0x54, 0x1b, 0xbd, 0x58, + 0xe4, 0xec, 0xcc, 0x37, 0xb3, 0x33, 0xdf, 0x7e, 0x4b, 0xc3, 0x35, 0xc6, 0xa3, 0x84, 0x78, 0xb4, + 0xa6, 0x7e, 0xe3, 0x76, 0x2d, 0x4e, 0xa2, 0x38, 0x62, 0x34, 0xb1, 0x0f, 0xfb, 0x56, 0x9c, 0x44, + 0x3c, 0x42, 0xff, 0x75, 0x22, 0xe7, 0x30, 0x89, 0x88, 0xd3, 0xb1, 0x94, 0x9b, 0x35, 0x74, 0xbf, + 0xb2, 0x22, 0x17, 0xe2, 0x76, 0x8d, 0xc4, 0x7e, 0xea, 0x7f, 0x05, 0x65, 0x26, 0x97, 0x70, 0xa2, + 0x6c, 0x97, 0x32, 0x5b, 0x48, 0x39, 0x19, 0xb3, 0x57, 0xb3, 0x02, 0x68, 0xd7, 0xf3, 0xbb, 0xd9, + 0x8f, 0xf0, 0xeb, 0x3b, 0x8e, 0xf2, 0xb9, 0x36, 0xcd, 0x67, 0x53, 0x39, 0x5d, 0x3d, 0xbd, 0x13, + 0xc6, 0x09, 0xa7, 0x6a, 0xd9, 0xec, 0x71, 0x3f, 0xa8, 0x75, 0x02, 0xa7, 0xc6, 0xfd, 0x90, 0x32, + 0x4e, 0xc2, 0x58, 0xad, 0xac, 0x7a, 0x91, 0x17, 0xc9, 0xc7, 0x9a, 0x78, 0x4a, 0xad, 0xd5, 0x5f, + 0x72, 0x90, 0x6f, 0xc5, 0x81, 0xcf, 0x51, 0x03, 0x16, 0x78, 0xe2, 0x7b, 0x1e, 0x4d, 0xcc, 0xdc, + 0x5a, 0x6e, 0xbd, 0xb0, 0x51, 0xb1, 0x46, 0xfd, 0x50, 0xbb, 0xb2, 0xa4, 0xeb, 0x41, 0xea, 0x56, + 0xd7, 0x5f, 0x0e, 0x2a, 0x33, 0xaf, 0x06, 0x95, 0x1c, 0xce, 0x22, 0xd1, 0xb7, 0xb0, 0x98, 0x74, + 0x98, 0xed, 0xd2, 0x80, 0x13, 0x73, 0x56, 0xc2, 0xdc, 0xb4, 0x4e, 0xb7, 0x35, 0xdd, 0x99, 0x95, + 0x6d, 0xd0, 0xda, 0x7b, 0xd4, 0x68, 0xb4, 0x38, 0xe1, 0xac, 0x6e, 0x08, 0xcc, 0xe3, 0x41, 0x45, + 0xc7, 0xdb, 0xad, 0x2d, 0x81, 0x82, 0xf5, 0xa4, 0xc3, 0xe4, 0xd3, 0x6d, 0xed, 0xf7, 0x17, 0x95, + 0x5c, 0x15, 0x43, 0x7e, 0x8f, 0x26, 0x1e, 0x3d, 0x5b, 0xc1, 0xd2, 0xf5, 0xfd, 0x05, 0x2b, 0xcc, + 0x0e, 0x14, 0x1b, 0x1d, 0xd2, 0xf5, 0x28, 0xa6, 0x71, 0xe0, 0x3b, 0x84, 0xa1, 0xdd, 0xbf, 0x83, + 0xaf, 0x4f, 0x00, 0x3f, 0x19, 0x33, 0x25, 0x8b, 0xfe, 0xe3, 0x8b, 0xca, 0x8c, 0xcc, 0xf4, 0x66, + 0x16, 0x4a, 0x8d, 0x28, 0x8c, 0x7b, 0x9c, 0x36, 0x3a, 0xd4, 0x39, 0x64, 0xbd, 0x10, 0x7d, 0x07, + 0x05, 0x47, 0x3d, 0xdb, 0xbe, 0x2b, 0xf3, 0x2d, 0xd5, 0x77, 0x04, 0xca, 0xaf, 0x83, 0xca, 0xa6, + 0xe7, 0xf3, 0x4e, 0xaf, 0x6d, 0x39, 0x51, 0x58, 0x1b, 0x56, 0xe0, 0xb6, 0x47, 0xcf, 0xb5, 0xf8, + 0xd0, 0xab, 0xc9, 0xa9, 0xf7, 0x7a, 0xbe, 0x6b, 0x3d, 0x7c, 0xb8, 0xb3, 0x75, 0x3c, 0xa8, 0x40, + 0x86, 0xbe, 0xb3, 0x85, 0x21, 0x43, 0xdf, 0x71, 0xd1, 0x35, 0x58, 0x66, 0xa4, 0x4f, 0x6d, 0xd6, + 0x25, 0x31, 0xeb, 0x44, 0x5c, 0x0e, 0x49, 0xc7, 0x4b, 0xc2, 0xd8, 0x52, 0x36, 0xb4, 0x09, 0x5a, + 0x18, 0xb9, 0xd4, 0x9c, 0x5b, 0xcb, 0xad, 0x17, 0x27, 0xb6, 0x35, 0x43, 0xdf, 0x8b, 0x5c, 0x8a, + 0xa5, 0x33, 0x2a, 0x43, 0x9a, 0x27, 0x8e, 0xfc, 0x2e, 0x37, 0x35, 0x09, 0x3b, 0x66, 0x41, 0x26, + 0x2c, 0xf4, 0x69, 0xc2, 0xfc, 0xa8, 0x6b, 0xe6, 0xd7, 0x72, 0xeb, 0xcb, 0x38, 0x7b, 0x45, 0xdb, + 0xb0, 0xc8, 0x69, 0x12, 0xfa, 0x5d, 0xc2, 0xa9, 0x39, 0xbf, 0x36, 0xb7, 0x5e, 0xd8, 0xb8, 0x3e, + 0x21, 0xa7, 0xea, 0xf3, 0x16, 0x65, 0x4e, 0xe2, 0xc7, 0x3c, 0x4a, 0xea, 0x9a, 0xe8, 0x11, 0x1e, + 0x05, 0xab, 0x69, 0x3e, 0x02, 0x10, 0x2d, 0x26, 0x0e, 0x17, 0xe8, 0xab, 0x90, 0x6f, 0x1f, 0x71, + 0xca, 0x64, 0x5f, 0xe7, 0x70, 0xfa, 0x82, 0x6e, 0x02, 0x62, 0x3d, 0xcf, 0xa3, 0x8c, 0x53, 0xd7, + 0x26, 0xdc, 0xee, 0x92, 0x6e, 0xc4, 0x64, 0x33, 0xe6, 0xb0, 0x31, 0x5c, 0xb9, 0xc3, 0xf7, 0x85, + 0x5d, 0xe1, 0x3e, 0x9f, 0x85, 0x0b, 0xad, 0x6c, 0x69, 0x2c, 0xc3, 0x03, 0x58, 0x64, 0x9c, 0x24, + 0xdc, 0x3e, 0xa4, 0x47, 0x6a, 0x7a, 0x1f, 0xbd, 0x1b, 0x54, 0x6e, 0x9d, 0x69, 0x72, 0xd9, 0xee, + 0xee, 0xd2, 0x23, 0xac, 0x4b, 0x98, 0xbb, 0xf4, 0x08, 0xed, 0xc1, 0x02, 0xed, 0xba, 0x12, 0x70, + 0xf6, 0x5f, 0x00, 0xce, 0xd3, 0xae, 0x2b, 0xe0, 0x1e, 0x00, 0x38, 0xc3, 0x7a, 0xe5, 0x58, 0x0b, + 0x1b, 0xff, 0xb7, 0xa6, 0xc8, 0x9d, 0x35, 0xda, 0xde, 0x18, 0x9f, 0xc7, 0x40, 0x54, 0x4b, 0xfe, + 0xd4, 0x61, 0x55, 0xcd, 0x85, 0x53, 0xf7, 0x8b, 0x3e, 0x09, 0x30, 0x65, 0xbd, 0x80, 0xa3, 0x0a, + 0x14, 0xda, 0x41, 0xe4, 0x1c, 0xda, 0x09, 0x25, 0x6e, 0xda, 0x7b, 0x1d, 0x83, 0x34, 0x61, 0x61, + 0x41, 0x9f, 0x43, 0x5e, 0xea, 0x96, 0x52, 0x89, 0x0f, 0xa6, 0x56, 0xa3, 0x52, 0x08, 0x89, 0xa0, + 0x38, 0x8d, 0x43, 0x1f, 0x43, 0x9e, 0x09, 0x35, 0x52, 0xdb, 0xa9, 0x4e, 0x05, 0x90, 0xba, 0x85, + 0xd3, 0x00, 0x11, 0x19, 0x0a, 0x59, 0x90, 0x24, 0xfd, 0xa7, 0x48, 0x29, 0x20, 0x38, 0x0d, 0x40, + 0xeb, 0x60, 0xf8, 0xcc, 0x0e, 0x28, 0x61, 0xd4, 0x4e, 0xe8, 0xf7, 0x3d, 0xca, 0xb8, 0x39, 0x2f, + 0xb7, 0x56, 0xf4, 0xd9, 0xae, 0x30, 0xe3, 0xd4, 0x8a, 0xee, 0xc0, 0xe2, 0x50, 0x80, 0x4d, 0x5d, + 0xe6, 0xb9, 0x3a, 0x96, 0x47, 0x9c, 0x57, 0xab, 0x13, 0x38, 0xd6, 0x41, 0xe6, 0x34, 0x24, 0x73, + 0x66, 0x40, 0x8f, 0xc1, 0x70, 0x69, 0x9c, 0x50, 0xd9, 0x5a, 0x25, 0xa9, 0x70, 0x7e, 0x49, 0xc5, + 0xa5, 0x11, 0x8a, 0xd4, 0x51, 0x74, 0x00, 0x25, 0x47, 0x2a, 0x97, 0x9d, 0x28, 0xe9, 0x32, 0x97, + 0x24, 0xee, 0x8d, 0xe9, 0x94, 0x38, 0xa1, 0x76, 0xb8, 0xe8, 0x9c, 0x54, 0xcc, 0xeb, 0x50, 0x4c, + 0xc8, 0x13, 0x6e, 0x07, 0x91, 0xa7, 0x8a, 0x5d, 0x96, 0xa7, 0x69, 0x49, 0x58, 0x77, 0x23, 0x2f, + 0xcd, 0x1d, 0x42, 0x81, 0xb8, 0xae, 0xcd, 0x18, 0x27, 0xed, 0x80, 0x9a, 0x2b, 0x32, 0xef, 0xa7, + 0x67, 0x19, 0xfe, 0x09, 0x7e, 0x59, 0x77, 0x5c, 0xb7, 0xd5, 0x3a, 0x10, 0x18, 0xf5, 0xa2, 0x90, + 0xbb, 0xd1, 0x3b, 0x06, 0xe2, 0xba, 0xad, 0x14, 0x1f, 0xed, 0x41, 0x3e, 0xad, 0x05, 0xc9, 0x44, + 0x1f, 0x9e, 0xa7, 0x71, 0xb2, 0x60, 0x35, 0x96, 0x14, 0x05, 0x1d, 0xc2, 0xc5, 0x91, 0x6a, 0x8c, + 0x0e, 0x03, 0x33, 0x2f, 0x48, 0xd5, 0xba, 0x35, 0x9d, 0x83, 0xa7, 0xa5, 0x43, 0xa1, 0xaf, 0xb2, + 0xd3, 0x4b, 0x0c, 0xed, 0xc1, 0x85, 0x38, 0xa1, 0x7d, 0x45, 0xb7, 0xf4, 0x73, 0x85, 0x04, 0xe6, + 0xea, 0x19, 0xc8, 0x84, 0x57, 0x44, 0xa4, 0x24, 0xe4, 0x7d, 0x15, 0x27, 0xe8, 0xe4, 0xa4, 0x17, + 0x8f, 0x9d, 0xdd, 0x07, 0xe6, 0xc5, 0xf7, 0xd2, 0xe9, 0xa4, 0x12, 0x8c, 0xdd, 0x56, 0xb8, 0xe4, + 0x9c, 0x34, 0x5c, 0xf9, 0x0a, 0xc6, 0xba, 0x8f, 0x10, 0x68, 0xe2, 0xb3, 0x27, 0xd5, 0x41, 0x2c, + 0x9f, 0x51, 0x05, 0xf2, 0x4e, 0xe2, 0x6c, 0x6e, 0xc8, 0xb3, 0xbe, 0x5c, 0x5f, 0x3c, 0x1e, 0x54, + 0xf2, 0x0d, 0xdc, 0xd8, 0xdc, 0xc0, 0xa9, 0x3d, 0x15, 0x93, 0xf4, 0x6f, 0x53, 0xd3, 0xf3, 0xc6, + 0x7c, 0x53, 0xd3, 0x17, 0x0c, 0xbd, 0xa9, 0xe9, 0x8b, 0x06, 0x34, 0x35, 0xbd, 0x68, 0x94, 0x9a, + 0x9a, 0x5e, 0x32, 0x8c, 0xa6, 0xa6, 0x1b, 0xc6, 0x4a, 0x73, 0x5e, 0xff, 0x61, 0xdf, 0xf8, 0x69, + 0xbf, 0xba, 0x06, 0xf0, 0x38, 0xf1, 0x39, 0xad, 0x13, 0xee, 0x74, 0x26, 0xa5, 0xae, 0x7e, 0x0d, + 0x4b, 0xbb, 0x91, 0xe7, 0x3b, 0x24, 0xb8, 0x17, 0xef, 0x46, 0x1e, 0xda, 0x86, 0xb9, 0x28, 0x16, + 0x7a, 0xf4, 0xbe, 0x79, 0x4d, 0xa2, 0xc3, 0x10, 0x41, 0xcd, 0x4b, 0x40, 0x54, 0xff, 0xd0, 0xa0, + 0x80, 0xc9, 0x13, 0xde, 0x88, 0xc2, 0x90, 0x74, 0x5d, 0xf4, 0x10, 0x8c, 0xe1, 0x27, 0xa5, 0x3a, + 0x57, 0x4a, 0xdb, 0xce, 0x73, 0x99, 0x95, 0x32, 0x0c, 0xe5, 0x80, 0xfe, 0x07, 0xa5, 0x90, 0x3c, + 0x53, 0x24, 0xf0, 0xbb, 0x2e, 0x7d, 0x26, 0x65, 0x4b, 0xc3, 0xcb, 0x21, 0x79, 0x26, 0x27, 0xbc, + 0x23, 0x8c, 0xe8, 0x00, 0xfe, 0x33, 0xa6, 0x16, 0xc3, 0x4a, 0x64, 0x9c, 0xbc, 0x70, 0x0b, 0x1b, + 0xe6, 0x84, 0x3a, 0x52, 0xd1, 0xba, 0x3c, 0x0a, 0xbd, 0xaf, 0x22, 0xe5, 0x02, 0xea, 0xc3, 0xe5, + 0x93, 0x50, 0x36, 0x13, 0x02, 0xd7, 0x75, 0xa8, 0xd4, 0xbd, 0xb9, 0xfa, 0x67, 0xef, 0x06, 0x95, + 0xdb, 0xe7, 0xba, 0x97, 0x24, 0x70, 0x4b, 0xa1, 0xe0, 0x8b, 0xf1, 0x78, 0xbe, 0xcc, 0x8c, 0x42, + 0xb8, 0x94, 0x0c, 0x8f, 0xbd, 0x4d, 0xfb, 0x24, 0xb0, 0x13, 0x79, 0xf0, 0xa5, 0xa8, 0x4c, 0x3e, + 0xc8, 0xd3, 0x15, 0x23, 0x3b, 0x6a, 0xc9, 0xa4, 0xdb, 0x6a, 0x1b, 0x0a, 0x4f, 0x05, 0x8f, 0xec, + 0xb6, 0x20, 0x92, 0x59, 0x3c, 0xc3, 0x05, 0x39, 0xe2, 0x1d, 0x86, 0xa7, 0x23, 0x0e, 0xde, 0x83, + 0x62, 0x90, 0xb2, 0xc5, 0x8e, 0x62, 0xa1, 0x85, 0x66, 0xe9, 0x0c, 0xf7, 0xdb, 0x38, 0x45, 0xf1, + 0x52, 0x30, 0xf6, 0xd6, 0xd4, 0xf4, 0x39, 0x43, 0x6b, 0x6a, 0x7a, 0xce, 0x98, 0x4d, 0x69, 0xff, + 0xf3, 0x7e, 0xf5, 0x13, 0x58, 0x19, 0x63, 0xde, 0x97, 0x51, 0xc4, 0x69, 0x72, 0x56, 0xa2, 0xd4, + 0x6f, 0xbc, 0x7c, 0x53, 0x9e, 0x79, 0x79, 0x5c, 0xce, 0xbd, 0x3a, 0x2e, 0xe7, 0x5e, 0x1f, 0x97, + 0x73, 0xbf, 0x1d, 0x97, 0x73, 0xcf, 0xdf, 0x96, 0x67, 0x5e, 0xbd, 0x2d, 0xcf, 0xbc, 0x7e, 0x5b, + 0x9e, 0xf9, 0x66, 0x71, 0x58, 0x58, 0x7b, 0x5e, 0xfe, 0x97, 0xb0, 0xf9, 0x57, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x9e, 0x82, 0x03, 0x3d, 0x40, 0x0d, 0x00, 0x00, } diff --git a/pkg/storage/storagepb/proposer_kv.proto b/pkg/storage/storagepb/proposer_kv.proto index 3c2249660208..b10178104a8e 100644 --- a/pkg/storage/storagepb/proposer_kv.proto +++ b/pkg/storage/storagepb/proposer_kv.proto @@ -84,6 +84,9 @@ message ComputeChecksum { // is expected to be set only if we already know that there is an // inconsistency and we want to preserve as much state as possible. bool checkpoint = 4; + // Replicas processing this command which find themselves in this slice will + // terminate. See `CheckConsistencyRequest.Terminate`. + repeated roachpb.ReplicaDescriptor terminate = 6 [(gogoproto.nullable) = false]; } // Compaction holds core details about a suggested compaction. diff --git a/pkg/storage/store.go b/pkg/storage/store.go index 6e2481d9d45b..758be2d28280 100644 --- a/pkg/storage/store.go +++ b/pkg/storage/store.go @@ -699,9 +699,9 @@ type StoreConfig struct { // ConsistencyTestingKnobs is a BatchEvalTestingKnobs struct used to control the // behavior of the consistency checker for tests. type ConsistencyTestingKnobs struct { - // If non-nil, BadChecksumPanic is called by CheckConsistency() instead of - // panicking on a checksum mismatch. - BadChecksumPanic func(roachpb.StoreIdent) + // If non-nil, OnBadChecksumFatal is called by CheckConsistency() (instead of + // calling log.Fatal) on a checksum mismatch. + OnBadChecksumFatal func(roachpb.StoreIdent) // If non-nil, BadChecksumReportDiff is called by CheckConsistency() on a // checksum mismatch to report the diff between snapshots. BadChecksumReportDiff func(roachpb.StoreIdent, ReplicaSnapshotDiffSlice) From 92287137e10a59abbb7200346d12bc47f776633d Mon Sep 17 00:00:00 2001 From: Tobias Schottdorf Date: Mon, 18 Nov 2019 16:06:14 +0100 Subject: [PATCH 3/3] storage: prevent node from restarting after corruption Many deployments auto-restart crashed nodes unconditionally. As a result, we are often pulled into inconsistency failures relatively late, which results in a loss of information (in particular if the source of the problem turns out to be one of the nodes that did not actually crash); if the node that crashes *is* the one with the problem, restarting it lets it serve data again (until the next time the consistency checker nukes it), which is bad as well. This commit introduces a "death rattle" - if a node is told to terminate as the result of a consistency check, it will write a marker file that prevents subsequent restarts of the node with an informative message alerting the operator that there is a serious problem that needs to be addressed. We use the same strategy when a replica finds that its internal invariants are violated. Fixes #40442. Release note (general change): nodes that have been terminated as the result of a failed consistency check now refuse to restart, making it more likely that the operator notices that there is a persistent issue in a timely manner. --- pkg/base/store_spec.go | 47 +++++++++++++++++++++++++++ pkg/base/store_spec_test.go | 38 ++++++++++++++++++++++ pkg/cli/start.go | 6 ++++ pkg/storage/consistency_queue_test.go | 7 ++++ pkg/storage/engine/rocksdb.go | 3 +- pkg/storage/replica_corruption.go | 23 +++++++++++++ pkg/storage/replica_proposal.go | 29 ++++++++++++++--- pkg/storage/replica_test.go | 5 +++ 8 files changed, 153 insertions(+), 5 deletions(-) diff --git a/pkg/base/store_spec.go b/pkg/base/store_spec.go index f109277a8047..6be5cc0c2316 100644 --- a/pkg/base/store_spec.go +++ b/pkg/base/store_spec.go @@ -13,7 +13,9 @@ package base import ( "bytes" "fmt" + "io/ioutil" "net" + "os" "path/filepath" "regexp" "sort" @@ -351,6 +353,51 @@ func (ssl StoreSpecList) String() string { return buffer.String() } +// AuxiliaryDir is the path of the auxiliary dir relative to an engine.Engine's +// root directory. It must not be changed without a proper migration. +const AuxiliaryDir = "auxiliary" + +// PreventedStartupFile is the filename (relative to 'dir') used for files that +// can block server startup. +func PreventedStartupFile(dir string) string { + return filepath.Join(dir, "_CRITICAL_ALERT.txt") +} + +// GetPreventedStartupMessage attempts to read the PreventedStartupFile for each +// store directory and returns their concatenated contents. These files +// typically request operator intervention after a corruption event by +// preventing the affected node(s) from starting back up. +func (ssl StoreSpecList) GetPreventedStartupMessage() (string, error) { + var buf strings.Builder + for _, ss := range ssl.Specs { + path := ss.PreventedStartupFile() + if path == "" { + continue + } + b, err := ioutil.ReadFile(path) + if err != nil { + if !os.IsNotExist(err) { + return "", err + } + continue + } + fmt.Fprintf(&buf, "From %s:\n\n", path) + _, _ = buf.Write(b) + fmt.Fprintln(&buf) + } + return buf.String(), nil +} + +// PreventedStartupFile returns the path to a file which, if it exists, should +// prevent the server from starting up. Returns an empty string for in-memory +// engines. +func (ss StoreSpec) PreventedStartupFile() string { + if ss.InMemory { + return "" + } + return PreventedStartupFile(filepath.Join(ss.Path, AuxiliaryDir)) +} + // Type returns the underlying type in string form. This is part of pflag's // value interface. func (ssl *StoreSpecList) Type() string { diff --git a/pkg/base/store_spec_test.go b/pkg/base/store_spec_test.go index 07535d2f7248..b550db9e3889 100644 --- a/pkg/base/store_spec_test.go +++ b/pkg/base/store_spec_test.go @@ -12,6 +12,9 @@ package base_test import ( "fmt" + "io/ioutil" + "os" + "path/filepath" "reflect" "testing" @@ -19,6 +22,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/testutils" "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/stretchr/testify/require" ) // TestNewStoreSpec verifies that the --store arguments are correctly parsed @@ -217,3 +221,37 @@ func TestJoinListType(t *testing.T) { }) } } + +func TestStoreSpecListPreventedStartupMessage(t *testing.T) { + defer leaktest.AfterTest(t)() + + dir, cleanup := testutils.TempDir(t) + defer cleanup() + + boomStoreDir := filepath.Join(dir, "boom") + boomAuxDir := filepath.Join(boomStoreDir, base.AuxiliaryDir) + okStoreDir := filepath.Join(dir, "ok") + okAuxDir := filepath.Join(okStoreDir, base.AuxiliaryDir) + + for _, sd := range []string{boomAuxDir, okAuxDir} { + require.NoError(t, os.MkdirAll(sd, 0755)) + } + + ssl := base.StoreSpecList{ + Specs: []base.StoreSpec{ + {Path: "foo", InMemory: true}, + {Path: okStoreDir}, + {Path: boomStoreDir}, + }, + } + + msg, err := ssl.GetPreventedStartupMessage() + require.NoError(t, err) + require.Empty(t, msg) + + require.NoError(t, ioutil.WriteFile(ssl.Specs[2].PreventedStartupFile(), []byte("boom"), 0644)) + + msg, err = ssl.GetPreventedStartupMessage() + require.NoError(t, err) + require.Contains(t, msg, "boom") +} diff --git a/pkg/cli/start.go b/pkg/cli/start.go index 9e510fb0d225..1cc22c5cdf40 100644 --- a/pkg/cli/start.go +++ b/pkg/cli/start.go @@ -449,6 +449,12 @@ func runStart(cmd *cobra.Command, args []string, disableReplication bool) error return err } + if s, err := serverCfg.Stores.GetPreventedStartupMessage(); err != nil { + return err + } else if s != "" { + log.Fatal(context.Background(), s) + } + // Set up the signal handlers. This also ensures that any of these // signals received beyond this point do not interrupt the startup // sequence until the point signals are checked below. diff --git a/pkg/storage/consistency_queue_test.go b/pkg/storage/consistency_queue_test.go index 21a600c9ff9b..5cf69f4e25ca 100644 --- a/pkg/storage/consistency_queue_test.go +++ b/pkg/storage/consistency_queue_test.go @@ -14,6 +14,7 @@ import ( "bytes" "context" "fmt" + "io/ioutil" "math/rand" "path/filepath" "testing" @@ -35,6 +36,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/syncutil" "github.com/cockroachdb/cockroach/pkg/util/uuid" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) // TestConsistencyQueueRequiresLive verifies the queue will not @@ -352,6 +354,11 @@ func TestCheckConsistencyInconsistent(t *testing.T) { assert.Equal(t, roachpb.CheckConsistencyResponse_RANGE_INCONSISTENT, resp.Result[0].Status) assert.Contains(t, resp.Result[0].Detail, `[minority]`) assert.Contains(t, resp.Result[0].Detail, `stats`) + + // A death rattle should have been written on s2 (store index 1). + b, err := ioutil.ReadFile(base.PreventedStartupFile(mtc.stores[1].Engine().GetAuxiliaryDir())) + require.NoError(t, err) + require.NotEmpty(t, b) } // TestConsistencyQueueRecomputeStats is an end-to-end test of the mechanism CockroachDB diff --git a/pkg/storage/engine/rocksdb.go b/pkg/storage/engine/rocksdb.go index 4ad8bad48d10..3944ba530450 100644 --- a/pkg/storage/engine/rocksdb.go +++ b/pkg/storage/engine/rocksdb.go @@ -26,6 +26,7 @@ import ( "time" "unsafe" + "github.com/cockroachdb/cockroach/pkg/base" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/settings" "github.com/cockroachdb/cockroach/pkg/settings/cluster" @@ -565,7 +566,7 @@ func NewRocksDB(cfg RocksDBConfig, cache RocksDBCache) (*RocksDB, error) { cache: cache.ref(), } - if err := r.setAuxiliaryDir(filepath.Join(cfg.Dir, "auxiliary")); err != nil { + if err := r.setAuxiliaryDir(filepath.Join(cfg.Dir, base.AuxiliaryDir)); err != nil { return nil, err } diff --git a/pkg/storage/replica_corruption.go b/pkg/storage/replica_corruption.go index 5ce5c9c25015..c546b13c7f67 100644 --- a/pkg/storage/replica_corruption.go +++ b/pkg/storage/replica_corruption.go @@ -12,7 +12,11 @@ package storage import ( "context" + "fmt" + "io/ioutil" + "os" + "github.com/cockroachdb/cockroach/pkg/base" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/util/log" ) @@ -51,6 +55,25 @@ func (r *Replica) setCorruptRaftMuLocked( log.ErrorfDepth(ctx, 1, "stalling replica due to: %s", cErr.ErrorMsg) cErr.Processed = true r.mu.destroyStatus.Set(cErr, destroyReasonRemoved) + + auxDir := r.store.engine.GetAuxiliaryDir() + _ = os.MkdirAll(auxDir, 0755) + path := base.PreventedStartupFile(auxDir) + + preventStartupMsg := fmt.Sprintf(`ATTENTION: + +this node is terminating because replica %s detected an inconsistent state. +Please contact the CockroachDB support team. It is not necessarily safe +to replace this node; cluster data may still be at risk of corruption. + +A file preventing this node from restarting was placed at: +%s +`, r, path) + + if err := ioutil.WriteFile(path, []byte(preventStartupMsg), 0644); err != nil { + log.Warning(ctx, err) + } + log.FatalfDepth(ctx, 1, "replica is corrupted: %s", cErr) return roachpb.NewError(cErr) } diff --git a/pkg/storage/replica_proposal.go b/pkg/storage/replica_proposal.go index 57cac2b4d06b..b566f5ecc0ea 100644 --- a/pkg/storage/replica_proposal.go +++ b/pkg/storage/replica_proposal.go @@ -13,12 +13,14 @@ package storage import ( "context" "fmt" + "io/ioutil" "os" "path/filepath" "strings" "time" "unsafe" + "github.com/cockroachdb/cockroach/pkg/base" "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/roachpb" "github.com/cockroachdb/cockroach/pkg/settings/cluster" @@ -256,14 +258,33 @@ func (r *Replica) computeChecksumPostApply(ctx context.Context, cc storagepb.Com // holder and thus won't be printed to the logs. Since we're already // in a goroutine that's about to end, simply sleep for a few seconds // and then terminate. + auxDir := r.store.engine.GetAuxiliaryDir() + _ = os.MkdirAll(auxDir, 0755) + path := base.PreventedStartupFile(auxDir) + + preventStartupMsg := fmt.Sprintf(`ATTENTION: + +this node is terminating because a replica inconsistency was detected between %s +and its other replicas. Please check your cluster-wide log files for more +information and contact the CockroachDB support team. It is not necessarily safe +to replace this node; cluster data may still be at risk of corruption. + +A checkpoints directory to aid (expert) debugging should be present in: +%s + +A file preventing this node from restarting was placed at: +%s +`, r, auxDir, path) + + if err := ioutil.WriteFile(path, []byte(preventStartupMsg), 0644); err != nil { + log.Warning(ctx, err) + } + if p := r.store.cfg.TestingKnobs.ConsistencyTestingKnobs.OnBadChecksumFatal; p != nil { p(*r.store.Ident) } else { time.Sleep(10 * time.Second) - log.Fatalf(r.AnnotateCtx(context.Background()), - "this node is terminating because a replica inconsistency was detected "+ - "between %s and its other replicas. Please check your cluster-wide log files for "+ - "more information and contact the CockroachDB support team.", r) + log.Fatalf(r.AnnotateCtx(context.Background()), preventStartupMsg) } } diff --git a/pkg/storage/replica_test.go b/pkg/storage/replica_test.go index dc8eefcc4bd8..931d09de671d 100644 --- a/pkg/storage/replica_test.go +++ b/pkg/storage/replica_test.go @@ -16,6 +16,7 @@ import ( "fmt" "math" "math/rand" + "os" "reflect" "regexp" "sort" @@ -6030,6 +6031,10 @@ func TestReplicaCorruption(t *testing.T) { t.Fatalf("unexpected error: %s", pErr) } + // Should have laid down marker file to prevent startup. + _, err := os.Stat(base.PreventedStartupFile(tc.engine.GetAuxiliaryDir())) + require.NoError(t, err) + // Should have triggered fatal error. if exitStatus != 255 { t.Fatalf("unexpected exit status %d", exitStatus)