dynamic index version control (#27335)

Co-authored-by: longjiquan <jiquan.long@zilliz.com>
This commit is contained in:
foxspy 2023-09-25 21:39:27 +08:00 committed by GitHub
parent cec7e99106
commit 5db4a0489e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
50 changed files with 1013 additions and 693 deletions

View File

@ -523,8 +523,6 @@ common:
info: 500 # minimum milliseconds for printing durations in info level info: 500 # minimum milliseconds for printing durations in info level
warn: 1000 # minimum milliseconds for printing durations in warn level warn: 1000 # minimum milliseconds for printing durations in warn level
indexEngineVersion: "knowhere-v0"
# QuotaConfig, configurations of Milvus quota and limits. # QuotaConfig, configurations of Milvus quota and limits.
# By default, we enable: # By default, we enable:
# 1. TT protection; # 1. TT protection;

View File

@ -165,6 +165,7 @@ using BinarySet = knowhere::BinarySet;
using Dataset = knowhere::DataSet; using Dataset = knowhere::DataSet;
using DatasetPtr = knowhere::DataSetPtr; using DatasetPtr = knowhere::DataSetPtr;
using MetricType = knowhere::MetricType; using MetricType = knowhere::MetricType;
using IndexVersion = knowhere::IndexVersion;
// TODO :: type define milvus index type(vector index type and scalar index type) // TODO :: type define milvus index type(vector index type and scalar index type)
using IndexType = knowhere::IndexType; using IndexType = knowhere::IndexType;

View File

@ -21,6 +21,7 @@
#include "glog/logging.h" #include "glog/logging.h"
#include "log/Log.h" #include "log/Log.h"
#include "knowhere/comp/knowhere_config.h" #include "knowhere/comp/knowhere_config.h"
#include "knowhere/version.h"
namespace milvus::config { namespace milvus::config {
@ -85,4 +86,14 @@ KnowhereInitSearchThreadPool(const uint32_t num_threads) {
} }
} }
int32_t
GetMinimalIndexVersion() {
return knowhere::Version::GetMinimalVersion().VersionNumber();
}
int32_t
GetCurrentIndexVersion() {
return knowhere::Version::GetCurrentVersion().VersionNumber();
}
} // namespace milvus::config } // namespace milvus::config

View File

@ -30,4 +30,11 @@ KnowhereInitBuildThreadPool(const uint32_t);
void void
KnowhereInitSearchThreadPool(const uint32_t); KnowhereInitSearchThreadPool(const uint32_t);
int32_t
GetMinimalIndexVersion();
int32_t
GetCurrentIndexVersion();
} // namespace milvus::config } // namespace milvus::config

View File

@ -24,7 +24,7 @@ struct CreateIndexInfo {
DataType field_type; DataType field_type;
IndexType index_type; IndexType index_type;
MetricType metric_type; MetricType metric_type;
std::string index_engine_version; IndexVersion index_engine_version;
}; };
} // namespace milvus::index } // namespace milvus::index

View File

@ -120,11 +120,13 @@ GetIndexTypeFromConfig(const Config& config) {
return index_type.value(); return index_type.value();
} }
std::string IndexVersion
GetIndexEngineVersionFromConfig(const Config& config) { GetIndexEngineVersionFromConfig(const Config& config) {
auto index_engine_version = auto index_engine_version =
GetValueFromConfig<std::string>(config, INDEX_ENGINE_VERSION); GetValueFromConfig<std::string>(config, INDEX_ENGINE_VERSION);
return index_engine_version.has_value() ? index_engine_version.value() : ""; AssertInfo(index_engine_version.has_value(),
"index_engine not exist in config");
return (std::stoi(index_engine_version.value()));
} }
// TODO :: too ugly // TODO :: too ugly

View File

@ -100,7 +100,7 @@ GetMetricTypeFromConfig(const Config& config);
std::string std::string
GetIndexTypeFromConfig(const Config& config); GetIndexTypeFromConfig(const Config& config);
std::string IndexVersion
GetIndexEngineVersionFromConfig(const Config& config); GetIndexEngineVersionFromConfig(const Config& config);
storage::FieldDataMeta storage::FieldDataMeta

View File

@ -36,7 +36,7 @@ template <typename T>
VectorDiskAnnIndex<T>::VectorDiskAnnIndex( VectorDiskAnnIndex<T>::VectorDiskAnnIndex(
const IndexType& index_type, const IndexType& index_type,
const MetricType& metric_type, const MetricType& metric_type,
const std::string& version, const IndexVersion& version,
const storage::FileManagerContext& file_manager_context) const storage::FileManagerContext& file_manager_context)
: VectorIndex(index_type, metric_type) { : VectorIndex(index_type, metric_type) {
file_manager_ = file_manager_ =

View File

@ -30,7 +30,7 @@ class VectorDiskAnnIndex : public VectorIndex {
explicit VectorDiskAnnIndex( explicit VectorDiskAnnIndex(
const IndexType& index_type, const IndexType& index_type,
const MetricType& metric_type, const MetricType& metric_type,
const std::string& version, const IndexVersion& version,
const storage::FileManagerContext& file_manager_context); const storage::FileManagerContext& file_manager_context);
BinarySet BinarySet
Serialize(const Config& config) override { // deprecated Serialize(const Config& config) override { // deprecated

View File

@ -91,11 +91,12 @@ class VectorIndex : public IndexBase {
} }
void void
CheckCompatible(const std::string& version) { CheckCompatible(const IndexVersion& version) {
std::string err_msg = std::string err_msg =
"version not support : " + version + "version not support : " + std::to_string(version) +
" , knowhere current version " + " , knowhere current version " +
knowhere::Version::GetCurrentVersion().VersionCode(); std::to_string(
knowhere::Version::GetCurrentVersion().VersionNumber());
AssertInfo( AssertInfo(
knowhere::Version::VersionSupport(knowhere::Version(version)), knowhere::Version::VersionSupport(knowhere::Version(version)),
err_msg); err_msg);

View File

@ -51,7 +51,7 @@ namespace milvus::index {
VectorMemIndex::VectorMemIndex( VectorMemIndex::VectorMemIndex(
const IndexType& index_type, const IndexType& index_type,
const MetricType& metric_type, const MetricType& metric_type,
const std::string& version, const IndexVersion& version,
const storage::FileManagerContext& file_manager_context) const storage::FileManagerContext& file_manager_context)
: VectorIndex(index_type, metric_type) { : VectorIndex(index_type, metric_type) {
AssertInfo(!is_unsupported(index_type, metric_type), AssertInfo(!is_unsupported(index_type, metric_type),

View File

@ -32,7 +32,7 @@ class VectorMemIndex : public VectorIndex {
explicit VectorMemIndex( explicit VectorMemIndex(
const IndexType& index_type, const IndexType& index_type,
const MetricType& metric_type, const MetricType& metric_type,
const std::string& version, const IndexVersion& version,
const storage::FileManagerContext& file_manager_context = const storage::FileManagerContext& file_manager_context =
storage::FileManagerContext()); storage::FileManagerContext());

View File

@ -53,8 +53,8 @@ CreateIndex(enum CDataType dtype,
config[param.key()] = param.value(); config[param.key()] = param.value();
} }
config[milvus::index::INDEX_ENGINE_VERSION] = config[milvus::index::INDEX_ENGINE_VERSION] = std::to_string(
knowhere::Version::GetDefaultVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber());
auto& index_factory = milvus::indexbuilder::IndexFactory::GetInstance(); auto& index_factory = milvus::indexbuilder::IndexFactory::GetInstance();
auto index = auto index =
@ -90,13 +90,11 @@ CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info) {
AssertInfo(index_type.has_value(), "index type is empty"); AssertInfo(index_type.has_value(), "index type is empty");
index_info.index_type = index_type.value(); index_info.index_type = index_type.value();
auto engine_version = auto engine_version = build_index_info->index_engine_version;
build_index_info->index_engine_version.empty()
? knowhere::Version::GetDefaultVersion().VersionCode()
: build_index_info->index_engine_version;
index_info.index_engine_version = engine_version; index_info.index_engine_version = engine_version;
config[milvus::index::INDEX_ENGINE_VERSION] = engine_version; config[milvus::index::INDEX_ENGINE_VERSION] =
std::to_string(engine_version);
// get metric type // get metric type
if (milvus::datatype_is_vector(field_type)) { if (milvus::datatype_is_vector(field_type)) {
@ -459,10 +457,9 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info,
CStatus CStatus
AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info,
const char* c_index_engine_version) { int32_t index_engine_version) {
try { try {
auto build_index_info = (BuildIndexInfo*)c_load_index_info; auto build_index_info = (BuildIndexInfo*)c_load_index_info;
std::string index_engine_version(c_index_engine_version);
build_index_info->index_engine_version = index_engine_version; build_index_info->index_engine_version = index_engine_version;
auto status = CStatus(); auto status = CStatus();

View File

@ -88,7 +88,7 @@ AppendInsertFilePath(CBuildIndexInfo c_build_index_info, const char* file_path);
CStatus CStatus
AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info, AppendIndexEngineVersionToBuildInfo(CBuildIndexInfo c_load_index_info,
const char* c_index_engine_version); int32_t c_index_engine_version);
CStatus CStatus
CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info); CreateIndexV2(CIndex* res_index, CBuildIndexInfo c_build_index_info);

View File

@ -33,5 +33,5 @@ struct BuildIndexInfo {
std::vector<std::string> insert_files; std::vector<std::string> insert_files;
milvus::storage::StorageConfig storage_config; milvus::storage::StorageConfig storage_config;
milvus::Config config; milvus::Config config;
std::string index_engine_version; int32_t index_engine_version;
}; };

View File

@ -36,7 +36,7 @@ VectorFieldIndexing::VectorFieldIndexing(const FieldMeta& field_meta,
index_ = std::make_unique<index::VectorMemIndex>( index_ = std::make_unique<index::VectorMemIndex>(
config_->GetIndexType(), config_->GetIndexType(),
config_->GetMetricType(), config_->GetMetricType(),
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
} }
void void
@ -58,7 +58,7 @@ VectorFieldIndexing::BuildIndexRange(int64_t ack_beg,
auto indexing = std::make_unique<index::VectorMemIndex>( auto indexing = std::make_unique<index::VectorMemIndex>(
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::IndexEnum::INDEX_FAISS_IVFFLAT,
knowhere::metric::L2, knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
auto dataset = knowhere::GenDataSet( auto dataset = knowhere::GenDataSet(
source->get_size_per_chunk(), dim, chunk.data()); source->get_size_per_chunk(), dim, chunk.data());
indexing->BuildWithDataset(dataset, conf); indexing->BuildWithDataset(dataset, conf);

View File

@ -42,7 +42,7 @@ struct LoadIndexInfo {
std::map<std::string, std::string> index_params; std::map<std::string, std::string> index_params;
std::vector<std::string> index_files; std::vector<std::string> index_files;
index::IndexBasePtr index; index::IndexBasePtr index;
std::string index_engine_version; IndexVersion index_engine_version;
}; };
} // namespace milvus::segcore } // namespace milvus::segcore

View File

@ -211,10 +211,7 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info) {
auto& index_params = load_index_info->index_params; auto& index_params = load_index_info->index_params;
auto field_type = load_index_info->field_type; auto field_type = load_index_info->field_type;
auto engine_version = auto engine_version = load_index_info->index_engine_version;
load_index_info->index_engine_version.empty()
? knowhere::Version::GetDefaultVersion().VersionCode()
: load_index_info->index_engine_version;
milvus::index::CreateIndexInfo index_info; milvus::index::CreateIndexInfo index_info;
index_info.field_type = load_index_info->field_type; index_info.field_type = load_index_info->field_type;
@ -326,11 +323,10 @@ AppendIndexInfo(CLoadIndexInfo c_load_index_info,
CStatus CStatus
AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info,
const char* c_index_engine_version) { int32_t index_engine_version) {
try { try {
auto load_index_info = auto load_index_info =
(milvus::segcore::LoadIndexInfo*)c_load_index_info; (milvus::segcore::LoadIndexInfo*)c_load_index_info;
std::string index_engine_version(c_index_engine_version);
load_index_info->index_engine_version = index_engine_version; load_index_info->index_engine_version = index_engine_version;
auto status = CStatus(); auto status = CStatus();

View File

@ -60,7 +60,7 @@ AppendIndexV2(CLoadIndexInfo c_load_index_info);
CStatus CStatus
AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info, AppendIndexEngineVersionToLoadInfo(CLoadIndexInfo c_load_index_info,
const char* c_index_engine_version); int32_t index_engine_version);
CStatus CStatus
CleanLoadedIndex(CLoadIndexInfo c_load_index_info); CleanLoadedIndex(CLoadIndexInfo c_load_index_info);

View File

@ -77,4 +77,14 @@ SegcoreCloseGlog() {
} }
} }
extern "C" int32_t
GetCurrentIndexVersion() {
return milvus::config::GetCurrentIndexVersion();
}
extern "C" int32_t
GetMinimalIndexVersion() {
return milvus::config::GetMinimalIndexVersion();
}
} // namespace milvus::segcore } // namespace milvus::segcore

View File

@ -43,6 +43,12 @@ SegcoreSetKnowhereSearchThreadPoolNum(const uint32_t num_threads);
void void
SegcoreCloseGlog(); SegcoreCloseGlog();
int32_t
GetCurrentIndexVersion();
int32_t
GetMinimalIndexVersion();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -11,7 +11,7 @@
# or implied. See the License for the specific language governing permissions and limitations under the License. # or implied. See the License for the specific language governing permissions and limitations under the License.
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
set( KNOWHERE_VERSION b724230 ) set( KNOWHERE_VERSION 87190cf )
set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git") set( GIT_REPOSITORY "https://github.com/zilliztech/knowhere.git")
if ( INDEX_ENGINE STREQUAL "cardinal" ) if ( INDEX_ENGINE STREQUAL "cardinal" )
set( KNOWHERE_VERSION main) set( KNOWHERE_VERSION main)

View File

@ -61,7 +61,7 @@ IndexBuilder_build(benchmark::State& state) {
config[param.key()] = param.value(); config[param.key()] = param.value();
} }
config[milvus::index::INDEX_ENGINE_VERSION] = config[milvus::index::INDEX_ENGINE_VERSION] =
knowhere::Version::GetCurrentVersion().VersionCode(); std::to_string(knowhere::Version::GetCurrentVersion().VersionNumber());
auto is_binary = state.range(2); auto is_binary = state.range(2);
auto dataset = GenDataset(NB, metric_type, is_binary); auto dataset = GenDataset(NB, metric_type, is_binary);

View File

@ -1531,7 +1531,7 @@ TEST(Expr, TestArrayInTerm) {
return false; return false;
}}, }},
}; };
std::string raw_plan_tmp = R"(vector_anns: < std::string raw_plan_tmp = R"(vector_anns: <
field_id: 100 field_id: 100
predicates: < predicates: <

View File

@ -249,7 +249,8 @@ generate_index(void* raw_data,
IndexType index_type, IndexType index_type,
int64_t dim, int64_t dim,
int64_t N) { int64_t N) {
auto engine_version = knowhere::Version::GetCurrentVersion().VersionCode(); auto engine_version =
knowhere::Version::GetCurrentVersion().VersionNumber();
CreateIndexInfo create_index_info{ CreateIndexInfo create_index_info{
field_type, index_type, metric_type, engine_version}; field_type, index_type, metric_type, engine_version};
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
@ -1600,7 +1601,7 @@ TEST(CApiTest, LoadIndexInfo) {
auto [raw_data, timestamps, uids] = generate_data(N); auto [raw_data, timestamps, uids] = generate_data(N);
auto indexing = knowhere::IndexFactory::Instance().Create( auto indexing = knowhere::IndexFactory::Instance().Create(
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, knowhere::IndexEnum::INDEX_FAISS_IVFSQ8,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
auto conf = auto conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
{knowhere::meta::DIM, DIM}, {knowhere::meta::DIM, DIM},
@ -1633,7 +1634,9 @@ TEST(CApiTest, LoadIndexInfo) {
status = AppendFieldInfo( status = AppendFieldInfo(
c_load_index_info, 0, 0, 0, 0, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 0, CDataType::FloatVector, "");
ASSERT_EQ(status.error_code, Success); ASSERT_EQ(status.error_code, Success);
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
status = AppendIndex(c_load_index_info, c_binary_set); status = AppendIndex(c_load_index_info, c_binary_set);
ASSERT_EQ(status.error_code, Success); ASSERT_EQ(status.error_code, Success);
DeleteLoadIndexInfo(c_load_index_info); DeleteLoadIndexInfo(c_load_index_info);
@ -1648,7 +1651,7 @@ TEST(CApiTest, LoadIndexSearch) {
auto [raw_data, timestamps, uids] = generate_data(N); auto [raw_data, timestamps, uids] = generate_data(N);
auto indexing = knowhere::IndexFactory::Instance().Create( auto indexing = knowhere::IndexFactory::Instance().Create(
knowhere::IndexEnum::INDEX_FAISS_IVFSQ8, knowhere::IndexEnum::INDEX_FAISS_IVFSQ8,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
auto conf = auto conf =
knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2}, knowhere::Json{{knowhere::meta::METRIC_TYPE, knowhere::metric::L2},
{knowhere::meta::DIM, DIM}, {knowhere::meta::DIM, DIM},
@ -1674,7 +1677,7 @@ TEST(CApiTest, LoadIndexSearch) {
load_index_info.index = std::make_unique<VectorMemIndex>( load_index_info.index = std::make_unique<VectorMemIndex>(
index_params["index_type"], index_params["index_type"],
knowhere::metric::L2, knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
load_index_info.index->Load(binary_set); load_index_info.index->Load(binary_set);
// search // search
@ -1792,7 +1795,9 @@ TEST(CApiTest, Indexing_Without_Predicate) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
auto sealed_segment = SealedCreator(schema, dataset); auto sealed_segment = SealedCreator(schema, dataset);
@ -1932,7 +1937,9 @@ TEST(CApiTest, Indexing_Expr_Without_Predicate) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2102,7 +2109,9 @@ TEST(CApiTest, Indexing_With_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2274,7 +2283,9 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2438,7 +2449,9 @@ TEST(CApiTest, Indexing_With_float_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2603,7 +2616,9 @@ TEST(CApiTest, Indexing_Expr_With_float_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2774,7 +2789,9 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -2945,7 +2962,9 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -3110,7 +3129,9 @@ TEST(CApiTest, Indexing_With_binary_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -3298,7 +3319,9 @@ TEST(CApiTest, Indexing_Expr_With_binary_Predicate_Term) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::BinaryVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load index for vec field, load raw data for scalar field // load index for vec field, load raw data for scalar field
@ -3469,7 +3492,9 @@ TEST(CApiTest, SealedSegment_search_float_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
auto query_dataset = knowhere::GenDataSet(num_queries, DIM, query_ptr); auto query_dataset = knowhere::GenDataSet(num_queries, DIM, query_ptr);
@ -3694,7 +3719,9 @@ TEST(CApiTest, SealedSegment_search_float_With_Expr_Predicate_Range) {
c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str()); c_load_index_info, metric_type_key.c_str(), metric_type_value.c_str());
AppendFieldInfo( AppendFieldInfo(
c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, ""); c_load_index_info, 0, 0, 0, 100, CDataType::FloatVector, "");
AppendIndexEngineVersionToLoadInfo(c_load_index_info, knowhere::Version::GetCurrentVersion().VersionCode().c_str()); AppendIndexEngineVersionToLoadInfo(
c_load_index_info,
knowhere::Version::GetCurrentVersion().VersionNumber());
AppendIndex(c_load_index_info, (CBinarySet)&binary_set); AppendIndex(c_load_index_info, (CBinarySet)&binary_set);
// load vec index // load vec index

View File

@ -801,7 +801,7 @@ TEST(Expr, TestUnaryRangeJson) {
proto::plan::Array val; proto::plan::Array val;
std::vector<std::string> nested_path; std::vector<std::string> nested_path;
}; };
proto::plan::Array arr; proto::plan::Array arr;
arr.set_same_type(true); arr.set_same_type(true);
proto::plan::GenericValue int_val1; proto::plan::GenericValue int_val1;

View File

@ -134,7 +134,8 @@ TEST_P(IndexWrapperTest, BuildAndQuery) {
storage::FileManagerContext file_manager_context( storage::FileManagerContext file_manager_context(
field_data_meta, index_meta, chunk_manager); field_data_meta, index_meta, chunk_manager);
config[milvus::index::INDEX_ENGINE_VERSION] = knowhere::Version::GetCurrentVersion().VersionCode(); config[milvus::index::INDEX_ENGINE_VERSION] =
std::to_string(knowhere::Version::GetCurrentVersion().VersionNumber());
auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex(
vec_field_data_type, config, file_manager_context); vec_field_data_type, config, file_manager_context);

View File

@ -224,7 +224,7 @@ TEST(Indexing, Naive) {
create_index_info.metric_type = knowhere::metric::L2; create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFPQ; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFPQ;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
auto index = milvus::index::IndexFactory::GetInstance().CreateIndex( auto index = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, milvus::storage::FileManagerContext()); create_index_info, milvus::storage::FileManagerContext());
@ -389,7 +389,7 @@ TEST_P(IndexTest, BuildAndQuery) {
create_index_info.metric_type = metric_type; create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type; create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
index::IndexBasePtr index; index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
@ -442,7 +442,7 @@ TEST_P(IndexTest, Mmap) {
create_index_info.metric_type = metric_type; create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type; create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
index::IndexBasePtr index; index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
@ -499,7 +499,7 @@ TEST_P(IndexTest, GetVector) {
create_index_info.metric_type = metric_type; create_index_info.metric_type = metric_type;
create_index_info.field_type = vec_field_data_type; create_index_info.field_type = vec_field_data_type;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
index::IndexBasePtr index; index::IndexBasePtr index;
milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100}; milvus::storage::FieldDataMeta field_data_meta{1, 2, 3, 100};
@ -578,7 +578,7 @@ TEST(Indexing, SearchDiskAnnWithInvalidParam) {
create_index_info.metric_type = metric_type; create_index_info.metric_type = metric_type;
create_index_info.field_type = milvus::DataType::VECTOR_FLOAT; create_index_info.field_type = milvus::DataType::VECTOR_FLOAT;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
int64_t collection_id = 1; int64_t collection_id = 1;
int64_t partition_id = 2; int64_t partition_id = 2;

View File

@ -90,7 +90,7 @@ TEST(Sealed, without_predicate) {
create_index_info.metric_type = knowhere::metric::L2; create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, milvus::storage::FileManagerContext()); create_index_info, milvus::storage::FileManagerContext());
@ -205,7 +205,7 @@ TEST(Sealed, with_predicate) {
create_index_info.metric_type = knowhere::metric::L2; create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( auto indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, milvus::storage::FileManagerContext()); create_index_info, milvus::storage::FileManagerContext());
@ -311,7 +311,7 @@ TEST(Sealed, with_predicate_filter_all) {
create_index_info.metric_type = knowhere::metric::L2; create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT; create_index_info.index_type = knowhere::IndexEnum::INDEX_FAISS_IVFFLAT;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
auto ivf_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( auto ivf_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, milvus::storage::FileManagerContext()); create_index_info, milvus::storage::FileManagerContext());
@ -351,7 +351,7 @@ TEST(Sealed, with_predicate_filter_all) {
create_index_info.metric_type = knowhere::metric::L2; create_index_info.metric_type = knowhere::metric::L2;
create_index_info.index_type = knowhere::IndexEnum::INDEX_HNSW; create_index_info.index_type = knowhere::IndexEnum::INDEX_HNSW;
create_index_info.index_engine_version = create_index_info.index_engine_version =
knowhere::Version::GetCurrentVersion().VersionCode(); knowhere::Version::GetCurrentVersion().VersionNumber();
auto hnsw_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex( auto hnsw_indexing = milvus::index::IndexFactory::GetInstance().CreateIndex(
create_index_info, milvus::storage::FileManagerContext()); create_index_info, milvus::storage::FileManagerContext());
hnsw_indexing->BuildWithDataset(database, hnsw_conf); hnsw_indexing->BuildWithDataset(database, hnsw_conf);
@ -1224,7 +1224,7 @@ TEST(Sealed, GetVectorFromChunkCache) {
auto indexing = std::make_unique<index::VectorMemIndex>( auto indexing = std::make_unique<index::VectorMemIndex>(
index_type, index_type,
metric_type, metric_type,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
indexing->BuildWithDataset(ds, conf); indexing->BuildWithDataset(ds, conf);
auto segment_sealed = CreateSealedSegment(schema); auto segment_sealed = CreateSealedSegment(schema);

View File

@ -912,7 +912,7 @@ GenVecIndexing(int64_t N, int64_t dim, const float* vec) {
auto indexing = std::make_unique<index::VectorMemIndex>( auto indexing = std::make_unique<index::VectorMemIndex>(
knowhere::IndexEnum::INDEX_FAISS_IVFFLAT, knowhere::IndexEnum::INDEX_FAISS_IVFFLAT,
knowhere::metric::L2, knowhere::metric::L2,
knowhere::Version::GetCurrentVersion().VersionCode()); knowhere::Version::GetCurrentVersion().VersionNumber());
indexing->BuildWithDataset(database, conf); indexing->BuildWithDataset(database, conf);
return indexing; return indexing;
} }

View File

@ -292,16 +292,17 @@ func (ib *indexBuilder) process(buildID UniqueID) bool {
} }
} }
req := &indexpb.CreateJobRequest{ req := &indexpb.CreateJobRequest{
ClusterID: Params.CommonCfg.ClusterPrefix.GetValue(), ClusterID: Params.CommonCfg.ClusterPrefix.GetValue(),
IndexFilePrefix: path.Join(ib.chunkManager.RootPath(), common.SegmentIndexPath), IndexFilePrefix: path.Join(ib.chunkManager.RootPath(), common.SegmentIndexPath),
BuildID: buildID, BuildID: buildID,
DataPaths: binLogs, DataPaths: binLogs,
IndexVersion: meta.IndexVersion + 1, IndexVersion: meta.IndexVersion + 1,
StorageConfig: storageConfig, StorageConfig: storageConfig,
IndexParams: indexParams, IndexParams: indexParams,
TypeParams: typeParams, TypeParams: typeParams,
NumRows: meta.NumRows, NumRows: meta.NumRows,
IndexEngineVersion: meta.IndexEngineVersion, CurrentIndexVersion: meta.CurrentIndexVersion,
MinimalIndexVersion: meta.MinimalIndexVersion,
} }
if err := ib.assignTask(client, req); err != nil { if err := ib.assignTask(client, req); err != nil {
// need to release lock then reassign, so set task state to retry // need to release lock then reassign, so set task state to retry

View File

@ -0,0 +1,95 @@
package datacoord
import (
"math"
"sync"
"go.uber.org/zap"
"github.com/milvus-io/milvus/internal/util/sessionutil"
"github.com/milvus-io/milvus/pkg/log"
)
type IndexEngineVersionManager struct {
mu sync.Mutex
versions map[int64]sessionutil.IndexEngineVersion
}
func newIndexEngineVersionManager() *IndexEngineVersionManager {
return &IndexEngineVersionManager{
versions: map[int64]sessionutil.IndexEngineVersion{},
}
}
func (m *IndexEngineVersionManager) Startup(sessions map[string]*sessionutil.Session) {
m.mu.Lock()
defer m.mu.Unlock()
for _, session := range sessions {
m.addOrUpdate(session)
}
}
func (m *IndexEngineVersionManager) AddNode(session *sessionutil.Session) {
m.mu.Lock()
defer m.mu.Unlock()
m.addOrUpdate(session)
}
func (m *IndexEngineVersionManager) RemoveNode(session *sessionutil.Session) {
m.mu.Lock()
defer m.mu.Unlock()
delete(m.versions, session.ServerID)
}
func (m *IndexEngineVersionManager) Update(session *sessionutil.Session) {
m.mu.Lock()
defer m.mu.Unlock()
m.addOrUpdate(session)
}
func (m *IndexEngineVersionManager) addOrUpdate(session *sessionutil.Session) {
log.Info("addOrUpdate version", zap.Int64("nodeId", session.ServerID), zap.Int32("minimal", session.IndexEngineVersion.MinimalIndexVersion), zap.Int32("current", session.IndexEngineVersion.CurrentIndexVersion))
m.versions[session.ServerID] = session.IndexEngineVersion
}
func (m *IndexEngineVersionManager) GetCurrentIndexEngineVersion() int32 {
m.mu.Lock()
defer m.mu.Unlock()
if len(m.versions) == 0 {
log.Info("index versions is empty")
return 0
}
current := int32(math.MaxInt32)
for _, version := range m.versions {
if version.CurrentIndexVersion < current {
current = version.CurrentIndexVersion
}
}
log.Info("Merged current version", zap.Int32("current", current))
return current
}
func (m *IndexEngineVersionManager) GetMinimalIndexEngineVersion() int32 {
m.mu.Lock()
defer m.mu.Unlock()
if len(m.versions) == 0 {
log.Info("index versions is empty")
return 0
}
minimal := int32(0)
for _, version := range m.versions {
if version.MinimalIndexVersion > minimal {
minimal = version.MinimalIndexVersion
}
}
log.Info("Merged minimal version", zap.Int32("minimal", minimal))
return minimal
}

View File

@ -0,0 +1,50 @@
package datacoord
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/milvus-io/milvus/internal/util/sessionutil"
)
func Test_IndexEngineVersionManager_GetMergedIndexVersion(t *testing.T) {
m := newIndexEngineVersionManager()
// empty
assert.Zero(t, m.GetCurrentIndexEngineVersion())
// startup
m.Startup(map[string]*sessionutil.Session{
"1": {
ServerID: 1,
IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 20, MinimalIndexVersion: 0},
},
})
assert.Equal(t, int32(20), m.GetCurrentIndexEngineVersion())
assert.Equal(t, int32(0), m.GetMinimalIndexEngineVersion())
// add node
m.AddNode(&sessionutil.Session{
ServerID: 2,
IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 10, MinimalIndexVersion: 5},
})
assert.Equal(t, int32(10), m.GetCurrentIndexEngineVersion())
assert.Equal(t, int32(5), m.GetMinimalIndexEngineVersion())
// update
m.Update(&sessionutil.Session{
ServerID: 2,
IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 5, MinimalIndexVersion: 2},
})
assert.Equal(t, int32(5), m.GetCurrentIndexEngineVersion())
assert.Equal(t, int32(2), m.GetMinimalIndexEngineVersion())
// remove
m.RemoveNode(&sessionutil.Session{
ServerID: 2,
IndexEngineVersion: sessionutil.IndexEngineVersion{CurrentIndexVersion: 5, MinimalIndexVersion: 3},
})
assert.Equal(t, int32(20), m.GetCurrentIndexEngineVersion())
assert.Equal(t, int32(0), m.GetMinimalIndexEngineVersion())
}

View File

@ -51,24 +51,25 @@ func (s *Server) startIndexService(ctx context.Context) {
} }
func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) error { func (s *Server) createIndexForSegment(segment *SegmentInfo, indexID UniqueID) error {
indexEngineVersion := Params.CommonCfg.IndexEngineVersion.GetValue() indexEngineVersion := s.IndexEngineVersionManager.GetCurrentIndexEngineVersion()
log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID), log.Info("create index for segment", zap.Int64("segmentID", segment.ID), zap.Int64("indexID", indexID),
zap.String("index_engine_version", indexEngineVersion), zap.Int32("index_engine_version", indexEngineVersion),
) )
buildID, err := s.allocator.allocID(context.Background()) buildID, err := s.allocator.allocID(context.Background())
if err != nil { if err != nil {
return err return err
} }
segIndex := &model.SegmentIndex{ segIndex := &model.SegmentIndex{
SegmentID: segment.ID, SegmentID: segment.ID,
CollectionID: segment.CollectionID, CollectionID: segment.CollectionID,
PartitionID: segment.PartitionID, PartitionID: segment.PartitionID,
NumRows: segment.NumOfRows, NumRows: segment.NumOfRows,
IndexID: indexID, IndexID: indexID,
BuildID: buildID, BuildID: buildID,
CreateTime: uint64(segment.ID), CreateTime: uint64(segment.ID),
WriteHandoff: false, WriteHandoff: false,
IndexEngineVersion: indexEngineVersion, CurrentIndexVersion: s.IndexEngineVersionManager.GetCurrentIndexEngineVersion(),
MinimalIndexVersion: s.IndexEngineVersionManager.GetMinimalIndexEngineVersion(),
} }
if err = s.meta.AddSegmentIndex(segIndex); err != nil { if err = s.meta.AddSegmentIndex(segIndex); err != nil {
return err return err
@ -736,17 +737,18 @@ func (s *Server) GetIndexInfos(ctx context.Context, req *indexpb.GetIndexInfoReq
indexParams = append(indexParams, s.meta.GetTypeParams(segIdx.CollectionID, segIdx.IndexID)...) indexParams = append(indexParams, s.meta.GetTypeParams(segIdx.CollectionID, segIdx.IndexID)...)
ret.SegmentInfo[segID].IndexInfos = append(ret.SegmentInfo[segID].IndexInfos, ret.SegmentInfo[segID].IndexInfos = append(ret.SegmentInfo[segID].IndexInfos,
&indexpb.IndexFilePathInfo{ &indexpb.IndexFilePathInfo{
SegmentID: segID, SegmentID: segID,
FieldID: s.meta.GetFieldIDByIndexID(segIdx.CollectionID, segIdx.IndexID), FieldID: s.meta.GetFieldIDByIndexID(segIdx.CollectionID, segIdx.IndexID),
IndexID: segIdx.IndexID, IndexID: segIdx.IndexID,
BuildID: segIdx.BuildID, BuildID: segIdx.BuildID,
IndexName: s.meta.GetIndexNameByID(segIdx.CollectionID, segIdx.IndexID), IndexName: s.meta.GetIndexNameByID(segIdx.CollectionID, segIdx.IndexID),
IndexParams: indexParams, IndexParams: indexParams,
IndexFilePaths: indexFilePaths, IndexFilePaths: indexFilePaths,
SerializedSize: segIdx.IndexSize, SerializedSize: segIdx.IndexSize,
IndexVersion: segIdx.IndexVersion, IndexVersion: segIdx.IndexVersion,
NumRows: segIdx.NumRows, NumRows: segIdx.NumRows,
IndexEngineVersion: segIdx.IndexEngineVersion, CurrentIndexVersion: segIdx.CurrentIndexVersion,
MinimalIndexVersion: segIdx.MinimalIndexVersion,
}) })
} }
} }

View File

@ -135,6 +135,7 @@ type Server struct {
dnEventCh <-chan *sessionutil.SessionEvent dnEventCh <-chan *sessionutil.SessionEvent
inEventCh <-chan *sessionutil.SessionEvent inEventCh <-chan *sessionutil.SessionEvent
// qcEventCh <-chan *sessionutil.SessionEvent // qcEventCh <-chan *sessionutil.SessionEvent
qnEventCh <-chan *sessionutil.SessionEvent
enableActiveStandBy bool enableActiveStandBy bool
activateFunc func() error activateFunc func() error
@ -145,8 +146,9 @@ type Server struct {
// indexCoord types.IndexCoord // indexCoord types.IndexCoord
// segReferManager *SegmentReferenceManager // segReferManager *SegmentReferenceManager
indexBuilder *indexBuilder indexBuilder *indexBuilder
indexNodeManager *IndexNodeManager indexNodeManager *IndexNodeManager
IndexEngineVersionManager *IndexEngineVersionManager
// manage ways that data coord access other coord // manage ways that data coord access other coord
broker Broker broker Broker
@ -523,6 +525,15 @@ func (s *Server) initServiceDiscovery() error {
} }
s.inEventCh = s.session.WatchServices(typeutil.IndexNodeRole, inRevision+1, nil) s.inEventCh = s.session.WatchServices(typeutil.IndexNodeRole, inRevision+1, nil)
s.IndexEngineVersionManager = newIndexEngineVersionManager()
qnSessions, qnRevision, err := s.session.GetSessions(typeutil.QueryNodeRole)
if err != nil {
log.Warn("DataCoord get QueryNode sessions failed", zap.Error(err))
return err
}
s.IndexEngineVersionManager.Startup(qnSessions)
s.qnEventCh = s.session.WatchServicesWithVersionRange(typeutil.QueryNodeRole, r, qnRevision+1, nil)
return nil return nil
} }
@ -818,6 +829,19 @@ func (s *Server) watchService(ctx context.Context) {
}() }()
return return
} }
case event, ok := <-s.qnEventCh:
if !ok {
s.stopServiceWatch()
return
}
if err := s.handleSessionEvent(ctx, typeutil.QueryNodeRole, event); err != nil {
go func() {
if err := s.Stop(); err != nil {
log.Warn("DataCoord server stop error", zap.Error(err))
}
}()
return
}
} }
} }
} }
@ -881,6 +905,26 @@ func (s *Server) handleSessionEvent(ctx context.Context, role string, event *ses
log.Warn("receive unknown service event type", log.Warn("receive unknown service event type",
zap.Any("type", event.EventType)) zap.Any("type", event.EventType))
} }
case typeutil.QueryNodeRole:
switch event.EventType {
case sessionutil.SessionAddEvent:
log.Info("received querynode register",
zap.String("address", event.Session.Address),
zap.Int64("serverID", event.Session.ServerID))
s.IndexEngineVersionManager.AddNode(event.Session)
case sessionutil.SessionDelEvent:
log.Info("received querynode unregister",
zap.String("address", event.Session.Address),
zap.Int64("serverID", event.Session.ServerID))
s.IndexEngineVersionManager.RemoveNode(event.Session)
case sessionutil.SessionUpdateEvent:
serverID := event.Session.ServerID
log.Info("received querynode SessionUpdateEvent", zap.Int64("serverID", serverID))
s.IndexEngineVersionManager.Update(event.Session)
default:
log.Warn("receive unknown service event type",
zap.Any("type", event.EventType))
}
} }
return nil return nil

View File

@ -63,7 +63,8 @@ func (i *IndexNode) CreateJob(ctx context.Context, req *indexpb.CreateJobRequest
zap.Any("typeParams", req.GetTypeParams()), zap.Any("typeParams", req.GetTypeParams()),
zap.Any("indexParams", req.GetIndexParams()), zap.Any("indexParams", req.GetIndexParams()),
zap.Int64("numRows", req.GetNumRows()), zap.Int64("numRows", req.GetNumRows()),
zap.String("index_engine_version", req.GetIndexEngineVersion()), zap.Int32("current_index_version", req.GetCurrentIndexVersion()),
zap.Int32("minimal_index_version", req.GetMinimalIndexVersion()),
) )
ctx, sp := otel.Tracer(typeutil.IndexNodeRole).Start(ctx, "IndexNode-CreateIndex", trace.WithAttributes( ctx, sp := otel.Tracer(typeutil.IndexNodeRole).Start(ctx, "IndexNode-CreateIndex", trace.WithAttributes(
attribute.Int64("indexBuildID", req.GetBuildID()), attribute.Int64("indexBuildID", req.GetBuildID()),

View File

@ -337,7 +337,7 @@ func (it *indexBuildTask) BuildIndex(ctx context.Context) error {
} }
} }
if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetIndexEngineVersion()); err != nil { if err := buildIndexInfo.AppendIndexEngineVersion(it.req.GetCurrentIndexVersion()); err != nil {
log.Ctx(ctx).Warn("append index engine version failed", zap.Error(err)) log.Ctx(ctx).Warn("append index engine version failed", zap.Error(err))
return err return err
} }

View File

@ -22,8 +22,9 @@ type SegmentIndex struct {
IndexFileKeys []string IndexFileKeys []string
IndexSize uint64 IndexSize uint64
// deprecated // deprecated
WriteHandoff bool WriteHandoff bool
IndexEngineVersion string CurrentIndexVersion int32
MinimalIndexVersion int32
} }
func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex { func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex {
@ -32,22 +33,23 @@ func UnmarshalSegmentIndexModel(segIndex *indexpb.SegmentIndex) *SegmentIndex {
} }
return &SegmentIndex{ return &SegmentIndex{
SegmentID: segIndex.SegmentID, SegmentID: segIndex.SegmentID,
CollectionID: segIndex.CollectionID, CollectionID: segIndex.CollectionID,
PartitionID: segIndex.PartitionID, PartitionID: segIndex.PartitionID,
NumRows: segIndex.NumRows, NumRows: segIndex.NumRows,
IndexID: segIndex.IndexID, IndexID: segIndex.IndexID,
BuildID: segIndex.BuildID, BuildID: segIndex.BuildID,
NodeID: segIndex.NodeID, NodeID: segIndex.NodeID,
IndexState: segIndex.State, IndexState: segIndex.State,
FailReason: segIndex.FailReason, FailReason: segIndex.FailReason,
IndexVersion: segIndex.IndexVersion, IndexVersion: segIndex.IndexVersion,
IsDeleted: segIndex.Deleted, IsDeleted: segIndex.Deleted,
CreateTime: segIndex.CreateTime, CreateTime: segIndex.CreateTime,
IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys),
IndexSize: segIndex.SerializeSize, IndexSize: segIndex.SerializeSize,
WriteHandoff: segIndex.WriteHandoff, WriteHandoff: segIndex.WriteHandoff,
IndexEngineVersion: segIndex.GetIndexEngineVersion(), CurrentIndexVersion: segIndex.GetCurrentIndexVersion(),
MinimalIndexVersion: segIndex.GetMinimalIndexVersion(),
} }
} }
@ -57,42 +59,44 @@ func MarshalSegmentIndexModel(segIdx *SegmentIndex) *indexpb.SegmentIndex {
} }
return &indexpb.SegmentIndex{ return &indexpb.SegmentIndex{
CollectionID: segIdx.CollectionID, CollectionID: segIdx.CollectionID,
PartitionID: segIdx.PartitionID, PartitionID: segIdx.PartitionID,
SegmentID: segIdx.SegmentID, SegmentID: segIdx.SegmentID,
NumRows: segIdx.NumRows, NumRows: segIdx.NumRows,
IndexID: segIdx.IndexID, IndexID: segIdx.IndexID,
BuildID: segIdx.BuildID, BuildID: segIdx.BuildID,
NodeID: segIdx.NodeID, NodeID: segIdx.NodeID,
State: segIdx.IndexState, State: segIdx.IndexState,
FailReason: segIdx.FailReason, FailReason: segIdx.FailReason,
IndexVersion: segIdx.IndexVersion, IndexVersion: segIdx.IndexVersion,
IndexFileKeys: common.CloneStringList(segIdx.IndexFileKeys), IndexFileKeys: common.CloneStringList(segIdx.IndexFileKeys),
Deleted: segIdx.IsDeleted, Deleted: segIdx.IsDeleted,
CreateTime: segIdx.CreateTime, CreateTime: segIdx.CreateTime,
SerializeSize: segIdx.IndexSize, SerializeSize: segIdx.IndexSize,
WriteHandoff: segIdx.WriteHandoff, WriteHandoff: segIdx.WriteHandoff,
IndexEngineVersion: segIdx.IndexEngineVersion, CurrentIndexVersion: segIdx.CurrentIndexVersion,
MinimalIndexVersion: segIdx.MinimalIndexVersion,
} }
} }
func CloneSegmentIndex(segIndex *SegmentIndex) *SegmentIndex { func CloneSegmentIndex(segIndex *SegmentIndex) *SegmentIndex {
return &SegmentIndex{ return &SegmentIndex{
SegmentID: segIndex.SegmentID, SegmentID: segIndex.SegmentID,
CollectionID: segIndex.CollectionID, CollectionID: segIndex.CollectionID,
PartitionID: segIndex.PartitionID, PartitionID: segIndex.PartitionID,
NumRows: segIndex.NumRows, NumRows: segIndex.NumRows,
IndexID: segIndex.IndexID, IndexID: segIndex.IndexID,
BuildID: segIndex.BuildID, BuildID: segIndex.BuildID,
NodeID: segIndex.NodeID, NodeID: segIndex.NodeID,
IndexState: segIndex.IndexState, IndexState: segIndex.IndexState,
FailReason: segIndex.FailReason, FailReason: segIndex.FailReason,
IndexVersion: segIndex.IndexVersion, IndexVersion: segIndex.IndexVersion,
IsDeleted: segIndex.IsDeleted, IsDeleted: segIndex.IsDeleted,
CreateTime: segIndex.CreateTime, CreateTime: segIndex.CreateTime,
IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys), IndexFileKeys: common.CloneStringList(segIndex.IndexFileKeys),
IndexSize: segIndex.IndexSize, IndexSize: segIndex.IndexSize,
WriteHandoff: segIndex.WriteHandoff, WriteHandoff: segIndex.WriteHandoff,
IndexEngineVersion: segIndex.IndexEngineVersion, CurrentIndexVersion: segIndex.CurrentIndexVersion,
MinimalIndexVersion: segIndex.MinimalIndexVersion,
} }
} }

View File

@ -83,7 +83,8 @@ message SegmentIndex {
uint64 create_time = 13; uint64 create_time = 13;
uint64 serialize_size = 14; uint64 serialize_size = 14;
bool write_handoff = 15; bool write_handoff = 15;
string index_engine_version = 16; int32 current_index_version = 16;
int32 minimal_index_version = 17;
} }
message RegisterNodeRequest { message RegisterNodeRequest {
@ -153,7 +154,8 @@ message IndexFilePathInfo {
uint64 serialized_size = 8; uint64 serialized_size = 8;
int64 index_version = 9; int64 index_version = 9;
int64 num_rows = 10; int64 num_rows = 10;
string index_engine_version = 11; int32 current_index_version = 11;
int32 minimal_index_version = 12;
} }
message SegmentInfo { message SegmentInfo {
@ -225,7 +227,8 @@ message CreateJobRequest {
repeated common.KeyValuePair index_params = 9; repeated common.KeyValuePair index_params = 9;
repeated common.KeyValuePair type_params = 10; repeated common.KeyValuePair type_params = 10;
int64 num_rows = 11; int64 num_rows = 11;
string index_engine_version = 12; int32 current_index_version = 12;
int32 minimal_index_version = 13;
} }
message QueryJobsRequest { message QueryJobsRequest {

View File

@ -236,7 +236,8 @@ type SegmentIndex struct {
CreateTime uint64 `protobuf:"varint,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` CreateTime uint64 `protobuf:"varint,13,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
SerializeSize uint64 `protobuf:"varint,14,opt,name=serialize_size,json=serializeSize,proto3" json:"serialize_size,omitempty"` SerializeSize uint64 `protobuf:"varint,14,opt,name=serialize_size,json=serializeSize,proto3" json:"serialize_size,omitempty"`
WriteHandoff bool `protobuf:"varint,15,opt,name=write_handoff,json=writeHandoff,proto3" json:"write_handoff,omitempty"` WriteHandoff bool `protobuf:"varint,15,opt,name=write_handoff,json=writeHandoff,proto3" json:"write_handoff,omitempty"`
IndexEngineVersion string `protobuf:"bytes,16,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` CurrentIndexVersion int32 `protobuf:"varint,16,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"`
MinimalIndexVersion int32 `protobuf:"varint,17,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -372,11 +373,18 @@ func (m *SegmentIndex) GetWriteHandoff() bool {
return false return false
} }
func (m *SegmentIndex) GetIndexEngineVersion() string { func (m *SegmentIndex) GetCurrentIndexVersion() int32 {
if m != nil { if m != nil {
return m.IndexEngineVersion return m.CurrentIndexVersion
} }
return "" return 0
}
func (m *SegmentIndex) GetMinimalIndexVersion() int32 {
if m != nil {
return m.MinimalIndexVersion
}
return 0
} }
type RegisterNodeRequest struct { type RegisterNodeRequest struct {
@ -901,7 +909,8 @@ type IndexFilePathInfo struct {
SerializedSize uint64 `protobuf:"varint,8,opt,name=serialized_size,json=serializedSize,proto3" json:"serialized_size,omitempty"` SerializedSize uint64 `protobuf:"varint,8,opt,name=serialized_size,json=serializedSize,proto3" json:"serialized_size,omitempty"`
IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"` IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"`
NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` CurrentIndexVersion int32 `protobuf:"varint,11,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"`
MinimalIndexVersion int32 `protobuf:"varint,12,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1002,11 +1011,18 @@ func (m *IndexFilePathInfo) GetNumRows() int64 {
return 0 return 0
} }
func (m *IndexFilePathInfo) GetIndexEngineVersion() string { func (m *IndexFilePathInfo) GetCurrentIndexVersion() int32 {
if m != nil { if m != nil {
return m.IndexEngineVersion return m.CurrentIndexVersion
} }
return "" return 0
}
func (m *IndexFilePathInfo) GetMinimalIndexVersion() int32 {
if m != nil {
return m.MinimalIndexVersion
}
return 0
} }
type SegmentInfo struct { type SegmentInfo struct {
@ -1533,7 +1549,8 @@ type CreateJobRequest struct {
IndexParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"` IndexParams []*commonpb.KeyValuePair `protobuf:"bytes,9,rep,name=index_params,json=indexParams,proto3" json:"index_params,omitempty"`
TypeParams []*commonpb.KeyValuePair `protobuf:"bytes,10,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"` TypeParams []*commonpb.KeyValuePair `protobuf:"bytes,10,rep,name=type_params,json=typeParams,proto3" json:"type_params,omitempty"`
NumRows int64 `protobuf:"varint,11,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` NumRows int64 `protobuf:"varint,11,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,12,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` CurrentIndexVersion int32 `protobuf:"varint,12,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"`
MinimalIndexVersion int32 `protobuf:"varint,13,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1641,11 +1658,18 @@ func (m *CreateJobRequest) GetNumRows() int64 {
return 0 return 0
} }
func (m *CreateJobRequest) GetIndexEngineVersion() string { func (m *CreateJobRequest) GetCurrentIndexVersion() int32 {
if m != nil { if m != nil {
return m.IndexEngineVersion return m.CurrentIndexVersion
} }
return "" return 0
}
func (m *CreateJobRequest) GetMinimalIndexVersion() int32 {
if m != nil {
return m.MinimalIndexVersion
}
return 0
} }
type QueryJobsRequest struct { type QueryJobsRequest struct {
@ -2197,154 +2221,156 @@ func init() {
func init() { proto.RegisterFile("index_coord.proto", fileDescriptor_f9e019eb3fda53c2) } func init() { proto.RegisterFile("index_coord.proto", fileDescriptor_f9e019eb3fda53c2) }
var fileDescriptor_f9e019eb3fda53c2 = []byte{ var fileDescriptor_f9e019eb3fda53c2 = []byte{
// 2344 bytes of a gzipped FileDescriptorProto // 2377 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x59, 0xdd, 0x6f, 0xdc, 0x58, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5a, 0xdd, 0x6e, 0x1c, 0x49,
0x15, 0xaf, 0xe3, 0x49, 0x32, 0x3e, 0x9e, 0xc9, 0xc7, 0xdd, 0x2c, 0x4c, 0xa7, 0x5d, 0x9a, 0xba, 0xf5, 0x4f, 0xbb, 0xc7, 0xf6, 0xf4, 0xe9, 0x19, 0x7f, 0x54, 0x9c, 0xff, 0x7f, 0x32, 0xc9, 0x12,
0xdb, 0x36, 0x20, 0x9a, 0x96, 0x2c, 0x8b, 0x16, 0x04, 0x48, 0x69, 0xd2, 0x8f, 0xb4, 0xdb, 0x2a, 0xa7, 0xb3, 0x49, 0x0c, 0x22, 0x4e, 0xf0, 0xb2, 0x68, 0x41, 0x80, 0xe4, 0xd8, 0x9b, 0x64, 0x92,
0x38, 0x55, 0x25, 0x56, 0x08, 0xe3, 0x19, 0xdf, 0x99, 0xdc, 0x8d, 0xc7, 0x77, 0xea, 0x7b, 0xdd, 0x4d, 0x64, 0xda, 0x51, 0x24, 0x56, 0x88, 0xa6, 0x67, 0xba, 0xc6, 0xae, 0x75, 0x4f, 0xd7, 0xa4,
0x36, 0x45, 0x42, 0xf0, 0xc0, 0x03, 0x68, 0x25, 0x04, 0xaa, 0xc4, 0x3f, 0xc0, 0x0b, 0xfb, 0x0f, 0xab, 0x3a, 0x89, 0x83, 0x84, 0xe0, 0x82, 0x0b, 0xd0, 0x4a, 0x08, 0xb4, 0x12, 0x2f, 0xc0, 0xd5,
0x20, 0xf1, 0xc2, 0x0b, 0x8f, 0x3c, 0xf1, 0xce, 0xff, 0x82, 0xee, 0x87, 0x3d, 0xb6, 0xc7, 0x93, 0x3e, 0x02, 0x37, 0xdc, 0x70, 0x85, 0xb8, 0xe2, 0x1e, 0xf1, 0x04, 0xbc, 0x03, 0xaa, 0x8f, 0xee,
0x99, 0x26, 0x41, 0x48, 0xf0, 0x36, 0xf7, 0xdc, 0x73, 0x3f, 0x7c, 0xce, 0xef, 0x9c, 0xdf, 0x39, 0xe9, 0xee, 0xe9, 0xf1, 0x4c, 0x6c, 0x23, 0x24, 0xb8, 0x9b, 0x3a, 0x75, 0xea, 0xa3, 0xcf, 0xf9,
0x77, 0x60, 0x95, 0x44, 0x01, 0x7e, 0xed, 0x75, 0x29, 0x8d, 0x83, 0xcd, 0x61, 0x4c, 0x39, 0x45, 0x9d, 0x73, 0x7e, 0xa7, 0x34, 0xb0, 0x4a, 0xa2, 0x00, 0xbf, 0xf1, 0x7a, 0x94, 0xc6, 0xc1, 0xe6,
0x68, 0x40, 0xc2, 0x97, 0x09, 0x53, 0xa3, 0x4d, 0x39, 0xdf, 0x6e, 0x74, 0xe9, 0x60, 0x40, 0x23, 0x30, 0xa6, 0x9c, 0x22, 0x34, 0x20, 0xe1, 0xab, 0x84, 0xa9, 0xd1, 0xa6, 0x9c, 0x6f, 0x37, 0x7a,
0x25, 0x6b, 0x2f, 0x91, 0x88, 0xe3, 0x38, 0xf2, 0x43, 0x3d, 0x6e, 0xe4, 0x57, 0x38, 0xff, 0xaa, 0x74, 0x30, 0xa0, 0x91, 0x92, 0xb5, 0x97, 0x48, 0xc4, 0x71, 0x1c, 0xf9, 0xa1, 0x1e, 0x37, 0xf2,
0x81, 0xb5, 0x27, 0x56, 0xed, 0x45, 0x3d, 0x8a, 0x1c, 0x68, 0x74, 0x69, 0x18, 0xe2, 0x2e, 0x27, 0x2b, 0x9c, 0xbf, 0xd7, 0xc0, 0xea, 0x88, 0x55, 0x9d, 0xa8, 0x4f, 0x91, 0x03, 0x8d, 0x1e, 0x0d,
0x34, 0xda, 0xdb, 0x6d, 0x19, 0xeb, 0xc6, 0x86, 0xe9, 0x16, 0x64, 0xa8, 0x05, 0x8b, 0x3d, 0x82, 0x43, 0xdc, 0xe3, 0x84, 0x46, 0x9d, 0xdd, 0x96, 0xb1, 0x6e, 0x6c, 0x98, 0x6e, 0x41, 0x86, 0x5a,
0xc3, 0x60, 0x6f, 0xb7, 0x35, 0x27, 0xa7, 0xd3, 0x21, 0xfa, 0x00, 0x40, 0x5d, 0x30, 0xf2, 0x07, 0xb0, 0xd8, 0x27, 0x38, 0x0c, 0x3a, 0xbb, 0xad, 0x39, 0x39, 0x9d, 0x0e, 0xd1, 0x7b, 0x00, 0xea,
0xb8, 0x65, 0xae, 0x1b, 0x1b, 0x96, 0x6b, 0x49, 0xc9, 0x53, 0x7f, 0x80, 0xc5, 0x42, 0x39, 0xd8, 0x82, 0x91, 0x3f, 0xc0, 0x2d, 0x73, 0xdd, 0xd8, 0xb0, 0x5c, 0x4b, 0x4a, 0x9e, 0xf9, 0x03, 0x2c,
0xdb, 0x6d, 0xd5, 0xd4, 0x42, 0x3d, 0x44, 0x77, 0xc1, 0xe6, 0xc7, 0x43, 0xec, 0x0d, 0xfd, 0xd8, 0x16, 0xca, 0x41, 0x67, 0xb7, 0x55, 0x53, 0x0b, 0xf5, 0x10, 0xdd, 0x07, 0x9b, 0x1f, 0x0f, 0xb1,
0x1f, 0xb0, 0xd6, 0xfc, 0xba, 0xb9, 0x61, 0x6f, 0x5d, 0xdd, 0x2c, 0x7c, 0x9a, 0xfe, 0xa6, 0xc7, 0x37, 0xf4, 0x63, 0x7f, 0xc0, 0x5a, 0xf3, 0xeb, 0xe6, 0x86, 0xbd, 0x75, 0x7d, 0xb3, 0xf0, 0x69,
0xf8, 0xf8, 0xb9, 0x1f, 0x26, 0x78, 0xdf, 0x27, 0xb1, 0x0b, 0x62, 0xd5, 0xbe, 0x5c, 0x84, 0x76, 0xfa, 0x9b, 0x9e, 0xe0, 0xe3, 0x17, 0x7e, 0x98, 0xe0, 0x3d, 0x9f, 0xc4, 0x2e, 0x88, 0x55, 0x7b,
0xa1, 0xa1, 0x0e, 0xd7, 0x9b, 0x2c, 0xcc, 0xba, 0x89, 0x2d, 0x97, 0xe9, 0x5d, 0xae, 0xea, 0x5d, 0x72, 0x11, 0xda, 0x85, 0x86, 0x3a, 0x5c, 0x6f, 0xb2, 0x30, 0xeb, 0x26, 0xb6, 0x5c, 0xa6, 0x77,
0x70, 0xe0, 0xc5, 0xf4, 0x15, 0x6b, 0x2d, 0xca, 0x8b, 0xda, 0x5a, 0xe6, 0xd2, 0x57, 0x4c, 0x7c, 0xb9, 0xae, 0x77, 0xc1, 0x81, 0x17, 0xd3, 0xd7, 0xac, 0xb5, 0x28, 0x2f, 0x6a, 0x6b, 0x99, 0x4b,
0x25, 0xa7, 0xdc, 0x0f, 0x95, 0x42, 0x5d, 0x2a, 0x58, 0x52, 0x22, 0xa7, 0x3f, 0x86, 0x79, 0xc6, 0x5f, 0x33, 0xf1, 0x95, 0x9c, 0x72, 0x3f, 0x54, 0x0a, 0x75, 0xa9, 0x60, 0x49, 0x89, 0x9c, 0xfe,
0x7d, 0x8e, 0x5b, 0xd6, 0xba, 0xb1, 0xb1, 0xb4, 0x75, 0xa5, 0xf2, 0x02, 0xd2, 0xe2, 0x07, 0x42, 0x10, 0xe6, 0x19, 0xf7, 0x39, 0x6e, 0x59, 0xeb, 0xc6, 0xc6, 0xd2, 0xd6, 0xb5, 0xca, 0x0b, 0x48,
0xcd, 0x55, 0xda, 0xe8, 0x63, 0xf8, 0xaa, 0xba, 0xbe, 0x1c, 0x7a, 0x3d, 0x9f, 0x84, 0x5e, 0x8c, 0x8b, 0xef, 0x0b, 0x35, 0x57, 0x69, 0xa3, 0x0f, 0xe1, 0xff, 0xd5, 0xf5, 0xe5, 0xd0, 0xeb, 0xfb,
0x7d, 0x46, 0xa3, 0x16, 0x48, 0x43, 0xae, 0x91, 0x6c, 0xcd, 0x7d, 0x9f, 0x84, 0xae, 0x9c, 0x43, 0x24, 0xf4, 0x62, 0xec, 0x33, 0x1a, 0xb5, 0x40, 0x1a, 0x72, 0x8d, 0x64, 0x6b, 0x1e, 0xf8, 0x24,
0x0e, 0x34, 0x09, 0xf3, 0xfc, 0x84, 0x53, 0x4f, 0xce, 0xb7, 0xec, 0x75, 0x63, 0xa3, 0xee, 0xda, 0x74, 0xe5, 0x1c, 0x72, 0xa0, 0x49, 0x98, 0xe7, 0x27, 0x9c, 0x7a, 0x72, 0xbe, 0x65, 0xaf, 0x1b,
0x84, 0x6d, 0x27, 0x9c, 0xca, 0x63, 0xd0, 0x13, 0x58, 0x4d, 0x18, 0x8e, 0xbd, 0x82, 0x79, 0x1a, 0x1b, 0x75, 0xd7, 0x26, 0x6c, 0x3b, 0xe1, 0x54, 0x1e, 0x83, 0x9e, 0xc2, 0x6a, 0xc2, 0x70, 0xec,
0xb3, 0x9a, 0x67, 0x59, 0xac, 0xdd, 0xcb, 0x99, 0xe8, 0x9b, 0x80, 0x86, 0x38, 0x0a, 0x48, 0xd4, 0x15, 0xcc, 0xd3, 0x98, 0xd5, 0x3c, 0xcb, 0x62, 0x6d, 0x27, 0x67, 0xa2, 0xaf, 0x03, 0x1a, 0xe2,
0xd7, 0x3b, 0x4a, 0x3b, 0x34, 0xa5, 0x1d, 0x56, 0xf4, 0x8c, 0xd4, 0x17, 0xe6, 0x70, 0x7e, 0x6d, 0x28, 0x20, 0xd1, 0x81, 0xde, 0x51, 0xda, 0xa1, 0x29, 0xed, 0xb0, 0xa2, 0x67, 0xa4, 0xbe, 0x30,
0x00, 0xdc, 0x97, 0xf8, 0x90, 0x77, 0xf9, 0x7e, 0x0a, 0x11, 0x12, 0xf5, 0xa8, 0x84, 0x97, 0xbd, 0x87, 0xf3, 0x4b, 0x03, 0xe0, 0x81, 0xc4, 0x87, 0xbc, 0xcb, 0x77, 0x53, 0x88, 0x90, 0xa8, 0x4f,
0xf5, 0xc1, 0xe6, 0x38, 0x86, 0x37, 0x33, 0x4c, 0x6a, 0x04, 0x49, 0x78, 0xb6, 0x60, 0x31, 0xc0, 0x25, 0xbc, 0xec, 0xad, 0xf7, 0x36, 0xc7, 0x31, 0xbc, 0x99, 0x61, 0x52, 0x23, 0x48, 0xc2, 0xb3,
0x21, 0xe6, 0x38, 0x90, 0xd0, 0xab, 0xbb, 0xe9, 0x10, 0x5d, 0x01, 0xbb, 0x1b, 0x63, 0x61, 0x39, 0x05, 0x8b, 0x01, 0x0e, 0x31, 0xc7, 0x81, 0x84, 0x5e, 0xdd, 0x4d, 0x87, 0xe8, 0x1a, 0xd8, 0xbd,
0x4e, 0x34, 0xf6, 0x6a, 0x2e, 0x28, 0xd1, 0x33, 0x32, 0xc0, 0xce, 0x5f, 0x6a, 0xd0, 0x38, 0xc0, 0x18, 0x0b, 0xcb, 0x71, 0xa2, 0xb1, 0x57, 0x73, 0x41, 0x89, 0x9e, 0x93, 0x01, 0x76, 0xfe, 0x59,
0xfd, 0x01, 0x8e, 0xb8, 0xba, 0xc9, 0x2c, 0x50, 0x5f, 0x07, 0x7b, 0xe8, 0xc7, 0x9c, 0x68, 0x15, 0x83, 0xc6, 0x3e, 0x3e, 0x18, 0xe0, 0x88, 0xab, 0x9b, 0xcc, 0x02, 0xf5, 0x75, 0xb0, 0x87, 0x7e,
0x05, 0xf7, 0xbc, 0x08, 0x5d, 0x06, 0x8b, 0xe9, 0x5d, 0x77, 0xe5, 0xa9, 0xa6, 0x3b, 0x12, 0xa0, 0xcc, 0x89, 0x56, 0x51, 0x70, 0xcf, 0x8b, 0xd0, 0x55, 0xb0, 0x98, 0xde, 0x75, 0x57, 0x9e, 0x6a,
0x8b, 0x50, 0x8f, 0x92, 0x81, 0x32, 0x90, 0x86, 0x7c, 0x94, 0x0c, 0x24, 0x4c, 0x72, 0xc1, 0x30, 0xba, 0x23, 0x01, 0xba, 0x0c, 0xf5, 0x28, 0x19, 0x28, 0x03, 0x69, 0xc8, 0x47, 0xc9, 0x40, 0xc2,
0x5f, 0x0c, 0x86, 0x16, 0x2c, 0x76, 0x12, 0x22, 0xe3, 0x6b, 0x41, 0xcd, 0xe8, 0x21, 0xfa, 0x0a, 0x24, 0x17, 0x0c, 0xf3, 0xc5, 0x60, 0x68, 0xc1, 0x62, 0x37, 0x21, 0x32, 0xbe, 0x16, 0xd4, 0x8c,
0x2c, 0x44, 0x34, 0xc0, 0x7b, 0xbb, 0x1a, 0x96, 0x7a, 0x84, 0xae, 0x41, 0x53, 0x19, 0xf5, 0x25, 0x1e, 0xa2, 0xff, 0x83, 0x85, 0x88, 0x06, 0xb8, 0xb3, 0xab, 0x61, 0xa9, 0x47, 0xe8, 0x06, 0x34,
0x8e, 0x19, 0xa1, 0x91, 0x06, 0xa5, 0x42, 0xf2, 0x73, 0x25, 0x3b, 0x2d, 0x2e, 0xaf, 0x80, 0x3d, 0x95, 0x51, 0x5f, 0xe1, 0x98, 0x11, 0x1a, 0x69, 0x50, 0x2a, 0x24, 0xbf, 0x50, 0xb2, 0xd3, 0xe2,
0x8e, 0x45, 0xe8, 0x8d, 0x10, 0x78, 0x03, 0x96, 0xd5, 0xe1, 0x3d, 0x12, 0x62, 0xef, 0x08, 0x1f, 0xf2, 0x1a, 0xd8, 0xe3, 0x58, 0x84, 0xfe, 0x08, 0x81, 0xb7, 0x60, 0x59, 0x1d, 0xde, 0x27, 0x21,
0xb3, 0x96, 0xbd, 0x6e, 0x6e, 0x58, 0xae, 0xba, 0xd3, 0x7d, 0x12, 0xe2, 0xc7, 0xf8, 0x98, 0xe5, 0xf6, 0x8e, 0xf0, 0x31, 0x6b, 0xd9, 0xeb, 0xe6, 0x86, 0xe5, 0xaa, 0x3b, 0x3d, 0x20, 0x21, 0x7e,
0x7d, 0xd7, 0x38, 0xd1, 0x77, 0xcd, 0xb2, 0xef, 0xd0, 0x75, 0x58, 0x62, 0x38, 0x26, 0x7e, 0x48, 0x82, 0x8f, 0x59, 0xde, 0x77, 0x8d, 0x13, 0x7d, 0xd7, 0x2c, 0xfb, 0x0e, 0xdd, 0x84, 0x25, 0x86,
0xde, 0x60, 0x8f, 0x91, 0x37, 0xb8, 0xb5, 0x24, 0x75, 0x9a, 0x99, 0xf4, 0x80, 0xbc, 0xc1, 0xc2, 0x63, 0xe2, 0x87, 0xe4, 0x2d, 0xf6, 0x18, 0x79, 0x8b, 0x5b, 0x4b, 0x52, 0xa7, 0x99, 0x49, 0xf7,
0x0c, 0xaf, 0x62, 0xc2, 0xb1, 0x77, 0xe8, 0x47, 0x01, 0xed, 0xf5, 0x5a, 0xcb, 0xf2, 0x9c, 0x86, 0xc9, 0x5b, 0x2c, 0xcc, 0xf0, 0x3a, 0x26, 0x1c, 0x7b, 0x87, 0x7e, 0x14, 0xd0, 0x7e, 0xbf, 0xb5,
0x14, 0x3e, 0x54, 0x32, 0x74, 0x07, 0x54, 0x20, 0x79, 0x38, 0xea, 0x93, 0x08, 0x67, 0x26, 0x5b, 0x2c, 0xcf, 0x69, 0x48, 0xe1, 0x23, 0x25, 0x43, 0x5b, 0x70, 0xa9, 0x97, 0xc4, 0x31, 0x8e, 0xb8,
0x91, 0x1f, 0x86, 0xe4, 0xdc, 0x3d, 0x39, 0xa5, 0x0d, 0xe7, 0xfc, 0xd1, 0x80, 0xf7, 0x5c, 0xdc, 0x57, 0xb4, 0xd9, 0xca, 0xba, 0xb1, 0x31, 0xef, 0x5e, 0xd4, 0x93, 0x9d, 0xbc, 0xe9, 0xb6, 0xe0,
0x27, 0x8c, 0xe3, 0xf8, 0x29, 0x0d, 0xb0, 0x8b, 0x5f, 0x24, 0x98, 0x71, 0x74, 0x07, 0x6a, 0x1d, 0xd2, 0x80, 0x44, 0x64, 0xe0, 0x87, 0xa5, 0x35, 0xab, 0x6a, 0x8d, 0x9e, 0xcc, 0xaf, 0x71, 0x7e,
0x9f, 0x61, 0x0d, 0xe2, 0xcb, 0x95, 0xf6, 0x7c, 0xc2, 0xfa, 0x77, 0x7d, 0x86, 0x5d, 0xa9, 0x89, 0x6f, 0xc0, 0x45, 0x17, 0x1f, 0x10, 0xc6, 0x71, 0xfc, 0x8c, 0x06, 0xd8, 0xc5, 0x2f, 0x13, 0xcc,
0xbe, 0x03, 0x8b, 0x7e, 0x10, 0xc4, 0x98, 0x31, 0x09, 0xa5, 0x49, 0x8b, 0xb6, 0x95, 0x8e, 0x9b, 0x38, 0xba, 0x07, 0xb5, 0xae, 0xcf, 0xb0, 0x86, 0xfe, 0xd5, 0x4a, 0x2f, 0x3c, 0x65, 0x07, 0xf7,
0x2a, 0xe7, 0xfc, 0x6e, 0xe6, 0xfd, 0xee, 0xfc, 0xce, 0x80, 0xb5, 0xe2, 0xcd, 0xd8, 0x90, 0x46, 0x7d, 0x86, 0x5d, 0xa9, 0x89, 0xbe, 0x05, 0x8b, 0x7e, 0x10, 0xc4, 0x98, 0x31, 0x09, 0xc0, 0x49,
0x0c, 0xa3, 0x8f, 0x60, 0x41, 0x78, 0x2f, 0x61, 0xfa, 0x72, 0x97, 0x2a, 0xcf, 0x39, 0x90, 0x2a, 0x8b, 0xb6, 0x95, 0x8e, 0x9b, 0x2a, 0xe7, 0xd0, 0x62, 0xe6, 0xd1, 0xe2, 0xfc, 0xc6, 0x80, 0xb5,
0xae, 0x56, 0x15, 0x49, 0x98, 0x44, 0x84, 0xa7, 0x09, 0x42, 0xdd, 0xf0, 0x6a, 0x39, 0x36, 0x35, 0xe2, 0xcd, 0xd8, 0x90, 0x46, 0x0c, 0xa3, 0x0f, 0x60, 0x41, 0xf8, 0x3c, 0x61, 0xfa, 0x72, 0x57,
0x95, 0xec, 0x45, 0x84, 0xab, 0x7c, 0xe0, 0x02, 0xc9, 0x7e, 0x3b, 0x3f, 0x86, 0xb5, 0x07, 0x98, 0x2a, 0xcf, 0xd9, 0x97, 0x2a, 0xae, 0x56, 0x15, 0xa9, 0x9b, 0x44, 0x84, 0xa7, 0x69, 0x45, 0xdd,
0xe7, 0x50, 0xa4, 0x6d, 0x35, 0x4b, 0xb0, 0x15, 0xd9, 0x63, 0xae, 0xc4, 0x1e, 0xce, 0x9f, 0x0c, 0xf0, 0x7a, 0x39, 0xa2, 0x75, 0x01, 0xea, 0x44, 0x84, 0xab, 0x2c, 0xe2, 0x02, 0xc9, 0x7e, 0x3b,
0x78, 0xbf, 0xb4, 0xf7, 0x59, 0xbe, 0x36, 0x0b, 0x87, 0xb9, 0xb3, 0x84, 0x83, 0x59, 0x0e, 0x07, 0x3f, 0x84, 0xb5, 0x87, 0x98, 0xe7, 0xb0, 0xa7, 0x6d, 0x35, 0x4b, 0x88, 0x16, 0x6b, 0xce, 0x5c,
0xe7, 0x97, 0x06, 0x5c, 0x7a, 0x80, 0x79, 0x3e, 0xd5, 0x9c, 0xb3, 0x25, 0xd0, 0xd7, 0x00, 0xb2, 0xa9, 0xe6, 0x38, 0x7f, 0x30, 0xe0, 0x52, 0x69, 0xef, 0xb3, 0x7c, 0x6d, 0x16, 0x44, 0x73, 0x67,
0x14, 0xc3, 0x5a, 0xe6, 0xba, 0xb9, 0x61, 0xba, 0x39, 0x89, 0xf3, 0x1b, 0x03, 0x56, 0xc7, 0xce, 0x09, 0x22, 0xb3, 0x1c, 0x44, 0xce, 0xcf, 0x0d, 0xb8, 0xf2, 0x10, 0xf3, 0x7c, 0x82, 0x3a, 0x67,
0x2f, 0x66, 0x2a, 0xa3, 0x9c, 0xa9, 0xfe, 0x53, 0xe6, 0xf8, 0x83, 0x01, 0x97, 0xab, 0xcd, 0x71, 0x4b, 0xa0, 0xaf, 0x00, 0x64, 0x89, 0x89, 0xb5, 0xcc, 0x75, 0x73, 0xc3, 0x74, 0x73, 0x12, 0xe7,
0x16, 0xe7, 0xfd, 0x40, 0x2d, 0xc2, 0x02, 0xa5, 0x82, 0xc6, 0xae, 0x57, 0x31, 0xc8, 0xf8, 0x99, 0x57, 0x06, 0xac, 0x8e, 0x9d, 0x5f, 0xcc, 0x6f, 0x46, 0x39, 0xbf, 0xfd, 0xbb, 0xcc, 0xf1, 0x3b,
0x7a, 0x91, 0xf3, 0x85, 0x09, 0x68, 0x47, 0xa6, 0x17, 0xc5, 0x53, 0xef, 0xe0, 0x9a, 0x53, 0x17, 0x03, 0xae, 0x56, 0x9b, 0xe3, 0x2c, 0xce, 0xfb, 0x9e, 0x5a, 0x84, 0x05, 0x4a, 0x45, 0xf1, 0xbb,
0x3f, 0xa5, 0x12, 0xa7, 0x76, 0x1e, 0x25, 0xce, 0xfc, 0xa9, 0x4a, 0x9c, 0xcb, 0x60, 0x89, 0x3c, 0x59, 0x55, 0x77, 0xc6, 0xcf, 0xd4, 0x8b, 0x9c, 0xcf, 0x4d, 0x40, 0x3b, 0x32, 0x29, 0xa9, 0xea,
0xcb, 0xb8, 0x3f, 0x18, 0x4a, 0x86, 0xa9, 0xb9, 0x23, 0xc1, 0x78, 0x41, 0xb1, 0x38, 0x63, 0x41, 0xf6, 0x0e, 0xae, 0x39, 0x35, 0x65, 0x2a, 0x11, 0xa3, 0xda, 0x79, 0x10, 0xa3, 0xf9, 0x53, 0x11,
0x51, 0x3f, 0x6d, 0x41, 0xe1, 0xbc, 0x86, 0xf7, 0xd2, 0xc0, 0x96, 0x84, 0xff, 0x0e, 0xee, 0x28, 0xa3, 0xab, 0x60, 0x89, 0xec, 0xcc, 0xb8, 0x3f, 0x18, 0xca, 0xba, 0x54, 0x73, 0x47, 0x82, 0x71,
0x86, 0xc2, 0x5c, 0x39, 0x14, 0xa6, 0x38, 0xc5, 0xf9, 0xb3, 0x09, 0xab, 0x7b, 0x29, 0x4b, 0xed, 0x1a, 0xb2, 0x38, 0x23, 0x0d, 0xa9, 0x9f, 0x96, 0x86, 0x38, 0x6f, 0xe0, 0x62, 0x1a, 0xd8, 0x92,
0xfb, 0xfc, 0x50, 0x56, 0x19, 0x27, 0x47, 0xca, 0x64, 0x04, 0xe4, 0x28, 0xdd, 0x9c, 0x48, 0xe9, 0x26, 0xbc, 0x83, 0x3b, 0x8a, 0xa1, 0x30, 0x57, 0x0e, 0x85, 0x29, 0x4e, 0x71, 0xfe, 0x61, 0xc2,
0xb5, 0x22, 0xa5, 0x17, 0x2f, 0x38, 0x5f, 0x46, 0xcd, 0xf9, 0x14, 0xb5, 0x1b, 0xb0, 0x92, 0xa3, 0x6a, 0x27, 0xad, 0x6d, 0x7b, 0x3e, 0x3f, 0x94, 0xdc, 0xe4, 0xe4, 0x48, 0x99, 0x8c, 0x80, 0x1c,
0xe8, 0xa1, 0xcf, 0x0f, 0x45, 0x61, 0x2b, 0x38, 0x7a, 0x89, 0xe4, 0xbf, 0x9e, 0xa1, 0x9b, 0xb0, 0x11, 0x30, 0x27, 0x12, 0x81, 0x5a, 0x91, 0x08, 0x14, 0x2f, 0x38, 0x5f, 0x46, 0xcd, 0xf9, 0x50,
0x9c, 0x71, 0x6a, 0xa0, 0xa8, 0xb6, 0x2e, 0x11, 0x32, 0x22, 0xe0, 0x20, 0xe5, 0xda, 0x62, 0xc9, 0xe1, 0x0d, 0x58, 0xc9, 0x15, 0xf6, 0xa1, 0xcf, 0x0f, 0x05, 0x1d, 0x16, 0x95, 0x7d, 0x89, 0xe4,
0x61, 0x55, 0x94, 0x1c, 0xf9, 0xf2, 0x07, 0x8a, 0xe5, 0xcf, 0x24, 0x1a, 0xb6, 0x27, 0xd2, 0xf0, 0xbf, 0x9e, 0xa1, 0xdb, 0xb0, 0x9c, 0x55, 0xe2, 0x40, 0x15, 0xe8, 0xba, 0x44, 0xc8, 0xa8, 0x6c,
0x5f, 0x0d, 0xb0, 0xb3, 0x90, 0x9e, 0xb1, 0x55, 0x29, 0x78, 0x72, 0xae, 0xec, 0xc9, 0xab, 0xd0, 0x07, 0x69, 0x85, 0x2e, 0x16, 0x50, 0xab, 0x82, 0xa8, 0xe4, 0x49, 0x13, 0x14, 0x49, 0xd3, 0xc4,
0xc0, 0x91, 0xdf, 0x09, 0xb1, 0x46, 0xba, 0xa9, 0x90, 0xae, 0x64, 0x0a, 0xe9, 0xf7, 0xc1, 0x1e, 0xe2, 0x6d, 0x9f, 0xa2, 0x78, 0x37, 0x26, 0x17, 0xef, 0x3f, 0x1a, 0x60, 0x67, 0x89, 0x60, 0xc6,
0x95, 0xab, 0x69, 0xd4, 0x5e, 0x9f, 0x58, 0xaf, 0xe6, 0x61, 0xe4, 0x42, 0x56, 0xb7, 0x32, 0xe7, 0xb6, 0xa8, 0xe0, 0xff, 0xb9, 0xb2, 0xff, 0xaf, 0x43, 0x03, 0x47, 0x7e, 0x37, 0xc4, 0x3a, 0x3e,
0xb7, 0x73, 0x23, 0x62, 0x54, 0x18, 0x3f, 0x4b, 0xfa, 0xfb, 0x09, 0x34, 0xf4, 0x57, 0xa8, 0x32, 0x4c, 0x15, 0x1f, 0x4a, 0xa6, 0xe2, 0xe3, 0x01, 0xd8, 0x23, 0x6a, 0x9c, 0xc6, 0xfa, 0xcd, 0x89,
0x5a, 0x25, 0xc1, 0xef, 0x56, 0x5d, 0xab, 0xea, 0xd0, 0xcd, 0x9c, 0x19, 0xef, 0x45, 0x3c, 0x3e, 0xdc, 0x38, 0x0f, 0x3e, 0x17, 0x32, 0x8e, 0xcc, 0x9c, 0x5f, 0xcf, 0x8d, 0xca, 0xa9, 0x8a, 0x8c,
0x76, 0x6d, 0x36, 0x92, 0xb4, 0x3d, 0x58, 0x29, 0x2b, 0xa0, 0x15, 0x30, 0x8f, 0xf0, 0xb1, 0xb6, 0xb3, 0x24, 0xcd, 0x1f, 0x41, 0x43, 0x7f, 0x85, 0xa2, 0xec, 0x2a, 0x75, 0x7e, 0xbb, 0xea, 0x5a,
0xb1, 0xf8, 0x29, 0x08, 0xe3, 0xa5, 0x40, 0x9b, 0xae, 0x13, 0xae, 0x9c, 0x98, 0x81, 0x7b, 0xd4, 0x55, 0x87, 0x6e, 0xe6, 0xcc, 0xf8, 0x71, 0xc4, 0xe3, 0x63, 0xd7, 0x66, 0x23, 0x49, 0xdb, 0x83,
0x55, 0xda, 0xdf, 0x9b, 0xfb, 0xc4, 0x70, 0xde, 0x1a, 0xb0, 0xb2, 0x1b, 0xd3, 0xe1, 0x3b, 0x27, 0x95, 0xb2, 0x02, 0x5a, 0x01, 0xf3, 0x08, 0x1f, 0x6b, 0x1b, 0x8b, 0x9f, 0xa2, 0xcc, 0xbc, 0x12,
0x5f, 0x07, 0x1a, 0xb9, 0xda, 0x3b, 0x8d, 0xf7, 0x82, 0x6c, 0x5a, 0x1a, 0xbe, 0x08, 0xf5, 0x20, 0x18, 0xd5, 0xec, 0xe2, 0xda, 0x89, 0x79, 0xbb, 0x4f, 0x5d, 0xa5, 0xfd, 0x9d, 0xb9, 0x8f, 0x0c,
0xa6, 0x43, 0xcf, 0x0f, 0x43, 0x19, 0x8a, 0xa2, 0x0c, 0x8d, 0xe9, 0x70, 0x3b, 0x0c, 0x9d, 0x57, 0xe7, 0x0b, 0x03, 0x56, 0x76, 0x63, 0x3a, 0x7c, 0xe7, 0x94, 0xed, 0x40, 0x23, 0xc7, 0xf3, 0xd3,
0xb0, 0xb6, 0x8b, 0x59, 0x37, 0x26, 0x9d, 0x77, 0xa7, 0x85, 0x29, 0x8c, 0x5d, 0x48, 0xb9, 0x66, 0x2c, 0x51, 0x90, 0x4d, 0x4b, 0xde, 0x97, 0xa1, 0x1e, 0xc4, 0x74, 0xe8, 0xf9, 0x61, 0x28, 0x03,
0x29, 0xe5, 0x3a, 0x5f, 0x18, 0xf0, 0x7e, 0xe9, 0xe4, 0xb3, 0xa0, 0xe3, 0x87, 0x45, 0xcc, 0x2a, 0x58, 0x50, 0xde, 0x98, 0x0e, 0xb7, 0xc3, 0xd0, 0x79, 0x0d, 0x6b, 0xbb, 0x98, 0xf5, 0x62, 0xd2,
0x70, 0x4c, 0xe9, 0xb1, 0xf2, 0x58, 0xf5, 0x25, 0x63, 0xcb, 0xb9, 0xbb, 0x22, 0x4b, 0xed, 0xc7, 0x7d, 0xf7, 0x62, 0x32, 0xa5, 0xce, 0x17, 0x12, 0xb5, 0x59, 0x4a, 0xd4, 0xce, 0xe7, 0x06, 0x5c,
0xb4, 0x2f, 0xeb, 0xd1, 0xf3, 0xab, 0xe5, 0xfe, 0x6e, 0xc0, 0x07, 0x13, 0xce, 0x38, 0xcb, 0x97, 0x2a, 0x9d, 0x7c, 0x16, 0x74, 0x7c, 0xbf, 0x88, 0x59, 0x05, 0x8e, 0x29, 0xfd, 0x5c, 0x1e, 0xab,
0x97, 0x9b, 0xf7, 0xb9, 0x69, 0xcd, 0xbb, 0x59, 0x6e, 0xde, 0xab, 0x7b, 0xdb, 0xda, 0x84, 0xde, 0xbe, 0xac, 0xf3, 0x72, 0xee, 0xbe, 0xc8, 0x6d, 0x7b, 0x31, 0x3d, 0x90, 0x2c, 0xf6, 0xfc, 0x18,
0xf6, 0xad, 0x09, 0xcd, 0x03, 0x4e, 0x63, 0xbf, 0x8f, 0x77, 0x68, 0xd4, 0x23, 0x7d, 0x91, 0xe8, 0xe0, 0x9f, 0x0d, 0x78, 0x6f, 0xc2, 0x19, 0x67, 0xf9, 0xf2, 0xf2, 0x43, 0xc1, 0xdc, 0xb4, 0x87,
0xd3, 0x0a, 0xdf, 0x90, 0x1f, 0x9d, 0xd5, 0xf0, 0x57, 0xa1, 0xe1, 0x77, 0xbb, 0x98, 0x31, 0xd1, 0x02, 0xb3, 0xfc, 0x50, 0x50, 0xdd, 0x47, 0xd7, 0x26, 0xf4, 0xd1, 0x5f, 0x98, 0xd0, 0xdc, 0xe7,
0x22, 0xe9, 0x6c, 0x64, 0xb9, 0xb6, 0x92, 0x3d, 0x16, 0x22, 0xf4, 0x0d, 0x58, 0x65, 0xb8, 0x1b, 0x34, 0xf6, 0x0f, 0xf0, 0x0e, 0x8d, 0xfa, 0xe4, 0x40, 0x94, 0x87, 0xb4, 0x2f, 0x30, 0xe4, 0x47,
0x63, 0xee, 0x8d, 0x34, 0x35, 0x82, 0x97, 0xd5, 0xc4, 0x76, 0xaa, 0x2d, 0x5a, 0x82, 0x84, 0xe1, 0x67, 0xcc, 0xff, 0x3a, 0x34, 0xfc, 0x5e, 0x0f, 0x33, 0x26, 0xda, 0x31, 0x9d, 0x8d, 0x2c, 0xd7,
0x83, 0x83, 0x4f, 0x35, 0x8a, 0xf5, 0x48, 0x14, 0x64, 0x9d, 0xa4, 0x7b, 0x84, 0x79, 0x9e, 0x50, 0x56, 0xb2, 0x27, 0x42, 0x84, 0xbe, 0x06, 0xab, 0x0c, 0xf7, 0x62, 0xcc, 0xbd, 0x91, 0xa6, 0x46,
0x40, 0x89, 0x24, 0x14, 0x2f, 0x81, 0x15, 0x53, 0xca, 0x25, 0x0b, 0x48, 0xf6, 0xb7, 0xdc, 0xba, 0xf0, 0xb2, 0x9a, 0xd8, 0x4e, 0xb5, 0x45, 0x23, 0x91, 0x30, 0xbc, 0xbf, 0xff, 0x89, 0x46, 0xb1,
0x10, 0x88, 0xb4, 0xa5, 0x77, 0xdd, 0xdb, 0x7e, 0xa2, 0x59, 0x5f, 0x8f, 0x44, 0x1f, 0xbc, 0xb7, 0x1e, 0x09, 0x1a, 0xd7, 0x4d, 0x7a, 0x47, 0x98, 0xe7, 0xcb, 0x10, 0x28, 0x91, 0x84, 0xe2, 0x15,
0xfd, 0xe4, 0x5e, 0x14, 0x0c, 0x29, 0x89, 0xb8, 0xa4, 0x04, 0xcb, 0xcd, 0x8b, 0xc4, 0xe7, 0x31, 0xb0, 0x62, 0x4a, 0xb9, 0xac, 0x1d, 0x92, 0x33, 0x58, 0x6e, 0x5d, 0x08, 0x44, 0xda, 0xd2, 0xbb,
0x65, 0x09, 0x4f, 0x14, 0x2c, 0x92, 0x0e, 0x2c, 0xd7, 0xd6, 0xb2, 0x67, 0xc7, 0x43, 0x2c, 0x58, 0x76, 0xb6, 0x9f, 0x6a, 0xae, 0xa0, 0x47, 0xa2, 0xe7, 0xee, 0x6c, 0x3f, 0xfd, 0x38, 0x0a, 0x86,
0x28, 0x61, 0xd8, 0x7b, 0x49, 0x62, 0x9e, 0xf8, 0xa1, 0x77, 0x48, 0x19, 0x97, 0xac, 0x50, 0x77, 0x94, 0x44, 0x5c, 0x16, 0x12, 0xcb, 0xcd, 0x8b, 0xc4, 0xe7, 0x31, 0x65, 0x09, 0x4f, 0xd0, 0x1c,
0x97, 0x12, 0x86, 0x9f, 0x2b, 0xf1, 0x43, 0xca, 0xb8, 0xb8, 0x46, 0x8c, 0xfb, 0x23, 0x3a, 0xd0, 0x59, 0x44, 0x2c, 0xd7, 0xd6, 0xb2, 0xe7, 0xc7, 0x43, 0x2c, 0x6a, 0x57, 0xc2, 0xb0, 0xf7, 0x8a,
0x23, 0xd1, 0x07, 0x76, 0x43, 0x9a, 0x04, 0xde, 0x30, 0xa6, 0x2f, 0x49, 0x80, 0x63, 0xd9, 0x49, 0xc4, 0x3c, 0xf1, 0x43, 0xef, 0x90, 0x32, 0x2e, 0x6b, 0x49, 0xdd, 0x5d, 0x4a, 0x18, 0x7e, 0xa1,
0x5a, 0x6e, 0x53, 0x4a, 0xf7, 0xb5, 0xd0, 0x79, 0x5b, 0x83, 0x15, 0x55, 0xde, 0x3d, 0xa2, 0x9d, 0xc4, 0x8f, 0x28, 0xe3, 0xe2, 0x1a, 0x31, 0x3e, 0x48, 0x6b, 0x88, 0xe5, 0xea, 0x91, 0xe8, 0x39,
0x14, 0xb5, 0x97, 0xc1, 0xea, 0x86, 0x89, 0xe8, 0x94, 0x34, 0x64, 0x2d, 0x77, 0x24, 0x10, 0xa6, 0x7b, 0x21, 0x4d, 0x02, 0x6f, 0x18, 0xd3, 0x57, 0x24, 0xc0, 0xb1, 0xac, 0x17, 0x96, 0xdb, 0x94,
0xcf, 0x33, 0x64, 0x8c, 0x7b, 0xe4, 0xb5, 0x76, 0xd1, 0xf2, 0x88, 0x22, 0xa5, 0x38, 0x4f, 0xe6, 0xd2, 0x3d, 0x2d, 0x74, 0xfe, 0x52, 0x83, 0x15, 0x45, 0x0a, 0x1f, 0xd3, 0x6e, 0x8a, 0xda, 0xab,
0xe6, 0x18, 0x99, 0x07, 0x3e, 0xf7, 0x35, 0xc3, 0xd6, 0x24, 0xc3, 0x5a, 0x42, 0xa2, 0xc8, 0x75, 0x60, 0xf5, 0xc2, 0x44, 0xf4, 0x57, 0x1a, 0xb2, 0x96, 0x3b, 0x12, 0x08, 0xd3, 0xe7, 0xeb, 0x6a,
0x8c, 0x33, 0xe7, 0x2b, 0x38, 0x33, 0x57, 0x44, 0x2c, 0x14, 0x8b, 0x88, 0x62, 0x4c, 0x2d, 0x96, 0x8c, 0xfb, 0xe4, 0x8d, 0x76, 0xd1, 0xf2, 0xa8, 0xb0, 0x4a, 0x71, 0x9e, 0x02, 0x98, 0x63, 0x14,
0x73, 0xcc, 0x43, 0x58, 0x4a, 0x3d, 0xd0, 0x95, 0x60, 0x94, 0x6e, 0xaa, 0xe8, 0xe0, 0x64, 0x66, 0x20, 0xf0, 0xb9, 0xaf, 0xeb, 0x72, 0x4d, 0xd6, 0x65, 0x4b, 0x48, 0x54, 0x49, 0x1e, 0xab, 0xb4,
0xce, 0xa3, 0xd6, 0x6d, 0xb2, 0x02, 0x88, 0xcb, 0x45, 0x87, 0x75, 0xaa, 0xa2, 0xa3, 0x54, 0xf0, 0xf3, 0x15, 0x95, 0x36, 0x47, 0x3d, 0x16, 0x8a, 0xd4, 0xa3, 0x18, 0x53, 0x8b, 0xe5, 0x1c, 0xf3,
0xc2, 0x69, 0x0a, 0xde, 0x7c, 0x01, 0x61, 0xcf, 0x56, 0x40, 0x34, 0x26, 0x16, 0x10, 0x9f, 0xc2, 0x08, 0x96, 0x52, 0x0f, 0xf4, 0x24, 0x18, 0xa5, 0x9b, 0x2a, 0xfa, 0x3e, 0x99, 0x99, 0xf3, 0xa8,
0xca, 0x8f, 0x12, 0x1c, 0x1f, 0x3f, 0xa2, 0x1d, 0x36, 0x1b, 0x2a, 0xda, 0x50, 0xd7, 0xae, 0x4d, 0x75, 0x9b, 0xac, 0x00, 0xe2, 0x32, 0x55, 0xb1, 0x4e, 0x45, 0x55, 0x4a, 0x34, 0x19, 0x4e, 0x43,
0xb9, 0x26, 0x1b, 0x3b, 0xff, 0x34, 0xa0, 0x29, 0x33, 0xc1, 0x33, 0x9f, 0x1d, 0xa5, 0x8f, 0x53, 0x93, 0xf3, 0xb4, 0xc3, 0x9e, 0x91, 0x76, 0x34, 0x4e, 0x41, 0x3b, 0x9a, 0x93, 0x69, 0xc7, 0x27,
0x29, 0x2e, 0x8c, 0x22, 0x2e, 0x4e, 0xd9, 0x5c, 0x55, 0xbc, 0xac, 0x98, 0x55, 0x2f, 0x2b, 0x15, 0xb0, 0xf2, 0x83, 0x04, 0xc7, 0xc7, 0x8f, 0x69, 0x97, 0xcd, 0x86, 0xa5, 0x36, 0xd4, 0x35, 0x20,
0x45, 0x5b, 0xad, 0xb2, 0x68, 0x2b, 0x75, 0x6b, 0xf3, 0x63, 0xdd, 0xda, 0x97, 0x06, 0xac, 0xe6, 0xd2, 0x0a, 0x95, 0x8d, 0x9d, 0xbf, 0x19, 0xd0, 0x94, 0xdb, 0x3f, 0xf7, 0xd9, 0x51, 0xfa, 0x7c,
0x6c, 0x74, 0x96, 0x5c, 0x5c, 0xb0, 0xec, 0x5c, 0xd9, 0xb2, 0x77, 0x8b, 0x1c, 0x65, 0x56, 0x81, 0x96, 0xa2, 0xc9, 0x28, 0xa2, 0xe9, 0x94, 0x8d, 0x5c, 0xc5, 0xdb, 0x8f, 0x59, 0xf5, 0xf6, 0x53,
0x23, 0xc7, 0x51, 0xa9, 0x8d, 0x0b, 0x3c, 0xf5, 0x18, 0x96, 0x45, 0x15, 0x71, 0x3e, 0xee, 0xfc, 0x41, 0x10, 0x6b, 0x95, 0x04, 0xb1, 0xd4, 0x19, 0xce, 0x8f, 0x75, 0x86, 0x5f, 0x1a, 0xb0, 0x9a,
0x87, 0x01, 0x8b, 0x8f, 0x68, 0x47, 0x3a, 0x32, 0x8f, 0x3a, 0xa3, 0x88, 0xba, 0x15, 0x30, 0x03, 0xb3, 0xd1, 0x59, 0x32, 0x78, 0xc1, 0xb2, 0x73, 0x65, 0xcb, 0xde, 0x2f, 0x56, 0x36, 0xb3, 0x0a,
0x32, 0xd0, 0xc4, 0x22, 0x7e, 0x8a, 0xa8, 0x64, 0xdc, 0x8f, 0xf9, 0xe8, 0xdd, 0x51, 0xd4, 0x98, 0x52, 0xb9, 0xca, 0x96, 0xda, 0xb8, 0x50, 0xdd, 0x9e, 0xc0, 0xb2, 0xe0, 0x1e, 0xe7, 0xe3, 0xce,
0x42, 0x22, 0x9f, 0xae, 0x2e, 0x42, 0x1d, 0x47, 0x81, 0x9a, 0xd4, 0xa5, 0x3f, 0x8e, 0x02, 0x39, 0xbf, 0x1a, 0xb0, 0xf8, 0x98, 0x76, 0xa5, 0x23, 0xf3, 0x58, 0x35, 0x8a, 0x58, 0x5d, 0x01, 0x33,
0x75, 0x3e, 0xdd, 0xdc, 0x1a, 0xcc, 0x0f, 0xe9, 0xe8, 0xad, 0x50, 0x0d, 0x9c, 0x35, 0x40, 0x0f, 0x20, 0x03, 0x5d, 0x8e, 0xc4, 0x4f, 0x11, 0xcb, 0x8c, 0xfb, 0x31, 0x1f, 0xbd, 0x8c, 0x0a, 0x66,
0x30, 0x7f, 0x44, 0x3b, 0xc2, 0x2b, 0xa9, 0x79, 0x9c, 0xbf, 0xcd, 0xc9, 0x4e, 0x6b, 0x24, 0x3e, 0x2a, 0x24, 0xf2, 0x71, 0xed, 0x32, 0xd4, 0x71, 0x14, 0xa8, 0x49, 0xdd, 0x66, 0xe0, 0x28, 0x90,
0x8b, 0x83, 0x1d, 0x68, 0x2a, 0x26, 0xfd, 0x9c, 0x76, 0xbc, 0x28, 0x49, 0x8d, 0x62, 0x4b, 0xe1, 0x53, 0xe7, 0xd3, 0x39, 0xae, 0xc1, 0xfc, 0x90, 0x8e, 0x5e, 0x33, 0xd5, 0xc0, 0x59, 0x03, 0xf4,
0x23, 0xda, 0x79, 0x9a, 0x0c, 0xd0, 0x2d, 0x78, 0x8f, 0x44, 0x22, 0x5b, 0x4b, 0x72, 0xcf, 0x34, 0x10, 0xf3, 0xc7, 0xb4, 0x2b, 0xbc, 0x92, 0x9a, 0xc7, 0xf9, 0xd3, 0x9c, 0xec, 0xea, 0x46, 0xe2,
0x95, 0x95, 0x56, 0x48, 0x94, 0xd2, 0xbe, 0x56, 0xbf, 0x01, 0xcb, 0x38, 0x7a, 0x91, 0xe0, 0x04, 0xb3, 0x38, 0xd8, 0x81, 0xa6, 0xaa, 0xbf, 0x9f, 0xd1, 0xae, 0x17, 0x25, 0xa9, 0x51, 0x6c, 0x29,
0x67, 0xaa, 0xca, 0x66, 0x4d, 0x2d, 0xd6, 0x7a, 0x82, 0xc4, 0x7d, 0x76, 0xe4, 0xb1, 0x90, 0x72, 0x7c, 0x4c, 0xbb, 0xcf, 0x92, 0x01, 0xba, 0x03, 0x17, 0x49, 0x24, 0x72, 0xbc, 0xa4, 0x04, 0x99,
0xa6, 0xb3, 0xa8, 0x25, 0x24, 0x07, 0x42, 0x80, 0x3e, 0x01, 0x4b, 0x2c, 0x57, 0xd0, 0x52, 0x1d, 0xa6, 0xb2, 0xd2, 0x0a, 0x89, 0x52, 0xb2, 0xa0, 0xd5, 0x6f, 0xc1, 0x32, 0x8e, 0x5e, 0x26, 0x38,
0xd3, 0xa5, 0x2a, 0x68, 0x69, 0x7f, 0xbb, 0xf5, 0xcf, 0xd5, 0x0f, 0x26, 0x02, 0x44, 0x77, 0x04, 0xc1, 0x99, 0xaa, 0xb2, 0x59, 0x53, 0x8b, 0xb5, 0x9e, 0x28, 0xfd, 0x3e, 0x3b, 0xf2, 0x58, 0x48,
0x01, 0x61, 0x47, 0x9a, 0x04, 0x41, 0x89, 0x76, 0x09, 0x3b, 0x72, 0x7e, 0x0a, 0x17, 0xf3, 0x6f, 0x39, 0xd3, 0xb9, 0xd7, 0x12, 0x92, 0x7d, 0x21, 0x40, 0x1f, 0x81, 0x25, 0x96, 0x2b, 0x68, 0xa9,
0x50, 0x84, 0x71, 0xd2, 0x3d, 0xcf, 0xc2, 0xe8, 0xf7, 0x06, 0xb4, 0xab, 0x0e, 0xf8, 0x2f, 0xd6, 0xee, 0xec, 0x4a, 0x15, 0xb4, 0xb4, 0xbf, 0xdd, 0xfa, 0x67, 0xea, 0x07, 0x13, 0x01, 0xa2, 0xfb,
0x83, 0x5b, 0xbf, 0xb2, 0x01, 0xe4, 0xcc, 0x0e, 0xa5, 0x71, 0x80, 0x42, 0x09, 0xad, 0x1d, 0x3a, 0x88, 0x80, 0xb0, 0x23, 0x5d, 0x3a, 0x41, 0x89, 0x76, 0x09, 0x3b, 0x72, 0x7e, 0x0c, 0x97, 0xf3,
0x18, 0xd2, 0x08, 0x47, 0x5c, 0x66, 0x2c, 0x86, 0x36, 0x8b, 0xfb, 0xe9, 0xc1, 0xb8, 0xa2, 0xb6, 0xef, 0x5d, 0x84, 0x71, 0xd2, 0x3b, 0x4f, 0x3a, 0xf5, 0x5b, 0x03, 0xda, 0x55, 0x07, 0xfc, 0x07,
0x55, 0xfb, 0xc3, 0x4a, 0xfd, 0x92, 0xb2, 0x73, 0x01, 0xbd, 0x90, 0x7d, 0xd3, 0xc8, 0x14, 0x3b, 0x59, 0xe4, 0xd6, 0x2f, 0x6c, 0x00, 0x39, 0xb3, 0x43, 0x69, 0x1c, 0xa0, 0x50, 0x42, 0x6b, 0x87,
0x87, 0x7e, 0x14, 0xe1, 0x10, 0x6d, 0x4d, 0x78, 0x97, 0xac, 0x52, 0x4e, 0xcf, 0xbc, 0x56, 0x79, 0x0e, 0x86, 0x34, 0xc2, 0x11, 0x97, 0x19, 0x8b, 0xa1, 0xcd, 0xe2, 0x7e, 0x7a, 0x30, 0xae, 0xa8,
0xe6, 0x01, 0x8f, 0x49, 0xd4, 0x4f, 0x4d, 0xec, 0x5c, 0x40, 0xcf, 0xc0, 0xce, 0x3d, 0x0e, 0xa1, 0x6d, 0xd5, 0x7e, 0xbf, 0x52, 0xbf, 0xa4, 0xec, 0x5c, 0x40, 0x2f, 0x65, 0xb7, 0x35, 0x32, 0xc5,
0x1b, 0x55, 0x96, 0x1a, 0x7f, 0x3d, 0x6a, 0x9f, 0xe4, 0x0b, 0xe7, 0x02, 0xea, 0x41, 0xb3, 0xf0, 0xce, 0xa1, 0x1f, 0x45, 0x38, 0x44, 0x5b, 0x13, 0xde, 0x40, 0xab, 0x94, 0xd3, 0x33, 0x6f, 0x54,
0x7a, 0x89, 0x36, 0x4e, 0x6a, 0xd7, 0xf2, 0x4f, 0x86, 0xed, 0xaf, 0xcf, 0xa0, 0x99, 0xdd, 0xfe, 0x9e, 0xb9, 0xcf, 0x63, 0x12, 0x1d, 0xa4, 0x26, 0x76, 0x2e, 0xa0, 0xe7, 0x60, 0xe7, 0x1e, 0xa2,
0xe7, 0xca, 0x60, 0x63, 0xcf, 0x7f, 0xb7, 0x27, 0x6c, 0x32, 0xe9, 0xa1, 0xb2, 0x7d, 0x67, 0xf6, 0xd0, 0xad, 0x2a, 0x4b, 0x8d, 0xbf, 0x54, 0xb5, 0x4f, 0xf2, 0x85, 0x73, 0x01, 0xf5, 0xa1, 0x59,
0x05, 0xd9, 0xe1, 0xc1, 0xe8, 0x23, 0x55, 0x40, 0xdd, 0x9c, 0xde, 0x93, 0xaa, 0xd3, 0x36, 0x66, 0x78, 0x29, 0x45, 0x1b, 0x27, 0x35, 0x79, 0xf9, 0xe7, 0xc9, 0xf6, 0x57, 0x67, 0xd0, 0xcc, 0x6e,
0x6d, 0x5e, 0x9d, 0x0b, 0x68, 0x1f, 0xac, 0xac, 0x7d, 0x44, 0x1f, 0x56, 0x2d, 0x2c, 0x77, 0x97, 0xff, 0x53, 0x65, 0xb0, 0xb1, 0xa7, 0xc6, 0xbb, 0x13, 0x36, 0x99, 0xf4, 0x28, 0xda, 0xbe, 0x37,
0x33, 0x38, 0xa7, 0xd0, 0x80, 0x55, 0x3b, 0xa7, 0xaa, 0x3b, 0xac, 0x76, 0x4e, 0x65, 0x37, 0xe7, 0xfb, 0x82, 0xec, 0xf0, 0x60, 0xf4, 0x91, 0x2a, 0xa0, 0x6e, 0x4f, 0xef, 0x64, 0xd5, 0x69, 0x1b,
0x5c, 0x40, 0x89, 0x8c, 0x9d, 0x52, 0x74, 0xa3, 0x5b, 0xd3, 0xfc, 0x5b, 0x48, 0x33, 0xed, 0xcd, 0xb3, 0xb6, 0xbc, 0xce, 0x05, 0xb4, 0x07, 0x56, 0xd6, 0x74, 0xa2, 0xf7, 0xab, 0x16, 0x96, 0x7b,
0x59, 0xd5, 0xb3, 0x63, 0x7f, 0x31, 0x7a, 0x39, 0x2f, 0x74, 0x5b, 0xe8, 0xce, 0x49, 0x5b, 0x55, 0xd2, 0x19, 0x9c, 0x53, 0x68, 0xdb, 0xaa, 0x9d, 0x53, 0xd5, 0x53, 0x56, 0x3b, 0xa7, 0xb2, 0x07,
0x35, 0x7f, 0xed, 0x6f, 0xbd, 0xc3, 0x8a, 0x1c, 0x26, 0xd1, 0xc1, 0x21, 0x7d, 0xa5, 0xca, 0xcb, 0x74, 0x2e, 0xa0, 0x44, 0xc6, 0x4e, 0x29, 0xba, 0xd1, 0x9d, 0x69, 0xfe, 0x2d, 0xa4, 0x99, 0xf6,
0x24, 0xf6, 0x45, 0x2e, 0xac, 0x38, 0x5c, 0x87, 0xf0, 0xb8, 0xea, 0xc4, 0xc3, 0x4f, 0x58, 0x91, 0xe6, 0xac, 0xea, 0xd9, 0xb1, 0x3f, 0x1b, 0xbd, 0xd2, 0x17, 0x7a, 0x34, 0x74, 0xef, 0xa4, 0xad,
0x1d, 0xee, 0x01, 0x3c, 0xc0, 0xfc, 0x09, 0xe6, 0xb1, 0xb0, 0xf5, 0x8d, 0x49, 0x79, 0x4a, 0x2b, 0xaa, 0x5a, 0xc6, 0xf6, 0x37, 0xde, 0x61, 0x45, 0x0e, 0x93, 0x68, 0xff, 0x90, 0xbe, 0x56, 0xa4,
0xa4, 0x47, 0xdd, 0x9c, 0xaa, 0x97, 0x1d, 0xd0, 0x01, 0x7b, 0xe7, 0x10, 0x77, 0x8f, 0x1e, 0x62, 0x34, 0x89, 0x7d, 0x91, 0x0b, 0x2b, 0x0e, 0xd7, 0x21, 0x3c, 0xae, 0x3a, 0xf1, 0xf0, 0x13, 0x56,
0x3f, 0xe4, 0x87, 0xa8, 0x7a, 0x65, 0x4e, 0x63, 0x02, 0xe4, 0xab, 0x14, 0xd3, 0x33, 0xb6, 0xbe, 0x64, 0x87, 0x7b, 0x00, 0x0f, 0x31, 0x7f, 0x8a, 0x79, 0x2c, 0x6c, 0x7d, 0x6b, 0x52, 0x9e, 0xd2,
0x5c, 0xd0, 0xff, 0xd2, 0x3f, 0xa5, 0x01, 0xfe, 0xdf, 0x4f, 0xc1, 0xfb, 0x60, 0x65, 0x0d, 0x5c, 0x0a, 0xe9, 0x51, 0xb7, 0xa7, 0xea, 0x65, 0x07, 0x74, 0xc1, 0xde, 0x39, 0xc4, 0xbd, 0xa3, 0x47,
0x75, 0x84, 0x97, 0xfb, 0xbb, 0x69, 0x11, 0xfe, 0x19, 0x58, 0x59, 0x61, 0x5b, 0xbd, 0x63, 0xb9, 0xd8, 0x0f, 0xf9, 0x21, 0xaa, 0x5e, 0x99, 0xd3, 0x98, 0x00, 0xf9, 0x2a, 0xc5, 0xf4, 0x8c, 0xad,
0x37, 0x68, 0x5f, 0x9f, 0xa2, 0x95, 0xdd, 0xf6, 0x29, 0xd4, 0xd3, 0x42, 0x14, 0x5d, 0x9b, 0x94, 0x2f, 0x17, 0xf4, 0xff, 0x08, 0x9e, 0xd1, 0x00, 0xff, 0xf7, 0xa7, 0xe0, 0x3d, 0xb0, 0xb2, 0xb6,
0x8e, 0xf2, 0x3b, 0x4f, 0xb9, 0xeb, 0xcf, 0xc0, 0xce, 0x55, 0x69, 0xd5, 0x04, 0x34, 0x5e, 0xdd, 0xaf, 0x3a, 0xc2, 0xcb, 0x5d, 0xe1, 0xb4, 0x08, 0xff, 0x14, 0xac, 0x8c, 0xd8, 0x56, 0xef, 0x58,
0xb5, 0x6f, 0x4e, 0xd5, 0xfb, 0xff, 0x08, 0xc8, 0xbb, 0xdf, 0xfe, 0x6c, 0xab, 0x4f, 0xf8, 0x61, 0xee, 0x0d, 0xda, 0x37, 0xa7, 0x68, 0x65, 0xb7, 0x7d, 0x06, 0xf5, 0x94, 0x88, 0xa2, 0x1b, 0x93,
0xd2, 0x11, 0x96, 0xbd, 0xad, 0x34, 0x6f, 0x11, 0xaa, 0x7f, 0xdd, 0x4e, 0x6f, 0x79, 0x5b, 0xee, 0xd2, 0x51, 0x7e, 0xe7, 0x29, 0x77, 0xfd, 0x09, 0xd8, 0x39, 0x96, 0x56, 0x5d, 0x80, 0xc6, 0xd9,
0x74, 0x5b, 0xda, 0x69, 0xd8, 0xe9, 0x2c, 0xc8, 0xe1, 0x47, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xfb, 0xf6, 0x54, 0xbd, 0xff, 0x8d, 0x80, 0xbc, 0xff, 0xcd, 0x4f, 0xb7, 0x0e, 0x08, 0x3f,
0x4f, 0x5f, 0xf8, 0xb7, 0x64, 0x23, 0x00, 0x00, 0x4c, 0xba, 0xc2, 0xb2, 0x77, 0x95, 0xe6, 0x1d, 0x42, 0xf5, 0xaf, 0xbb, 0xe9, 0x2d, 0xef, 0xca,
0x9d, 0xee, 0x4a, 0x3b, 0x0d, 0xbb, 0xdd, 0x05, 0x39, 0xfc, 0xe0, 0x5f, 0x01, 0x00, 0x00, 0xff,
0xff, 0x92, 0xba, 0x38, 0x00, 0x06, 0x24, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -270,7 +270,8 @@ message FieldIndexInfo {
int64 index_size = 8; int64 index_size = 8;
int64 index_version = 9; int64 index_version = 9;
int64 num_rows = 10; int64 num_rows = 10;
string index_engine_version = 11; int32 current_index_version = 11;
int32 minimal_index_version = 12;
} }
enum LoadScope { enum LoadScope {

View File

@ -251,7 +251,7 @@ func (SyncType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_aab7cc9a69ed26e8, []int{6} return fileDescriptor_aab7cc9a69ed26e8, []int{6}
} }
// --------------------QueryCoord grpc request and response proto------------------ //--------------------QueryCoord grpc request and response proto------------------
type ShowCollectionsRequest struct { type ShowCollectionsRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
// Not useful for now // Not useful for now
@ -1336,7 +1336,7 @@ func (m *SyncNewCreatedPartitionRequest) GetPartitionID() int64 {
return 0 return 0
} }
// -----------------query node grpc request and response proto---------------- //-----------------query node grpc request and response proto----------------
type LoadMetaInfo struct { type LoadMetaInfo struct {
LoadType LoadType `protobuf:"varint,1,opt,name=load_type,json=loadType,proto3,enum=milvus.proto.query.LoadType" json:"load_type,omitempty"` LoadType LoadType `protobuf:"varint,1,opt,name=load_type,json=loadType,proto3,enum=milvus.proto.query.LoadType" json:"load_type,omitempty"`
CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"` CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"`
@ -1771,7 +1771,8 @@ type FieldIndexInfo struct {
IndexSize int64 `protobuf:"varint,8,opt,name=index_size,json=indexSize,proto3" json:"index_size,omitempty"` IndexSize int64 `protobuf:"varint,8,opt,name=index_size,json=indexSize,proto3" json:"index_size,omitempty"`
IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"` IndexVersion int64 `protobuf:"varint,9,opt,name=index_version,json=indexVersion,proto3" json:"index_version,omitempty"`
NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"` NumRows int64 `protobuf:"varint,10,opt,name=num_rows,json=numRows,proto3" json:"num_rows,omitempty"`
IndexEngineVersion string `protobuf:"bytes,11,opt,name=index_engine_version,json=indexEngineVersion,proto3" json:"index_engine_version,omitempty"` CurrentIndexVersion int32 `protobuf:"varint,11,opt,name=current_index_version,json=currentIndexVersion,proto3" json:"current_index_version,omitempty"`
MinimalIndexVersion int32 `protobuf:"varint,12,opt,name=minimal_index_version,json=minimalIndexVersion,proto3" json:"minimal_index_version,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -1872,11 +1873,18 @@ func (m *FieldIndexInfo) GetNumRows() int64 {
return 0 return 0
} }
func (m *FieldIndexInfo) GetIndexEngineVersion() string { func (m *FieldIndexInfo) GetCurrentIndexVersion() int32 {
if m != nil { if m != nil {
return m.IndexEngineVersion return m.CurrentIndexVersion
} }
return "" return 0
}
func (m *FieldIndexInfo) GetMinimalIndexVersion() int32 {
if m != nil {
return m.MinimalIndexVersion
}
return 0
} }
type LoadSegmentsRequest struct { type LoadSegmentsRequest struct {
@ -2496,7 +2504,7 @@ func (m *GetLoadInfoResponse) GetPartitions() []int64 {
return nil return nil
} }
// ----------------request auto triggered by QueryCoord----------------- //----------------request auto triggered by QueryCoord-----------------
type HandoffSegmentsRequest struct { type HandoffSegmentsRequest struct {
Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
SegmentInfos []*SegmentInfo `protobuf:"bytes,2,rep,name=segmentInfos,proto3" json:"segmentInfos,omitempty"` SegmentInfos []*SegmentInfo `protobuf:"bytes,2,rep,name=segmentInfos,proto3" json:"segmentInfos,omitempty"`
@ -3193,7 +3201,7 @@ func (m *UnsubscribeChannelInfo) GetCollectionChannels() []*UnsubscribeChannels
return nil return nil
} }
// ---- synchronize messages proto between QueryCoord and QueryNode ----- //---- synchronize messages proto between QueryCoord and QueryNode -----
type SegmentChangeInfo struct { type SegmentChangeInfo struct {
OnlineNodeID int64 `protobuf:"varint,1,opt,name=online_nodeID,json=onlineNodeID,proto3" json:"online_nodeID,omitempty"` OnlineNodeID int64 `protobuf:"varint,1,opt,name=online_nodeID,json=onlineNodeID,proto3" json:"online_nodeID,omitempty"`
OnlineSegments []*SegmentInfo `protobuf:"bytes,2,rep,name=online_segments,json=onlineSegments,proto3" json:"online_segments,omitempty"` OnlineSegments []*SegmentInfo `protobuf:"bytes,2,rep,name=online_segments,json=onlineSegments,proto3" json:"online_segments,omitempty"`
@ -4582,308 +4590,309 @@ func init() {
func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) } func init() { proto.RegisterFile("query_coord.proto", fileDescriptor_aab7cc9a69ed26e8) }
var fileDescriptor_aab7cc9a69ed26e8 = []byte{ var fileDescriptor_aab7cc9a69ed26e8 = []byte{
// 4809 bytes of a gzipped FileDescriptorProto // 4825 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x1c, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x73, 0x1c, 0xc7,
0x7a, 0x9a, 0x17, 0x39, 0xf3, 0xcd, 0xab, 0x59, 0x24, 0xa5, 0xd9, 0x59, 0x49, 0x96, 0x5b, 0x7e, 0x79, 0x9c, 0x7d, 0x61, 0xf7, 0xdb, 0xd7, 0xa0, 0x01, 0x90, 0xeb, 0x35, 0x49, 0x51, 0x43, 0x3d,
0x70, 0x65, 0x9b, 0xd2, 0x52, 0x6b, 0xaf, 0x76, 0x6d, 0xc3, 0x91, 0x48, 0x4b, 0xe6, 0xda, 0xa6, 0x60, 0x4a, 0x02, 0x69, 0xd0, 0x92, 0x69, 0x4b, 0x2a, 0x85, 0x04, 0x44, 0x0a, 0x96, 0x04, 0x21,
0x95, 0xa6, 0xe4, 0x0d, 0xbc, 0xde, 0x1d, 0x37, 0xa7, 0x8b, 0xc3, 0x86, 0xfa, 0x31, 0xea, 0xee, 0x03, 0x50, 0x4e, 0xc9, 0xb2, 0x57, 0x83, 0x9d, 0xc6, 0x62, 0x8a, 0xf3, 0x58, 0xce, 0xcc, 0x02,
0x21, 0x4d, 0x07, 0x08, 0x72, 0xc8, 0x25, 0x9b, 0x6c, 0x10, 0x24, 0x87, 0xe4, 0x10, 0x04, 0x48, 0x82, 0x52, 0x95, 0xca, 0x21, 0x97, 0x38, 0x71, 0x2a, 0x95, 0x1c, 0x92, 0x43, 0x2a, 0x87, 0xa4,
0x82, 0x00, 0x9b, 0x20, 0xb9, 0x04, 0x09, 0x90, 0x43, 0x0e, 0xb9, 0xe5, 0x94, 0xd7, 0x29, 0x7f, 0x52, 0xe5, 0xa4, 0x92, 0x4b, 0x2a, 0xa9, 0xca, 0x21, 0x87, 0xdc, 0x72, 0xca, 0xeb, 0xe4, 0x3f,
0x20, 0xb9, 0xe5, 0x98, 0x45, 0xe0, 0x5b, 0x50, 0xaf, 0xee, 0xae, 0xee, 0x1a, 0x4e, 0x93, 0x23, 0x90, 0xdc, 0x72, 0x8c, 0x2b, 0xa5, 0x5b, 0xaa, 0x1f, 0xf3, 0xe8, 0x99, 0x5e, 0xec, 0x00, 0x4b,
0xad, 0xed, 0x60, 0x6f, 0xd3, 0x5f, 0x3d, 0xbe, 0xaf, 0xbe, 0x57, 0x7d, 0xdf, 0x57, 0x55, 0x03, 0x5a, 0x52, 0xca, 0xb7, 0x9d, 0xaf, 0x1f, 0xdf, 0xd7, 0xdf, 0xab, 0xbf, 0xef, 0xeb, 0xee, 0x85,
0x4b, 0x8f, 0x27, 0x38, 0x38, 0x1e, 0x0c, 0x7d, 0x3f, 0xb0, 0xd6, 0xc7, 0x81, 0x1f, 0xf9, 0x08, 0xc5, 0xc7, 0x13, 0xec, 0x9f, 0x0c, 0x86, 0x9e, 0xe7, 0x9b, 0x6b, 0x63, 0xdf, 0x0b, 0x3d, 0x84,
0xb9, 0xb6, 0x73, 0x38, 0x09, 0xd9, 0xd7, 0x3a, 0x6d, 0xef, 0xb7, 0x86, 0xbe, 0xeb, 0xfa, 0x1e, 0x1c, 0xcb, 0x3e, 0x9a, 0x04, 0xec, 0x6b, 0x8d, 0xb6, 0xf7, 0x5b, 0x43, 0xcf, 0x71, 0x3c, 0x97,
0x83, 0xf5, 0x5b, 0xe9, 0x1e, 0xfd, 0x8e, 0xed, 0x45, 0x38, 0xf0, 0x4c, 0x47, 0xb4, 0x86, 0xc3, 0xc1, 0xfa, 0xad, 0x74, 0x8f, 0x7e, 0xc7, 0x72, 0x43, 0xec, 0xbb, 0x86, 0x1d, 0xb5, 0x06, 0xc3,
0x03, 0xec, 0x9a, 0xfc, 0xab, 0xe1, 0x86, 0x23, 0xfe, 0x53, 0xb3, 0xcc, 0xc8, 0x4c, 0xa3, 0xea, 0x43, 0xec, 0x18, 0xfc, 0xab, 0xe1, 0x04, 0x23, 0xfe, 0x53, 0x35, 0x8d, 0xd0, 0x48, 0xa3, 0xea,
0x2f, 0xd9, 0x9e, 0x85, 0x3f, 0x4d, 0x83, 0xf4, 0xdf, 0x28, 0xc1, 0xf9, 0xdd, 0x03, 0xff, 0x68, 0x2f, 0x5a, 0xae, 0x89, 0x3f, 0x4d, 0x83, 0xb4, 0xdf, 0x52, 0xe0, 0xe2, 0xee, 0xa1, 0x77, 0xbc,
0xd3, 0x77, 0x1c, 0x3c, 0x8c, 0x6c, 0xdf, 0x0b, 0x0d, 0xfc, 0x78, 0x82, 0xc3, 0x08, 0xdd, 0x80, 0xe1, 0xd9, 0x36, 0x1e, 0x86, 0x96, 0xe7, 0x06, 0x3a, 0x7e, 0x3c, 0xc1, 0x41, 0x88, 0x6e, 0x41,
0xea, 0x9e, 0x19, 0xe2, 0x5e, 0xe9, 0x4a, 0x69, 0xad, 0xb9, 0x71, 0x71, 0x5d, 0xa2, 0x93, 0x13, 0x65, 0xdf, 0x08, 0x70, 0x4f, 0xb9, 0xa6, 0xac, 0x36, 0xd7, 0x2f, 0xaf, 0x09, 0x74, 0x72, 0x02,
0xf8, 0x7e, 0x38, 0xba, 0x63, 0x86, 0xd8, 0xa0, 0x3d, 0x11, 0x82, 0xaa, 0xb5, 0xb7, 0xbd, 0xd5, 0xdf, 0x0f, 0x46, 0xf7, 0x8c, 0x00, 0xeb, 0xb4, 0x27, 0x42, 0x50, 0x31, 0xf7, 0xb7, 0x36, 0x7b,
0x2b, 0x5f, 0x29, 0xad, 0x55, 0x0c, 0xfa, 0x1b, 0x3d, 0x07, 0xed, 0x61, 0x3c, 0xf7, 0xf6, 0x56, 0xa5, 0x6b, 0xca, 0x6a, 0x59, 0xa7, 0xbf, 0xd1, 0x73, 0xd0, 0x1e, 0xc6, 0x73, 0x6f, 0x6d, 0x06,
0xd8, 0xab, 0x5c, 0xa9, 0xac, 0x55, 0x0c, 0x19, 0xa8, 0xff, 0xb8, 0x0c, 0x17, 0x72, 0x64, 0x84, 0xbd, 0xf2, 0xb5, 0xf2, 0x6a, 0x59, 0x17, 0x81, 0xda, 0x8f, 0x4b, 0x70, 0x29, 0x47, 0x46, 0x30,
0x63, 0xdf, 0x0b, 0x31, 0xba, 0x09, 0x0b, 0x61, 0x64, 0x46, 0x93, 0x90, 0x53, 0xf2, 0x75, 0x25, 0xf6, 0xdc, 0x00, 0xa3, 0xdb, 0x50, 0x0b, 0x42, 0x23, 0x9c, 0x04, 0x9c, 0x92, 0xaf, 0x4b, 0x29,
0x25, 0xbb, 0xb4, 0x8b, 0xc1, 0xbb, 0xe6, 0xd1, 0x96, 0x15, 0x68, 0xd1, 0x37, 0x61, 0xc5, 0xf6, 0xd9, 0xa5, 0x5d, 0x74, 0xde, 0x35, 0x8f, 0xb6, 0x24, 0x41, 0x8b, 0xbe, 0x09, 0xcb, 0x96, 0xfb,
0xde, 0xc7, 0xae, 0x1f, 0x1c, 0x0f, 0xc6, 0x38, 0x18, 0x62, 0x2f, 0x32, 0x47, 0x58, 0xd0, 0xb8, 0x3e, 0x76, 0x3c, 0xff, 0x64, 0x30, 0xc6, 0xfe, 0x10, 0xbb, 0xa1, 0x31, 0xc2, 0x11, 0x8d, 0x4b,
0x2c, 0xda, 0xee, 0x27, 0x4d, 0xe8, 0x35, 0xb8, 0xc0, 0x64, 0x18, 0xe2, 0xe0, 0xd0, 0x1e, 0xe2, 0x51, 0xdb, 0x4e, 0xd2, 0x84, 0x5e, 0x83, 0x4b, 0x4c, 0x86, 0x01, 0xf6, 0x8f, 0xac, 0x21, 0x1e,
0x81, 0x79, 0x68, 0xda, 0x8e, 0xb9, 0xe7, 0xe0, 0x5e, 0xf5, 0x4a, 0x65, 0xad, 0x6e, 0xac, 0xd2, 0x18, 0x47, 0x86, 0x65, 0x1b, 0xfb, 0x36, 0xee, 0x55, 0xae, 0x95, 0x57, 0xeb, 0xfa, 0x0a, 0x6d,
0xe6, 0x5d, 0xd6, 0x7a, 0x5b, 0x34, 0xa2, 0x6f, 0x80, 0x16, 0xe0, 0xfd, 0x00, 0x87, 0x07, 0x83, 0xde, 0x65, 0xad, 0x77, 0xa3, 0x46, 0xf4, 0x0d, 0x50, 0x7d, 0x7c, 0xe0, 0xe3, 0xe0, 0x70, 0x30,
0x71, 0xe0, 0x8f, 0x02, 0x1c, 0x86, 0xbd, 0x1a, 0x45, 0xd3, 0xe5, 0xf0, 0xfb, 0x1c, 0xac, 0xff, 0xf6, 0xbd, 0x91, 0x8f, 0x83, 0xa0, 0x57, 0xa5, 0x68, 0xba, 0x1c, 0xbe, 0xc3, 0xc1, 0xda, 0x5f,
0x79, 0x09, 0x56, 0x09, 0x33, 0xee, 0x9b, 0x41, 0x64, 0x3f, 0x05, 0x91, 0xe8, 0xd0, 0x4a, 0xb3, 0x28, 0xb0, 0x42, 0x98, 0xb1, 0x63, 0xf8, 0xa1, 0xf5, 0x14, 0x44, 0xa2, 0x41, 0x2b, 0xcd, 0x86,
0xa1, 0x57, 0xa1, 0x6d, 0x12, 0x8c, 0xf4, 0x19, 0x0b, 0xf4, 0x84, 0x7d, 0x55, 0x4a, 0xaa, 0x04, 0x5e, 0x99, 0xb6, 0x09, 0x30, 0xd2, 0x67, 0x1c, 0xa1, 0x27, 0xec, 0xab, 0x50, 0x52, 0x05, 0x98,
0xd3, 0xff, 0x95, 0xeb, 0x4e, 0x9a, 0xce, 0x79, 0x64, 0x96, 0xc5, 0x59, 0xce, 0xe3, 0x3c, 0x8b, 0xf6, 0x6f, 0x5c, 0x77, 0xd2, 0x74, 0xce, 0x23, 0xb3, 0x2c, 0xce, 0x52, 0x1e, 0xe7, 0x79, 0x24,
0xc4, 0x54, 0x9c, 0xaf, 0xaa, 0x39, 0xff, 0xcf, 0x15, 0x58, 0x7d, 0xcf, 0x37, 0xad, 0x44, 0x0d, 0x26, 0xe3, 0x7c, 0x45, 0xce, 0xf9, 0x7f, 0x29, 0xc3, 0xca, 0x7b, 0x9e, 0x61, 0x26, 0x6a, 0xf8,
0x7f, 0xfe, 0x9c, 0x7f, 0x13, 0x16, 0x98, 0x45, 0xf7, 0xaa, 0x14, 0xd7, 0xf3, 0x32, 0x2e, 0x6e, 0x8b, 0xe7, 0xfc, 0x9b, 0x50, 0x63, 0x16, 0xdd, 0xab, 0x50, 0x5c, 0xcf, 0x8b, 0xb8, 0xb8, 0xb5,
0xed, 0x09, 0x85, 0xbb, 0x14, 0x60, 0xf0, 0x41, 0xe8, 0x79, 0xe8, 0x04, 0x78, 0xec, 0xd8, 0x43, 0x27, 0x14, 0xee, 0x52, 0x80, 0xce, 0x07, 0xa1, 0xe7, 0xa1, 0xe3, 0xe3, 0xb1, 0x6d, 0x0d, 0x8d,
0x73, 0xe0, 0x4d, 0xdc, 0x3d, 0x1c, 0xf4, 0x6a, 0x57, 0x4a, 0x6b, 0x35, 0xa3, 0xcd, 0xa1, 0x3b, 0x81, 0x3b, 0x71, 0xf6, 0xb1, 0xdf, 0xab, 0x5e, 0x53, 0x56, 0xab, 0x7a, 0x9b, 0x43, 0xb7, 0x29,
0x14, 0x88, 0x3e, 0x81, 0xf6, 0xbe, 0x8d, 0x1d, 0x6b, 0x40, 0x5d, 0xc2, 0xf6, 0x56, 0x6f, 0xe1, 0x10, 0x7d, 0x02, 0xed, 0x03, 0x0b, 0xdb, 0xe6, 0x80, 0xba, 0x84, 0xad, 0xcd, 0x5e, 0xed, 0x5a,
0x4a, 0x65, 0xad, 0xb9, 0xf1, 0xfa, 0x7a, 0xde, 0x1b, 0xad, 0x2b, 0x39, 0xb2, 0x7e, 0x97, 0x0c, 0x79, 0xb5, 0xb9, 0xfe, 0xfa, 0x5a, 0xde, 0x1b, 0xad, 0x49, 0x39, 0xb2, 0x76, 0x9f, 0x0c, 0xdf,
0xdf, 0x66, 0xa3, 0xdf, 0xf6, 0xa2, 0xe0, 0xd8, 0x68, 0xed, 0xa7, 0x40, 0xa8, 0x07, 0x8b, 0x9c, 0x62, 0xa3, 0xdf, 0x76, 0x43, 0xff, 0x44, 0x6f, 0x1d, 0xa4, 0x40, 0xa8, 0x07, 0x0b, 0x9c, 0xbd,
0xbd, 0xbd, 0xc5, 0x2b, 0xa5, 0xb5, 0xba, 0x21, 0x3e, 0xd1, 0x8b, 0xd0, 0x0d, 0x70, 0xe8, 0x4f, 0xbd, 0x85, 0x6b, 0xca, 0x6a, 0x5d, 0x8f, 0x3e, 0xd1, 0x8b, 0xd0, 0xf5, 0x71, 0xe0, 0x4d, 0xfc,
0x82, 0x21, 0x1e, 0x8c, 0x02, 0x7f, 0x32, 0x0e, 0x7b, 0xf5, 0x2b, 0x95, 0xb5, 0x86, 0xd1, 0x11, 0x21, 0x1e, 0x8c, 0x7c, 0x6f, 0x32, 0x0e, 0x7a, 0xf5, 0x6b, 0xe5, 0xd5, 0x86, 0xde, 0x89, 0xc0,
0xe0, 0x7b, 0x14, 0xda, 0x7f, 0x0b, 0x96, 0x72, 0x58, 0x90, 0x06, 0x95, 0x47, 0xf8, 0x98, 0x0a, 0x0f, 0x28, 0xb4, 0xff, 0x16, 0x2c, 0xe6, 0xb0, 0x20, 0x15, 0xca, 0x8f, 0xf0, 0x09, 0x15, 0x44,
0xa2, 0x62, 0x90, 0x9f, 0x68, 0x05, 0x6a, 0x87, 0xa6, 0x33, 0xc1, 0x9c, 0xd5, 0xec, 0xe3, 0xbb, 0x59, 0x27, 0x3f, 0xd1, 0x32, 0x54, 0x8f, 0x0c, 0x7b, 0x82, 0x39, 0xab, 0xd9, 0xc7, 0x77, 0x4b,
0xe5, 0x5b, 0x25, 0xfd, 0x8f, 0x4a, 0xd0, 0x33, 0xb0, 0x83, 0xcd, 0x10, 0x7f, 0x91, 0x22, 0x3d, 0x77, 0x14, 0xed, 0x4f, 0x14, 0xe8, 0xe9, 0xd8, 0xc6, 0x46, 0x80, 0xbf, 0x48, 0x91, 0x5e, 0x84,
0x0f, 0x0b, 0x9e, 0x6f, 0xe1, 0xed, 0x2d, 0x2a, 0xd2, 0x8a, 0xc1, 0xbf, 0xf4, 0xcf, 0x4b, 0xb0, 0x9a, 0xeb, 0x99, 0x78, 0x6b, 0x93, 0x8a, 0xb4, 0xac, 0xf3, 0x2f, 0xed, 0x73, 0x05, 0x96, 0x1f,
0x72, 0x0f, 0x47, 0xc4, 0x0c, 0xec, 0x30, 0xb2, 0x87, 0xb1, 0x9d, 0xbf, 0x09, 0x95, 0x00, 0x3f, 0xe0, 0x90, 0x98, 0x81, 0x15, 0x84, 0xd6, 0x30, 0xb6, 0xf3, 0x37, 0xa1, 0xec, 0xe3, 0xc7, 0x9c,
0xe6, 0x94, 0xbd, 0x24, 0x53, 0x16, 0xbb, 0x7f, 0xd5, 0x48, 0x83, 0x8c, 0x43, 0xcf, 0x42, 0xcb, 0xb2, 0x97, 0x44, 0xca, 0x62, 0xf7, 0x2f, 0x1b, 0xa9, 0x93, 0x71, 0xe8, 0x59, 0x68, 0x99, 0x8e,
0x72, 0x9d, 0xc1, 0xf0, 0xc0, 0xf4, 0x3c, 0xec, 0x30, 0x43, 0x6a, 0x18, 0x4d, 0xcb, 0x75, 0x36, 0x3d, 0x18, 0x1e, 0x1a, 0xae, 0x8b, 0x6d, 0x66, 0x48, 0x0d, 0xbd, 0x69, 0x3a, 0xf6, 0x06, 0x07,
0x39, 0x08, 0x5d, 0x06, 0x08, 0xf1, 0xc8, 0xc5, 0x5e, 0x94, 0xf8, 0xe4, 0x14, 0x04, 0x5d, 0x83, 0xa1, 0xab, 0x00, 0x01, 0x1e, 0x39, 0xd8, 0x0d, 0x13, 0x9f, 0x9c, 0x82, 0xa0, 0x1b, 0xb0, 0x78,
0xa5, 0xfd, 0xc0, 0x77, 0x07, 0xe1, 0x81, 0x19, 0x58, 0x03, 0x07, 0x9b, 0x16, 0x0e, 0x28, 0xf5, 0xe0, 0x7b, 0xce, 0x20, 0x38, 0x34, 0x7c, 0x73, 0x60, 0x63, 0xc3, 0xc4, 0x3e, 0xa5, 0xbe, 0xae,
0x75, 0xa3, 0x4b, 0x1a, 0x76, 0x09, 0xfc, 0x3d, 0x0a, 0x46, 0x37, 0xa1, 0x16, 0x0e, 0xfd, 0x31, 0x77, 0x49, 0xc3, 0x2e, 0x81, 0xbf, 0x47, 0xc1, 0xe8, 0x36, 0x54, 0x83, 0xa1, 0x37, 0xc6, 0x54,
0xa6, 0x9a, 0xd6, 0xd9, 0xb8, 0xa4, 0xd2, 0xa1, 0x2d, 0x33, 0x32, 0x77, 0x49, 0x27, 0x83, 0xf5, 0xd3, 0x3a, 0xeb, 0x57, 0x64, 0x3a, 0xb4, 0x69, 0x84, 0xc6, 0x2e, 0xe9, 0xa4, 0xb3, 0xbe, 0xda,
0xd5, 0xff, 0xbe, 0xca, 0x4c, 0xed, 0x4b, 0xee, 0xe4, 0x52, 0xe6, 0x58, 0x7b, 0x32, 0xe6, 0xb8, 0x3f, 0x54, 0x98, 0xa9, 0x7d, 0xc9, 0x9d, 0x5c, 0xca, 0x1c, 0xab, 0x4f, 0xc6, 0x1c, 0x6b, 0x85,
0x50, 0xc8, 0x1c, 0x17, 0x4f, 0x36, 0xc7, 0x1c, 0xd7, 0x4e, 0x63, 0x8e, 0xf5, 0x99, 0xe6, 0xd8, 0xcc, 0x71, 0xe1, 0x74, 0x73, 0xcc, 0x71, 0xed, 0x2c, 0xe6, 0x58, 0x9f, 0x69, 0x8e, 0x0d, 0x99,
0x50, 0x99, 0x23, 0x7a, 0x1b, 0xba, 0x2c, 0x80, 0xb0, 0xbd, 0x7d, 0x7f, 0xe0, 0xd8, 0x61, 0xd4, 0x39, 0xa2, 0xb7, 0xa1, 0xcb, 0x02, 0x08, 0xcb, 0x3d, 0xf0, 0x06, 0xb6, 0x15, 0x84, 0x3d, 0xa0,
0x03, 0x4a, 0xe6, 0xa5, 0xac, 0x86, 0x5a, 0xf8, 0xd3, 0x75, 0x86, 0xd8, 0xdb, 0xf7, 0x8d, 0xb6, 0x64, 0x5e, 0xc9, 0x6a, 0xa8, 0x89, 0x3f, 0x5d, 0x63, 0x88, 0xdd, 0x03, 0x4f, 0x6f, 0x5b, 0xd1,
0x2d, 0x7e, 0xbe, 0x67, 0x87, 0xd1, 0xfc, 0x56, 0xfd, 0x8f, 0x89, 0x55, 0x7f, 0xd9, 0xb5, 0x27, 0xcf, 0xf7, 0xac, 0x20, 0x9c, 0xdf, 0xaa, 0xff, 0x29, 0xb1, 0xea, 0x2f, 0xbb, 0xf6, 0x24, 0x96,
0xb1, 0xfc, 0x9a, 0x64, 0xf9, 0x7f, 0x51, 0x82, 0xaf, 0xdd, 0xc3, 0x51, 0x4c, 0x3e, 0x31, 0x64, 0x5f, 0x15, 0x2c, 0xff, 0x2f, 0x15, 0xf8, 0xda, 0x03, 0x1c, 0xc6, 0xe4, 0x13, 0x43, 0xc6, 0x5f,
0xfc, 0x25, 0xdd, 0xe6, 0xff, 0xba, 0x04, 0x7d, 0x15, 0xad, 0xf3, 0x6c, 0xf5, 0x1f, 0xc1, 0xf9, 0xd2, 0x6d, 0xfe, 0x6f, 0x14, 0xe8, 0xcb, 0x68, 0x9d, 0x67, 0xab, 0xff, 0x08, 0x2e, 0xc6, 0x38,
0x18, 0xc7, 0xc0, 0xc2, 0xe1, 0x30, 0xb0, 0xc7, 0x54, 0x8c, 0xd4, 0x57, 0x35, 0x37, 0xae, 0xaa, 0x06, 0x26, 0x0e, 0x86, 0xbe, 0x35, 0xa6, 0x62, 0xa4, 0xbe, 0xaa, 0xb9, 0x7e, 0x5d, 0xa6, 0xf8,
0x14, 0x3f, 0x4b, 0xc1, 0x6a, 0x3c, 0xc5, 0x56, 0x6a, 0x06, 0xfd, 0x27, 0x25, 0x58, 0x25, 0xbe, 0x59, 0x0a, 0x56, 0xe2, 0x29, 0x36, 0x53, 0x33, 0x68, 0x3f, 0x51, 0x60, 0x85, 0xf8, 0x46, 0xee,
0x91, 0x3b, 0x33, 0xa2, 0x81, 0x67, 0xe6, 0xab, 0xec, 0x26, 0xcb, 0x39, 0x37, 0x59, 0x80, 0xc7, 0xcc, 0x88, 0x06, 0x9e, 0x9b, 0xaf, 0xa2, 0x9b, 0x2c, 0xe5, 0xdc, 0x64, 0x01, 0x1e, 0xd3, 0x10,
0x34, 0xc4, 0xce, 0xd2, 0x33, 0x0f, 0xef, 0x5e, 0x85, 0x1a, 0x31, 0x40, 0xc1, 0xaa, 0x67, 0x54, 0x3b, 0x4b, 0xcf, 0x3c, 0xbc, 0x7b, 0x15, 0xaa, 0xc4, 0x00, 0x23, 0x56, 0x3d, 0x23, 0x63, 0x55,
0xac, 0x4a, 0x23, 0x63, 0xbd, 0x75, 0x8f, 0x51, 0x91, 0xf8, 0xed, 0x39, 0xd4, 0x2d, 0xbb, 0xec, 0x1a, 0x19, 0xeb, 0xad, 0xb9, 0x8c, 0x8a, 0xc4, 0x6f, 0xcf, 0xa1, 0x6e, 0xd9, 0x65, 0x97, 0x24,
0xb2, 0x62, 0xd9, 0xbf, 0x5d, 0x82, 0x0b, 0x39, 0x84, 0xf3, 0xac, 0xfb, 0x0d, 0x58, 0xa0, 0xbb, 0xcb, 0xfe, 0x5d, 0x05, 0x2e, 0xe5, 0x10, 0xce, 0xb3, 0xee, 0x37, 0xa0, 0x46, 0x77, 0xa3, 0x68,
0x91, 0x58, 0xf8, 0x73, 0xca, 0x85, 0xa7, 0xd0, 0x11, 0x6f, 0x63, 0xf0, 0x31, 0xba, 0x0f, 0x5a, 0xe1, 0xcf, 0x49, 0x17, 0x9e, 0x42, 0x47, 0xbc, 0x8d, 0xce, 0xc7, 0x68, 0x1e, 0xa8, 0xd9, 0x36,
0xb6, 0x8d, 0xec, 0x93, 0x7c, 0x8f, 0x1c, 0x78, 0xa6, 0xcb, 0x18, 0xd0, 0x30, 0x9a, 0x1c, 0xb6, 0xb2, 0x4f, 0xf2, 0x3d, 0x72, 0xe0, 0x1a, 0x0e, 0x63, 0x40, 0x43, 0x6f, 0x72, 0xd8, 0xb6, 0xe1,
0x63, 0xba, 0x18, 0x7d, 0x0d, 0xea, 0xc4, 0x64, 0x07, 0xb6, 0x25, 0xc4, 0xbf, 0x48, 0x4d, 0xd8, 0x60, 0xf4, 0x35, 0xa8, 0x13, 0x93, 0x1d, 0x58, 0x66, 0x24, 0xfe, 0x05, 0x6a, 0xc2, 0x66, 0x80,
0x0a, 0xd1, 0x25, 0x00, 0xda, 0x64, 0x5a, 0x56, 0xc0, 0xb6, 0xd0, 0x86, 0xd1, 0x20, 0x90, 0xdb, 0xae, 0x00, 0xd0, 0x26, 0xc3, 0x34, 0x7d, 0xb6, 0x85, 0x36, 0xf4, 0x06, 0x81, 0xdc, 0x25, 0x00,
0x04, 0xa0, 0xff, 0x61, 0x09, 0x2e, 0xef, 0x1e, 0x7b, 0xc3, 0x1d, 0x7c, 0xb4, 0x19, 0x60, 0x33, 0xed, 0x8f, 0x15, 0xb8, 0xba, 0x7b, 0xe2, 0x0e, 0xb7, 0xf1, 0xf1, 0x86, 0x8f, 0x8d, 0x10, 0x27,
0xc2, 0x89, 0xd3, 0x7e, 0xaa, 0x8c, 0x47, 0x57, 0xa0, 0x99, 0xb2, 0x5f, 0xae, 0x92, 0x69, 0x90, 0x4e, 0xfb, 0xa9, 0x32, 0x1e, 0x5d, 0x83, 0x66, 0xca, 0x7e, 0xb9, 0x4a, 0xa6, 0x41, 0xda, 0xdf,
0xfe, 0x37, 0x25, 0x68, 0x91, 0x5d, 0xe4, 0x7d, 0x1c, 0x99, 0x44, 0x45, 0xd0, 0x77, 0xa0, 0xe1, 0x2a, 0xd0, 0x22, 0xbb, 0xc8, 0xfb, 0x38, 0x34, 0x88, 0x8a, 0xa0, 0xef, 0x40, 0xc3, 0xf6, 0x0c,
0xf8, 0xa6, 0x35, 0x88, 0x8e, 0xc7, 0x8c, 0x9a, 0x4e, 0x96, 0x9a, 0x64, 0xeb, 0x79, 0x70, 0x3c, 0x73, 0x10, 0x9e, 0x8c, 0x19, 0x35, 0x9d, 0x2c, 0x35, 0xc9, 0xd6, 0xb3, 0x77, 0x32, 0xc6, 0x7a,
0xc6, 0x46, 0xdd, 0xe1, 0xbf, 0x0a, 0x51, 0x94, 0xf5, 0x32, 0x15, 0x85, 0xa7, 0x7c, 0x06, 0x9a, 0xdd, 0xe6, 0xbf, 0x0a, 0x51, 0x94, 0xf5, 0x32, 0x65, 0x89, 0xa7, 0x7c, 0x06, 0x9a, 0x0e, 0x0e,
0x2e, 0x8e, 0x02, 0x7b, 0xc8, 0x88, 0xa8, 0x52, 0x51, 0x00, 0x03, 0x11, 0x44, 0xfa, 0x4f, 0x16, 0x7d, 0x6b, 0xc8, 0x88, 0xa8, 0x50, 0x51, 0x00, 0x03, 0x11, 0x44, 0xda, 0x4f, 0x6a, 0x70, 0xf1,
0xe0, 0xfc, 0xf7, 0xcd, 0x68, 0x78, 0xb0, 0xe5, 0x8a, 0x28, 0xe6, 0xec, 0x7c, 0x4c, 0xfc, 0x72, 0xfb, 0x46, 0x38, 0x3c, 0xdc, 0x74, 0xa2, 0x28, 0xe6, 0xfc, 0x7c, 0x4c, 0xfc, 0x72, 0x29, 0xed,
0x39, 0xed, 0x97, 0x9f, 0x98, 0xdf, 0x8f, 0x6d, 0xb4, 0xa6, 0xb2, 0x51, 0x92, 0x98, 0xaf, 0x7f, 0x97, 0x9f, 0x98, 0xdf, 0x8f, 0x6d, 0xb4, 0x2a, 0xb3, 0x51, 0x92, 0x98, 0xaf, 0x7d, 0xc8, 0xd5,
0xc8, 0xd5, 0x2c, 0x65, 0xa3, 0xa9, 0x60, 0x63, 0xe1, 0x2c, 0xc1, 0xc6, 0x26, 0xb4, 0xf1, 0xa7, 0x2c, 0x65, 0xa3, 0xa9, 0x60, 0xa3, 0x76, 0x9e, 0x60, 0x63, 0x03, 0xda, 0xf8, 0xd3, 0xa1, 0x3d,
0x43, 0x67, 0x42, 0xf4, 0x95, 0x62, 0x67, 0x51, 0xc4, 0x65, 0x05, 0xf6, 0xb4, 0x83, 0x68, 0xf1, 0x21, 0xfa, 0x4a, 0xb1, 0xb3, 0x28, 0xe2, 0xaa, 0x04, 0x7b, 0xda, 0x41, 0xb4, 0xf8, 0xa0, 0x2d,
0x41, 0xdb, 0x9c, 0x06, 0xa6, 0x0b, 0x2e, 0x8e, 0x4c, 0x1a, 0x2a, 0x34, 0x37, 0xae, 0x4c, 0xd3, 0x4e, 0x03, 0xd3, 0x05, 0x07, 0x87, 0x06, 0x0d, 0x15, 0x9a, 0xeb, 0xd7, 0xa6, 0xe9, 0x42, 0xa4,
0x05, 0xa1, 0x40, 0x4c, 0x1f, 0xc8, 0x17, 0xba, 0x08, 0x0d, 0x1e, 0xda, 0x6c, 0x6f, 0xf5, 0x1a, 0x40, 0x4c, 0x1f, 0xc8, 0x17, 0xba, 0x0c, 0x0d, 0x1e, 0xda, 0x6c, 0x6d, 0xf6, 0x1a, 0x94, 0x7d,
0x94, 0x7d, 0x09, 0x00, 0x99, 0xd0, 0xe6, 0xde, 0x93, 0x53, 0xc8, 0x02, 0x88, 0x37, 0x54, 0x08, 0x09, 0x00, 0x19, 0xd0, 0xe6, 0xde, 0x93, 0x53, 0xc8, 0x02, 0x88, 0x37, 0x64, 0x08, 0xe4, 0xc2,
0xd4, 0xc2, 0x4e, 0x53, 0x1e, 0xf2, 0x40, 0x27, 0x4c, 0x81, 0x48, 0xe6, 0xef, 0xef, 0xef, 0x3b, 0x4e, 0x53, 0x1e, 0xf0, 0x40, 0x27, 0x48, 0x81, 0x48, 0xe6, 0xef, 0x1d, 0x1c, 0xd8, 0x96, 0x8b,
0xb6, 0x87, 0x77, 0x98, 0x84, 0x9b, 0x94, 0x08, 0x19, 0x48, 0xc2, 0xa1, 0x43, 0x1c, 0x84, 0xb6, 0xb7, 0x99, 0x84, 0x9b, 0x94, 0x08, 0x11, 0x48, 0xc2, 0xa1, 0x23, 0xec, 0x07, 0x96, 0xe7, 0xf6,
0xef, 0xf5, 0x5a, 0xb4, 0x5d, 0x7c, 0xaa, 0xa2, 0x9c, 0xf6, 0x19, 0xa2, 0x9c, 0x01, 0x2c, 0xe5, 0x5a, 0xb4, 0x3d, 0xfa, 0x94, 0x45, 0x39, 0xed, 0x73, 0x44, 0x39, 0x03, 0x58, 0xcc, 0x51, 0x2a,
0x28, 0x55, 0x44, 0x39, 0xdf, 0x4a, 0x47, 0x39, 0xb3, 0x45, 0x95, 0x8a, 0x82, 0x7e, 0x5a, 0x82, 0x89, 0x72, 0xbe, 0x95, 0x8e, 0x72, 0x66, 0x8b, 0x2a, 0x15, 0x05, 0xfd, 0x54, 0x81, 0x95, 0x87,
0xd5, 0x87, 0x5e, 0x38, 0xd9, 0x8b, 0x59, 0xf4, 0xc5, 0x98, 0x43, 0xd6, 0x89, 0x56, 0x73, 0x4e, 0x6e, 0x30, 0xd9, 0x8f, 0x59, 0xf4, 0xc5, 0x98, 0x43, 0xd6, 0x89, 0x56, 0x72, 0x4e, 0x54, 0xfb,
0x54, 0xff, 0x9f, 0x1a, 0x74, 0xf9, 0x2a, 0x88, 0xd6, 0x50, 0x97, 0x73, 0x11, 0x1a, 0xf1, 0x3e, 0x9f, 0x2a, 0x74, 0xf9, 0x2a, 0x88, 0xd6, 0x50, 0x97, 0x73, 0x19, 0x1a, 0xf1, 0x3e, 0xca, 0x19,
0xca, 0x19, 0x92, 0x00, 0xb2, 0x3e, 0xac, 0x9c, 0xf3, 0x61, 0x85, 0x48, 0x13, 0x51, 0x51, 0x35, 0x92, 0x00, 0xb2, 0x3e, 0xac, 0x94, 0xf3, 0x61, 0x85, 0x48, 0x8b, 0xa2, 0xa2, 0x4a, 0x2a, 0x2a,
0x15, 0x15, 0x5d, 0x02, 0xd8, 0x77, 0x26, 0xe1, 0xc1, 0x20, 0xb2, 0x5d, 0xcc, 0xa3, 0xb2, 0x06, 0xba, 0x02, 0x70, 0x60, 0x4f, 0x82, 0xc3, 0x41, 0x68, 0x39, 0x98, 0x47, 0x65, 0x0d, 0x0a, 0xd9,
0x85, 0x3c, 0xb0, 0x5d, 0x8c, 0x6e, 0x43, 0x6b, 0xcf, 0xf6, 0x1c, 0x7f, 0x34, 0x18, 0x9b, 0xd1, 0xb3, 0x1c, 0x8c, 0xee, 0x42, 0x6b, 0xdf, 0x72, 0x6d, 0x6f, 0x34, 0x18, 0x1b, 0xe1, 0x61, 0xc0,
0x41, 0xc8, 0xd3, 0x62, 0x95, 0x58, 0x68, 0x0c, 0x7b, 0x87, 0xf6, 0x35, 0x9a, 0x6c, 0xcc, 0x7d, 0xd3, 0x62, 0x99, 0x58, 0x68, 0x0c, 0x7b, 0x8f, 0xf6, 0xd5, 0x9b, 0x6c, 0xcc, 0x0e, 0x19, 0x82,
0x32, 0x04, 0x5d, 0x86, 0xa6, 0x37, 0x71, 0x07, 0xfe, 0xfe, 0x20, 0xf0, 0x8f, 0x42, 0x9a, 0xfc, 0xae, 0x42, 0xd3, 0x9d, 0x38, 0x03, 0xef, 0x60, 0xe0, 0x7b, 0xc7, 0x01, 0x4d, 0x7e, 0xcb, 0x7a,
0x56, 0x8c, 0x86, 0x37, 0x71, 0x3f, 0xd8, 0x37, 0xfc, 0x23, 0xb2, 0x8f, 0x35, 0xc8, 0x8e, 0x16, 0xc3, 0x9d, 0x38, 0x1f, 0x1c, 0xe8, 0xde, 0x31, 0xd9, 0xc7, 0x1a, 0x64, 0x47, 0x0b, 0x6c, 0x6f,
0x3a, 0xfe, 0x88, 0x25, 0xbe, 0xb3, 0xe7, 0x4f, 0x06, 0x90, 0xd1, 0x16, 0x76, 0x22, 0x93, 0x8e, 0xc4, 0x12, 0xdf, 0xd9, 0xf3, 0x27, 0x03, 0xc8, 0x68, 0x13, 0xdb, 0xa1, 0x41, 0x47, 0x37, 0x8a,
0x6e, 0x14, 0x1b, 0x1d, 0x0f, 0x40, 0x2f, 0x40, 0x67, 0xe8, 0xbb, 0x63, 0x93, 0x72, 0xe8, 0x6e, 0x8d, 0x8e, 0x07, 0xa0, 0x17, 0xa0, 0x33, 0xf4, 0x9c, 0xb1, 0x41, 0x39, 0x74, 0xdf, 0xf7, 0x1c,
0xe0, 0xbb, 0xd4, 0x00, 0x2b, 0x46, 0x06, 0x8a, 0x36, 0xa1, 0x99, 0x18, 0x41, 0xd8, 0x6b, 0x52, 0x6a, 0x80, 0x65, 0x3d, 0x03, 0x45, 0x1b, 0xd0, 0x4c, 0x8c, 0x20, 0xe8, 0x35, 0x29, 0x1e, 0x4d,
0x3c, 0xba, 0xca, 0x4a, 0x53, 0xa1, 0x3c, 0x51, 0x50, 0x88, 0xad, 0x20, 0x24, 0x9a, 0x21, 0x8c, 0x66, 0xa5, 0xa9, 0x50, 0x9e, 0x28, 0x28, 0xc4, 0x56, 0x10, 0x10, 0xcd, 0x88, 0x8c, 0x3d, 0xb0,
0x3d, 0xb4, 0x3f, 0xc3, 0xdc, 0xd0, 0x9a, 0x1c, 0xb6, 0x6b, 0x7f, 0x86, 0x49, 0x7a, 0x64, 0x7b, 0x3e, 0xc3, 0xdc, 0xd0, 0x9a, 0x1c, 0xb6, 0x6b, 0x7d, 0x86, 0x49, 0x7a, 0x64, 0xb9, 0x01, 0xf6,
0x21, 0x0e, 0x22, 0x91, 0xac, 0xf6, 0xda, 0x54, 0x7d, 0xda, 0x0c, 0xca, 0x15, 0x1b, 0x6d, 0x41, 0xc3, 0x28, 0x59, 0xed, 0xb5, 0xa9, 0xfa, 0xb4, 0x19, 0x94, 0x2b, 0x36, 0xda, 0x84, 0x4e, 0x10,
0x27, 0x8c, 0xcc, 0x20, 0x1a, 0x8c, 0xfd, 0x90, 0x2a, 0x40, 0xaf, 0x43, 0x75, 0x3b, 0x63, 0x92, 0x1a, 0x7e, 0x38, 0x18, 0x7b, 0x01, 0x55, 0x80, 0x5e, 0x87, 0xea, 0x76, 0xc6, 0x24, 0x9d, 0x60,
0x6e, 0x38, 0x22, 0x8a, 0x7d, 0x9f, 0x77, 0x32, 0xda, 0x74, 0x90, 0xf8, 0x24, 0xb3, 0x50, 0x4e, 0x44, 0x14, 0x7b, 0x87, 0x77, 0xd2, 0xdb, 0x74, 0x50, 0xf4, 0x49, 0x66, 0xa1, 0x9c, 0x48, 0x66,
0x24, 0xb3, 0x74, 0x0b, 0xcd, 0x42, 0x07, 0xc5, 0xb3, 0xac, 0x91, 0x74, 0xc9, 0xb4, 0xcc, 0x3d, 0xe9, 0x16, 0x9a, 0x85, 0x0e, 0x8a, 0x67, 0x59, 0x25, 0xe9, 0x92, 0x61, 0x1a, 0xfb, 0x36, 0xfe,
0x07, 0x7f, 0xc8, 0x3d, 0x88, 0x46, 0x17, 0x96, 0x05, 0xeb, 0x7f, 0x52, 0x81, 0x8e, 0xcc, 0x1e, 0x90, 0x7b, 0x10, 0x95, 0x2e, 0x2c, 0x0b, 0xd6, 0x7e, 0x56, 0x86, 0x8e, 0xc8, 0x1e, 0xe2, 0x76,
0xe2, 0x76, 0x58, 0x56, 0x26, 0x74, 0x5e, 0x7c, 0x12, 0x66, 0x61, 0x8f, 0x8c, 0x66, 0x29, 0x20, 0x58, 0x56, 0x16, 0xe9, 0x7c, 0xf4, 0x49, 0x98, 0x85, 0x5d, 0x32, 0x9a, 0xa5, 0x80, 0x54, 0xe5,
0x55, 0xf9, 0xba, 0xd1, 0x64, 0x30, 0x3a, 0x01, 0x51, 0x5d, 0x26, 0x14, 0x6a, 0x67, 0x15, 0xca, 0xeb, 0x7a, 0x93, 0xc1, 0xe8, 0x04, 0x44, 0x75, 0x99, 0x50, 0xa8, 0x9d, 0x95, 0x29, 0xa3, 0x1a,
0xa8, 0x06, 0x85, 0xd0, 0x50, 0xa5, 0x07, 0x8b, 0x22, 0x7b, 0x64, 0x0a, 0x2f, 0x3e, 0x49, 0xcb, 0x14, 0x42, 0x43, 0x95, 0x1e, 0x2c, 0x44, 0xd9, 0x23, 0x53, 0xf8, 0xe8, 0x93, 0xb4, 0xec, 0x4f,
0xde, 0xc4, 0xa6, 0x58, 0x99, 0xc2, 0x8b, 0x4f, 0xb4, 0x05, 0x2d, 0x36, 0xe5, 0xd8, 0x0c, 0x4c, 0x2c, 0x8a, 0x95, 0x29, 0x7c, 0xf4, 0x89, 0x36, 0xa1, 0xc5, 0xa6, 0x1c, 0x1b, 0xbe, 0xe1, 0x44,
0x57, 0xa8, 0xfb, 0xb3, 0x4a, 0x97, 0xf1, 0x2e, 0x3e, 0xfe, 0x90, 0x78, 0x9f, 0xfb, 0xa6, 0x1d, 0xea, 0xfe, 0xac, 0xd4, 0x65, 0xbc, 0x8b, 0x4f, 0x3e, 0x24, 0xde, 0x67, 0xc7, 0xb0, 0x7c, 0x9d,
0x18, 0x4c, 0x3d, 0xee, 0xd3, 0x51, 0x68, 0x0d, 0x34, 0x36, 0xcb, 0xbe, 0xed, 0x60, 0x6e, 0x38, 0xa9, 0xc7, 0x0e, 0x1d, 0x85, 0x56, 0x41, 0x65, 0xb3, 0x1c, 0x58, 0x36, 0xe6, 0x86, 0xb3, 0xc0,
0x8b, 0x2c, 0x85, 0xa4, 0xf0, 0xbb, 0xb6, 0x83, 0x99, 0x6d, 0xc4, 0x4b, 0xa0, 0x0a, 0x51, 0x67, 0x52, 0x48, 0x0a, 0xbf, 0x6f, 0xd9, 0x98, 0xd9, 0x46, 0xbc, 0x04, 0xaa, 0x10, 0x75, 0x66, 0x1a,
0xa6, 0x41, 0x21, 0x54, 0x1d, 0xae, 0x02, 0xf3, 0xa2, 0x03, 0xe1, 0x9b, 0xd9, 0x06, 0xc2, 0x68, 0x14, 0x42, 0xd5, 0xe1, 0x3a, 0x30, 0x2f, 0x3a, 0x88, 0x7c, 0x33, 0xdb, 0x40, 0x18, 0x8d, 0x9c,
0xe4, 0x6c, 0xa5, 0x21, 0xd9, 0xc4, 0x65, 0xc6, 0x05, 0x6c, 0x39, 0xde, 0xc4, 0xa5, 0xa6, 0x75, 0xad, 0x34, 0x24, 0x9b, 0x38, 0xcc, 0xb8, 0x80, 0x2d, 0xc7, 0x9d, 0x38, 0xd4, 0xb4, 0xd6, 0x61,
0x03, 0x56, 0xd8, 0x78, 0xec, 0x8d, 0x6c, 0x0f, 0xc7, 0xd3, 0x34, 0x29, 0xaf, 0x10, 0x6d, 0x7b, 0x65, 0x38, 0xf1, 0x7d, 0xb6, 0xbd, 0xa4, 0xe7, 0x69, 0xd2, 0xa4, 0x7b, 0x89, 0x37, 0x6e, 0xa5,
0x9b, 0x36, 0x09, 0x19, 0xfd, 0x5e, 0x0d, 0x96, 0x89, 0x4f, 0xe2, 0xee, 0x69, 0x8e, 0x90, 0xe2, 0xa7, 0x5b, 0x87, 0x15, 0xc7, 0x72, 0x2d, 0xc7, 0xb0, 0x33, 0x63, 0x5a, 0x6c, 0x0c, 0x6f, 0x4c,
0x12, 0x80, 0x15, 0x46, 0x03, 0xc9, 0x8f, 0x36, 0xac, 0x30, 0xe2, 0x1b, 0xce, 0x77, 0x44, 0x44, 0x8f, 0xd1, 0xfe, 0xa0, 0x0a, 0x4b, 0xc4, 0x93, 0x71, 0xa7, 0x36, 0x47, 0x20, 0x72, 0x05, 0xc0,
0x50, 0x99, 0x9e, 0xe0, 0x64, 0x7c, 0x64, 0x3e, 0x2a, 0x38, 0x53, 0x45, 0xf0, 0x2a, 0xb4, 0x79, 0x0c, 0xc2, 0x81, 0xe0, 0x7d, 0x1b, 0x66, 0x10, 0xf2, 0x6d, 0xea, 0x3b, 0x51, 0x1c, 0x51, 0x9e,
0x76, 0x2f, 0xa5, 0xa2, 0x2d, 0x06, 0xdc, 0x51, 0x7b, 0xfa, 0x05, 0x65, 0x65, 0x32, 0x15, 0x19, 0x9e, 0x16, 0x65, 0x3c, 0x6b, 0x3e, 0x96, 0x38, 0x57, 0x1d, 0xf1, 0x3a, 0xb4, 0x79, 0x4d, 0x40,
0x2c, 0xce, 0x17, 0x19, 0xd4, 0xb3, 0x91, 0xc1, 0x5d, 0xe8, 0xca, 0xc6, 0x29, 0xbc, 0xdb, 0x0c, 0x48, 0x60, 0x5b, 0x0c, 0xb8, 0x2d, 0xdf, 0x1f, 0x6a, 0xd2, 0x7a, 0x66, 0x2a, 0x9e, 0x58, 0x98,
0xeb, 0xec, 0x48, 0xd6, 0x19, 0xa6, 0x37, 0x76, 0x90, 0x37, 0xf6, 0xab, 0xd0, 0xf6, 0x30, 0xb6, 0x2f, 0x9e, 0xa8, 0x67, 0xe3, 0x89, 0xfb, 0xd0, 0x15, 0x4d, 0x3a, 0xf2, 0x89, 0x33, 0x6c, 0xba,
0x06, 0x51, 0x60, 0x7a, 0xe1, 0x3e, 0x0e, 0xa8, 0x56, 0xd4, 0x8d, 0x16, 0x01, 0x3e, 0xe0, 0x30, 0x23, 0xd8, 0x74, 0x90, 0x0e, 0x07, 0x40, 0x0c, 0x07, 0xae, 0x43, 0xdb, 0xc5, 0xd8, 0x1c, 0x84,
0xf4, 0x06, 0x00, 0x5d, 0x23, 0x2b, 0x68, 0xb5, 0xa6, 0x17, 0xb4, 0xa8, 0xd2, 0xd0, 0x82, 0x16, 0xbe, 0xe1, 0x06, 0x07, 0xd8, 0xa7, 0xaa, 0x54, 0xd7, 0x5b, 0x04, 0xb8, 0xc7, 0x61, 0xe8, 0x0d,
0x65, 0x0a, 0xfd, 0xf9, 0x84, 0x62, 0x07, 0xfd, 0x5f, 0xca, 0x70, 0x9e, 0x17, 0x38, 0xe6, 0xd7, 0x00, 0xba, 0x46, 0x56, 0x06, 0x6b, 0x4d, 0x2f, 0x83, 0x51, 0xa5, 0xa1, 0x65, 0x30, 0xca, 0x14,
0xcb, 0x69, 0x7b, 0xbb, 0xd8, 0x1c, 0x2b, 0x27, 0x94, 0x0c, 0xaa, 0x05, 0xc2, 0xdf, 0x9a, 0x22, 0xfa, 0xf3, 0x09, 0x45, 0x1c, 0xda, 0xbf, 0x96, 0xe0, 0x22, 0x2f, 0x8b, 0xcc, 0xaf, 0x97, 0xd3,
0xfc, 0x95, 0xd3, 0xe6, 0x85, 0x5c, 0xda, 0x1c, 0x57, 0x0c, 0x17, 0x8b, 0x57, 0x0c, 0xd1, 0x0a, 0x22, 0x82, 0x68, 0x4b, 0x2d, 0x9f, 0x52, 0x68, 0xa8, 0x14, 0x08, 0x9a, 0xab, 0x92, 0xa0, 0x59,
0xd4, 0x68, 0x2e, 0x47, 0x75, 0xa7, 0x61, 0xb0, 0x8f, 0x42, 0x52, 0xd5, 0xff, 0xa0, 0x0c, 0xed, 0x4c, 0xb6, 0x6b, 0xb9, 0x64, 0x3b, 0xae, 0x33, 0x2e, 0x14, 0xaf, 0x33, 0xa2, 0x65, 0xa8, 0xd2,
0x5d, 0x6c, 0x06, 0xc3, 0x03, 0xc1, 0xc7, 0xd7, 0xd2, 0x15, 0xd6, 0xe7, 0xa6, 0x54, 0x58, 0xa5, 0x0c, 0x90, 0xea, 0x4e, 0x43, 0x67, 0x1f, 0x85, 0xa4, 0xaa, 0xfd, 0x51, 0x09, 0xda, 0xbb, 0xd8,
0x21, 0x5f, 0x99, 0xd2, 0x2a, 0x41, 0x10, 0xf9, 0x91, 0x19, 0x53, 0x39, 0xf0, 0x26, 0x2e, 0x2f, 0xf0, 0x87, 0x87, 0x11, 0x1f, 0x5f, 0x4b, 0xd7, 0x65, 0x9f, 0x9b, 0x52, 0x97, 0x15, 0x86, 0x7c,
0x3b, 0x76, 0x69, 0x03, 0x27, 0x75, 0x67, 0xe2, 0xea, 0xff, 0x5d, 0x82, 0xd6, 0x2f, 0x93, 0x69, 0x65, 0x0a, 0xb2, 0x04, 0x41, 0xe8, 0x85, 0x46, 0x4c, 0xe5, 0xc0, 0x9d, 0x38, 0xbc, 0x58, 0xd9,
0x04, 0x63, 0x6e, 0xa5, 0x19, 0xf3, 0xc2, 0x14, 0xc6, 0x18, 0x24, 0x2d, 0xc3, 0x87, 0xf8, 0x2b, 0xa5, 0x0d, 0x9c, 0xd4, 0xed, 0x89, 0xa3, 0xfd, 0xb7, 0x02, 0xad, 0x5f, 0x25, 0xd3, 0x44, 0x8c,
0x57, 0x75, 0xfe, 0xa7, 0x12, 0xf4, 0x49, 0x52, 0x6e, 0x30, 0xbf, 0x33, 0xbf, 0x75, 0x5d, 0x85, 0xb9, 0x93, 0x66, 0xcc, 0x0b, 0x53, 0x18, 0xa3, 0x93, 0x64, 0x0e, 0x1f, 0xe1, 0xaf, 0x5c, 0xad,
0xf6, 0xa1, 0x14, 0xfe, 0x96, 0xa9, 0x72, 0xb6, 0x0e, 0xd3, 0x45, 0x04, 0x03, 0x34, 0x51, 0x04, 0xfa, 0x9f, 0x15, 0xe8, 0x93, 0x54, 0x5e, 0x67, 0x7e, 0x67, 0x7e, 0xeb, 0xba, 0x0e, 0xed, 0x23,
0xe6, 0x8b, 0x15, 0xdb, 0xc0, 0x8b, 0x2a, 0xaa, 0x33, 0xc4, 0x51, 0x0f, 0xd1, 0x0d, 0x64, 0xa0, 0x21, 0x68, 0x2e, 0x51, 0xe5, 0x6c, 0x1d, 0xa5, 0x4b, 0x0f, 0x3a, 0xa8, 0x51, 0xe9, 0x98, 0x2f,
0xfe, 0x3b, 0x25, 0x58, 0x56, 0x74, 0x44, 0x17, 0x60, 0x91, 0x17, 0x2c, 0x78, 0x84, 0xc1, 0xec, 0x36, 0xda, 0x06, 0x5e, 0x94, 0x51, 0x9d, 0x21, 0x8e, 0x7a, 0x88, 0xae, 0x2f, 0x02, 0xb5, 0xdf,
0xdd, 0x22, 0xe2, 0x49, 0x4a, 0x6e, 0xb6, 0x95, 0x8f, 0xa9, 0x2d, 0x92, 0x83, 0xc7, 0xd9, 0x99, 0x53, 0x60, 0x49, 0xd2, 0x11, 0x5d, 0x82, 0x05, 0x5e, 0xe6, 0xe0, 0x71, 0x09, 0xb3, 0x77, 0x93,
0x95, 0x93, 0x8f, 0x15, 0xa2, 0x3e, 0xd4, 0xb9, 0x37, 0x15, 0x69, 0x6f, 0xfc, 0xad, 0x3f, 0x02, 0x88, 0x27, 0x29, 0xd4, 0x59, 0x66, 0x3e, 0x12, 0x37, 0x49, 0xe6, 0x1e, 0xe7, 0x74, 0x66, 0x4e,
0x74, 0x0f, 0x27, 0x7b, 0xd7, 0x3c, 0x1c, 0x4d, 0xfc, 0x4d, 0x42, 0x68, 0xda, 0x09, 0x59, 0xfa, 0x3e, 0x66, 0x80, 0xfa, 0x50, 0xe7, 0xde, 0x34, 0x4a, 0x96, 0xe3, 0x6f, 0xed, 0x11, 0xa0, 0x07,
0x7f, 0x96, 0x60, 0x59, 0xc2, 0x36, 0x4f, 0x61, 0x29, 0xd9, 0x5f, 0xcb, 0x67, 0xd9, 0x5f, 0xa5, 0x38, 0xd9, 0xbb, 0xe6, 0xe1, 0x68, 0xe2, 0x6f, 0x12, 0x42, 0xd3, 0x4e, 0xc8, 0xd4, 0xfe, 0x53,
0xe2, 0x49, 0xe5, 0x54, 0xc5, 0x93, 0xcb, 0x00, 0x31, 0xff, 0x05, 0x47, 0x53, 0x10, 0xfd, 0x1f, 0x81, 0x25, 0x01, 0xdb, 0x3c, 0xe5, 0xa8, 0x64, 0x7f, 0x2d, 0x9d, 0x67, 0x7f, 0x15, 0x4a, 0x2e,
0x4a, 0x70, 0xfe, 0x1d, 0xd3, 0xb3, 0xfc, 0xfd, 0xfd, 0xf9, 0x55, 0x75, 0x13, 0xa4, 0x44, 0xb9, 0xe5, 0x33, 0x95, 0x5c, 0xae, 0x02, 0xc4, 0xfc, 0x8f, 0x38, 0x9a, 0x82, 0x68, 0xff, 0xa8, 0xc0,
0x68, 0xf9, 0x50, 0xce, 0xae, 0x5f, 0x82, 0xa5, 0x80, 0xed, 0x4c, 0x96, 0xac, 0xcb, 0x15, 0x43, 0xc5, 0x77, 0x0c, 0xd7, 0xf4, 0x0e, 0x0e, 0xe6, 0x57, 0xd5, 0x0d, 0x10, 0xd2, 0xeb, 0xa2, 0x45,
0x13, 0x0d, 0xb1, 0x8e, 0xfe, 0x55, 0x19, 0x10, 0x59, 0xf5, 0x1d, 0xd3, 0x31, 0xbd, 0x21, 0x3e, 0x47, 0x31, 0x27, 0x7f, 0x09, 0x16, 0x7d, 0xb6, 0x33, 0x99, 0xa2, 0x2e, 0x97, 0x75, 0x35, 0x6a,
0x3b, 0xe9, 0xcf, 0x43, 0x47, 0x0a, 0x61, 0xe2, 0xe3, 0xfc, 0x74, 0x0c, 0x13, 0xa2, 0x77, 0xa1, 0x88, 0x75, 0xf4, 0xaf, 0x4b, 0x80, 0xc8, 0xaa, 0xef, 0x19, 0xb6, 0xe1, 0x0e, 0xf1, 0xf9, 0x49,
0xb3, 0xc7, 0x50, 0x0d, 0x02, 0x6c, 0x86, 0xbe, 0xc7, 0xc5, 0xa1, 0xac, 0x14, 0x3e, 0x08, 0xec, 0x7f, 0x1e, 0x3a, 0x42, 0x08, 0x13, 0x5f, 0x02, 0x48, 0xc7, 0x30, 0x01, 0x7a, 0x17, 0x3a, 0xfb,
0xd1, 0x08, 0x07, 0x9b, 0xbe, 0x67, 0xf1, 0x38, 0x7f, 0x4f, 0x90, 0x49, 0x86, 0x12, 0x63, 0x48, 0x0c, 0xd5, 0xc0, 0xc7, 0x46, 0xe0, 0xb9, 0x5c, 0x1c, 0xd2, 0xfa, 0xe2, 0x9e, 0x6f, 0x8d, 0x46,
0xe2, 0xb9, 0x58, 0x38, 0x71, 0x40, 0x47, 0x59, 0x11, 0x62, 0xd3, 0x49, 0x18, 0x91, 0xec, 0x86, 0xd8, 0xdf, 0xf0, 0x5c, 0x93, 0x67, 0x07, 0xfb, 0x11, 0x99, 0x64, 0x28, 0x31, 0x86, 0x24, 0x9e,
0x1a, 0x6b, 0xd8, 0x9d, 0x5e, 0x28, 0x56, 0xc4, 0x57, 0xfa, 0xdf, 0x96, 0x00, 0xc5, 0xc9, 0x3c, 0x8b, 0x85, 0x13, 0x07, 0x74, 0x94, 0x15, 0x01, 0x36, 0xec, 0x84, 0x11, 0xc9, 0x6e, 0xa8, 0xb2,
0xad, 0x7e, 0x50, 0x8b, 0xce, 0x0e, 0x2d, 0x29, 0x36, 0xe5, 0x8b, 0xd0, 0xb0, 0xc4, 0x48, 0xee, 0x86, 0xdd, 0xe9, 0xe5, 0x65, 0x49, 0x7c, 0xa5, 0xfd, 0x9d, 0x02, 0x28, 0x2e, 0x01, 0xd0, 0x9a,
0x82, 0x12, 0x00, 0xdd, 0x23, 0x29, 0xd1, 0x03, 0xa2, 0x79, 0xd8, 0x12, 0xc9, 0x32, 0x03, 0xbe, 0x09, 0xb5, 0xe8, 0xec, 0x50, 0x45, 0xb2, 0x29, 0x5f, 0x86, 0x86, 0x19, 0x8d, 0xe4, 0x2e, 0x28,
0x47, 0x61, 0x72, 0x78, 0x56, 0xcd, 0x86, 0x67, 0xe9, 0x3a, 0x68, 0x4d, 0xaa, 0x83, 0xea, 0x3f, 0x01, 0xd0, 0x3d, 0x92, 0x12, 0x3d, 0x20, 0x9a, 0x87, 0xcd, 0x28, 0xc5, 0x66, 0xc0, 0xf7, 0x28,
0x2d, 0x83, 0x46, 0xb7, 0x90, 0xcd, 0xa4, 0xa0, 0x55, 0x88, 0xe8, 0xab, 0xd0, 0xe6, 0xd7, 0x61, 0x4c, 0x0c, 0xcf, 0x2a, 0xd9, 0xf0, 0x2c, 0x5d, 0x3d, 0xad, 0x0a, 0xd5, 0x53, 0xed, 0xa7, 0x25,
0x24, 0xc2, 0x5b, 0x8f, 0x53, 0x93, 0x91, 0x90, 0x9e, 0x75, 0x0a, 0x70, 0x38, 0x71, 0x92, 0x3c, 0x50, 0xe9, 0x16, 0xb2, 0x91, 0x94, 0xc1, 0x0a, 0x11, 0x7d, 0x1d, 0xda, 0xfc, 0x12, 0x8d, 0x40,
0x91, 0xa5, 0x3f, 0xe8, 0x31, 0xdb, 0xbb, 0x48, 0x93, 0x18, 0xf1, 0x10, 0xce, 0x8f, 0x1c, 0x7f, 0x78, 0xeb, 0x71, 0x6a, 0x32, 0x74, 0x0b, 0x96, 0x59, 0x27, 0x1f, 0x07, 0x13, 0x3b, 0xc9, 0x2e,
0xcf, 0x74, 0x06, 0xb2, 0x78, 0x98, 0x0c, 0x0b, 0x68, 0xfc, 0x0a, 0x1b, 0xbe, 0x9b, 0x96, 0x61, 0x59, 0xd2, 0x84, 0x1e, 0xb3, 0xbd, 0x8b, 0x34, 0x45, 0x23, 0x1e, 0xc2, 0xc5, 0x91, 0xed, 0xed,
0x88, 0xee, 0x40, 0x3b, 0xc4, 0xf8, 0x51, 0x92, 0x3c, 0xd6, 0x8a, 0x24, 0x8f, 0x2d, 0x32, 0x46, 0x1b, 0xf6, 0x40, 0x14, 0x0f, 0x93, 0x61, 0x01, 0x8d, 0x5f, 0x66, 0xc3, 0x77, 0xd3, 0x32, 0x0c,
0x7c, 0xe9, 0x7f, 0x5c, 0x82, 0x6e, 0xe6, 0x14, 0x23, 0x5b, 0xea, 0x28, 0xe5, 0x4b, 0x1d, 0xb7, 0xd0, 0x3d, 0x68, 0x07, 0x18, 0x3f, 0x4a, 0x52, 0xce, 0x6a, 0x91, 0x94, 0xb3, 0x45, 0xc6, 0x44,
0xa0, 0x46, 0x3c, 0x15, 0xdb, 0x5b, 0x3a, 0xea, 0x34, 0x5c, 0x9e, 0xd5, 0x60, 0x03, 0xd0, 0x75, 0x5f, 0xda, 0x9f, 0x2a, 0xd0, 0xcd, 0x9c, 0x7d, 0x64, 0x0b, 0x24, 0x4a, 0xbe, 0x40, 0x72, 0x07,
0x58, 0x56, 0xdc, 0x96, 0xe0, 0xe2, 0x47, 0xf9, 0xcb, 0x12, 0xfa, 0xcf, 0xaa, 0xd0, 0x4c, 0xb1, 0xaa, 0xc4, 0x53, 0xb1, 0xbd, 0xa5, 0x23, 0x4f, 0xde, 0xc5, 0x59, 0x75, 0x36, 0x00, 0xdd, 0x84,
0x62, 0x46, 0x95, 0xe6, 0x89, 0x54, 0xa3, 0xa7, 0x9d, 0x8e, 0x13, 0x95, 0x73, 0xb1, 0xcb, 0x32, 0x25, 0xc9, 0x1d, 0x0b, 0x2e, 0x7e, 0x94, 0xbf, 0x62, 0xa1, 0xfd, 0xbc, 0x02, 0xcd, 0x14, 0x2b,
0x45, 0x9e, 0xb6, 0xba, 0xd8, 0xa5, 0x79, 0x62, 0x3a, 0x05, 0x5c, 0x90, 0x53, 0x40, 0x39, 0x49, 0x66, 0xd4, 0x76, 0x9e, 0x48, 0x0d, 0x7b, 0xda, 0x99, 0x3a, 0x51, 0x39, 0x07, 0x3b, 0x2c, 0xbf,
0x5e, 0x3c, 0x21, 0x49, 0xae, 0xcb, 0x49, 0xb2, 0x64, 0x42, 0x8d, 0xac, 0x09, 0x15, 0x2d, 0x9c, 0xe4, 0xc9, 0xae, 0x83, 0x1d, 0x9a, 0x5d, 0xa6, 0x13, 0xc7, 0x9a, 0x98, 0x38, 0x8a, 0xa9, 0xf5,
0xdc, 0x80, 0xe5, 0x21, 0xab, 0xf6, 0xdf, 0x39, 0xde, 0x8c, 0x9b, 0x78, 0x50, 0xaa, 0x6a, 0x42, 0xc2, 0x29, 0xa9, 0x75, 0x5d, 0x4c, 0xad, 0x05, 0x13, 0x6a, 0x64, 0x4d, 0xa8, 0x68, 0xb9, 0xe5,
0x77, 0x93, 0x92, 0x28, 0x93, 0x32, 0x4b, 0x3a, 0xd4, 0x39, 0x38, 0x97, 0x0d, 0x13, 0xb2, 0xf0, 0x16, 0x2c, 0x0d, 0xd9, 0x19, 0xc1, 0xbd, 0x93, 0x8d, 0xb8, 0x89, 0x07, 0xa5, 0xb2, 0x26, 0x74,
0xcc, 0xf4, 0x2b, 0x5b, 0xb2, 0x69, 0x9f, 0xa9, 0x64, 0xf3, 0x0c, 0x34, 0x45, 0xa4, 0x42, 0x2c, 0x3f, 0x29, 0xa4, 0x32, 0x29, 0xb3, 0xa4, 0x43, 0x9e, 0xb9, 0x73, 0xd9, 0x30, 0x21, 0x47, 0x9e,
0xbd, 0xc3, 0x9c, 0x9e, 0x70, 0x03, 0x56, 0x28, 0xf9, 0x81, 0xae, 0x7c, 0x1e, 0x92, 0xad, 0x60, 0x99, 0x7e, 0x65, 0x0b, 0x3d, 0xed, 0x73, 0x15, 0x7a, 0x9e, 0x81, 0x66, 0x14, 0xa9, 0x10, 0x4b,
0x68, 0xf9, 0x0a, 0xc6, 0x05, 0x58, 0xb4, 0xc3, 0xc1, 0xbe, 0xf9, 0x08, 0xf7, 0x96, 0x68, 0xeb, 0xef, 0x30, 0xa7, 0x17, 0xb9, 0x01, 0x33, 0x10, 0xfc, 0x40, 0x57, 0x3c, 0x45, 0xc9, 0xd6, 0x3d,
0x82, 0x1d, 0xde, 0x35, 0x1f, 0x61, 0xfd, 0xdf, 0x2a, 0xd0, 0x49, 0x36, 0xd8, 0xc2, 0x1e, 0xa4, 0xd4, 0x7c, 0xdd, 0xe3, 0x12, 0x2c, 0x58, 0xc1, 0xe0, 0xc0, 0x78, 0x84, 0x7b, 0x8b, 0xb4, 0xb5,
0xc8, 0x8d, 0xa1, 0x1d, 0xd0, 0x92, 0xb8, 0x87, 0x72, 0xf8, 0xc4, 0x1c, 0x3c, 0x7b, 0xc8, 0xd8, 0x66, 0x05, 0xf7, 0x8d, 0x47, 0x58, 0xfb, 0xf7, 0x32, 0x74, 0x92, 0x0d, 0xb6, 0xb0, 0x07, 0x29,
0x1d, 0x67, 0xec, 0x55, 0xda, 0xee, 0xab, 0xa7, 0xda, 0xee, 0xe7, 0xbc, 0x4b, 0x70, 0x13, 0x56, 0x72, 0xcf, 0x68, 0x1b, 0xd4, 0x24, 0xee, 0xa1, 0x1c, 0x3e, 0x35, 0x07, 0xcf, 0x1e, 0x4d, 0x76,
0xe3, 0xbd, 0x57, 0x5a, 0x36, 0x4b, 0xb0, 0x56, 0x44, 0xe3, 0xfd, 0xf4, 0xf2, 0xa7, 0xb8, 0x80, 0xc7, 0x19, 0x7b, 0x15, 0xb6, 0xfb, 0xca, 0x99, 0xb6, 0xfb, 0x39, 0x6f, 0x20, 0xdc, 0x86, 0x95,
0xc5, 0x69, 0x2e, 0x20, 0xab, 0x02, 0xf5, 0x9c, 0x0a, 0xe4, 0xaf, 0x34, 0x34, 0x14, 0x57, 0x1a, 0x78, 0xef, 0x15, 0x96, 0xcd, 0x12, 0xac, 0xe5, 0xa8, 0x71, 0x27, 0xbd, 0xfc, 0x29, 0x2e, 0x60,
0xf4, 0x87, 0xb0, 0x4c, 0xcb, 0xd3, 0xe1, 0x30, 0xb0, 0xf7, 0x70, 0x9c, 0x02, 0x14, 0x11, 0x6b, 0x61, 0x9a, 0x0b, 0xc8, 0xaa, 0x40, 0x3d, 0xa7, 0x02, 0xf9, 0x8b, 0x10, 0x0d, 0xc9, 0x45, 0x08,
0x1f, 0xea, 0x99, 0x2c, 0x22, 0xfe, 0xd6, 0x7f, 0x5c, 0x82, 0xf3, 0xf9, 0x79, 0xa9, 0xc6, 0x24, 0xed, 0x21, 0x2c, 0xd1, 0xa2, 0x76, 0x30, 0xf4, 0xad, 0x7d, 0x1c, 0xa7, 0x00, 0x45, 0xc4, 0xda,
0x8e, 0xa4, 0x24, 0x39, 0x92, 0x5f, 0x81, 0xe5, 0x54, 0x44, 0x29, 0xcd, 0x3c, 0x25, 0x02, 0x57, 0x87, 0x7a, 0x26, 0x8b, 0x88, 0xbf, 0xb5, 0x1f, 0x2b, 0x70, 0x31, 0x3f, 0x2f, 0xd5, 0x98, 0xc4,
0x10, 0x6e, 0xa0, 0x64, 0x0e, 0x01, 0xd3, 0x7f, 0x56, 0x8a, 0xab, 0xfc, 0x04, 0x36, 0xa2, 0x47, 0x91, 0x28, 0x82, 0x23, 0xf9, 0x35, 0x58, 0x4a, 0x45, 0x94, 0xc2, 0xcc, 0x53, 0x22, 0x70, 0x09,
0x28, 0x64, 0x5f, 0xf3, 0x3d, 0xc7, 0xf6, 0xe2, 0x82, 0x0b, 0x5f, 0x23, 0x03, 0xf2, 0x82, 0xcb, 0xe1, 0x3a, 0x4a, 0xe6, 0x88, 0x60, 0xda, 0xcf, 0x95, 0xf8, 0x6c, 0x80, 0xc0, 0x46, 0xf4, 0xe0,
0x3b, 0xd0, 0xe5, 0x9d, 0xe2, 0xed, 0xa9, 0x60, 0x40, 0xd6, 0x61, 0xe3, 0xe2, 0x8d, 0xe9, 0x79, 0x85, 0xec, 0x6b, 0x9e, 0x6b, 0x5b, 0x6e, 0x5c, 0x70, 0xe1, 0x6b, 0x64, 0x40, 0x5e, 0x70, 0x79,
0xe8, 0xf0, 0xb3, 0x0d, 0x81, 0xaf, 0xa2, 0x3a, 0xf1, 0xf8, 0x1e, 0x68, 0xa2, 0xdb, 0x69, 0x37, 0x07, 0xba, 0xbc, 0x53, 0xbc, 0x3d, 0x15, 0x0c, 0xc8, 0x3a, 0x6c, 0x5c, 0xbc, 0x31, 0x3d, 0x0f,
0xc4, 0x2e, 0x1f, 0x18, 0x07, 0x76, 0xbf, 0x59, 0x82, 0x9e, 0xbc, 0x3d, 0xa6, 0x96, 0x7f, 0xfa, 0x1d, 0x7e, 0x22, 0x12, 0xe1, 0x2b, 0xcb, 0xce, 0x49, 0xbe, 0x07, 0x6a, 0xd4, 0xed, 0xac, 0x1b,
0xf0, 0xee, 0x75, 0xf9, 0x44, 0xfb, 0xf9, 0x13, 0xe8, 0x49, 0xf0, 0x88, 0x73, 0xed, 0xdf, 0x2d, 0x62, 0x97, 0x0f, 0x8c, 0x03, 0xbb, 0xdf, 0x56, 0xa0, 0x27, 0x6e, 0x8f, 0xa9, 0xe5, 0x9f, 0x3d,
0xd3, 0xeb, 0x09, 0x24, 0xd5, 0xdb, 0xb2, 0xc3, 0x28, 0xb0, 0xf7, 0x26, 0xf3, 0x9d, 0xb1, 0x9a, 0xbc, 0x7b, 0x5d, 0x3c, 0x07, 0x7f, 0xfe, 0x14, 0x7a, 0x12, 0x3c, 0xd1, 0x69, 0xf8, 0xef, 0x97,
0xd0, 0x1c, 0x1e, 0xe0, 0xe1, 0xa3, 0xb1, 0x6f, 0x27, 0x52, 0x79, 0x4b, 0x45, 0xd3, 0x74, 0xb4, 0xe8, 0xa5, 0x06, 0x92, 0xea, 0x6d, 0x5a, 0x41, 0xe8, 0x5b, 0xfb, 0x93, 0xf9, 0x4e, 0x66, 0x0d,
0xeb, 0x9b, 0xc9, 0x0c, 0xec, 0x90, 0x2a, 0x3d, 0x67, 0xff, 0x87, 0xa0, 0x65, 0x3b, 0xa4, 0xcf, 0x68, 0x0e, 0x0f, 0xf1, 0xf0, 0xd1, 0xd8, 0xb3, 0x12, 0xa9, 0xbc, 0x25, 0xa3, 0x69, 0x3a, 0xda,
0x86, 0x1a, 0xec, 0x6c, 0xe8, 0xa6, 0x7c, 0x36, 0x34, 0x23, 0xd2, 0x48, 0x1d, 0x0d, 0xfd, 0x5d, 0xb5, 0x8d, 0x64, 0x06, 0x76, 0xb4, 0x95, 0x9e, 0xb3, 0xff, 0x43, 0x50, 0xb3, 0x1d, 0xd2, 0x27,
0x19, 0xbe, 0xae, 0xa4, 0x6d, 0x9e, 0x2c, 0x69, 0x5a, 0x1d, 0xe9, 0x0e, 0xd4, 0x33, 0x49, 0xed, 0x4a, 0x0d, 0x76, 0xa2, 0x74, 0x5b, 0x3c, 0x51, 0x9a, 0x11, 0x69, 0xa4, 0x0e, 0x94, 0xfe, 0xbe,
0x0b, 0x27, 0xc8, 0x8f, 0xd7, 0x5d, 0x59, 0x69, 0x30, 0x4c, 0x62, 0xab, 0xc4, 0xe0, 0xab, 0xd3, 0x04, 0x5f, 0x97, 0xd2, 0x36, 0x4f, 0x96, 0x34, 0xad, 0x8e, 0x74, 0x0f, 0xea, 0x99, 0xa4, 0xf6,
0xe7, 0xe0, 0x76, 0x27, 0xcd, 0x21, 0xc6, 0xa1, 0xdb, 0xd0, 0x62, 0x05, 0x83, 0xc1, 0xa1, 0x8d, 0x85, 0x53, 0xe4, 0xc7, 0xeb, 0xae, 0xac, 0x34, 0x18, 0x24, 0xb1, 0x55, 0x62, 0xf0, 0x95, 0xe9,
0x8f, 0xc4, 0xc9, 0xeb, 0x65, 0xa5, 0x6b, 0xa6, 0xfd, 0x3e, 0xb4, 0xf1, 0x91, 0xd1, 0x74, 0xe2, 0x73, 0x70, 0xbb, 0x13, 0xe6, 0x88, 0xc6, 0xa1, 0xbb, 0xd0, 0x62, 0x05, 0x83, 0xc1, 0x91, 0x85,
0xdf, 0xa1, 0xfe, 0xfb, 0x55, 0x80, 0xa4, 0x8d, 0x64, 0x67, 0x89, 0xcd, 0x73, 0x23, 0x4e, 0x41, 0x8f, 0xa3, 0xf3, 0xda, 0xab, 0x52, 0xd7, 0x4c, 0xfb, 0x7d, 0x68, 0xe1, 0x63, 0xbd, 0x69, 0xc7,
0x48, 0x2c, 0x21, 0x47, 0xae, 0xe2, 0x13, 0x19, 0xc9, 0xc9, 0x87, 0x65, 0x87, 0x11, 0xe7, 0xcb, 0xbf, 0x03, 0xed, 0x0f, 0x2b, 0x00, 0x49, 0x1b, 0xc9, 0xce, 0x12, 0x9b, 0xe7, 0x46, 0x9c, 0x82,
0xf5, 0x93, 0x69, 0x11, 0x2c, 0x22, 0x22, 0xe3, 0x3a, 0x13, 0x26, 0x10, 0xf4, 0x0a, 0xa0, 0x51, 0x90, 0x58, 0x42, 0x8c, 0x5c, 0xa3, 0x4f, 0xa4, 0x27, 0xe7, 0x25, 0xa6, 0x15, 0x84, 0x9c, 0x2f,
0xe0, 0x1f, 0xd9, 0xde, 0x28, 0x9d, 0x6f, 0xb0, 0xb4, 0x64, 0x89, 0xb7, 0xa4, 0x12, 0x8e, 0x1f, 0x37, 0x4f, 0xa7, 0x25, 0x62, 0x11, 0x11, 0x19, 0xd7, 0x99, 0x20, 0x81, 0xa0, 0x57, 0x00, 0x8d,
0x81, 0x96, 0xe9, 0x2e, 0x58, 0x72, 0x73, 0x06, 0x19, 0xf7, 0xa4, 0xb9, 0xb8, 0xfa, 0x76, 0x65, 0x7c, 0xef, 0xd8, 0x72, 0x47, 0xe9, 0x7c, 0x83, 0xa5, 0x25, 0x8b, 0xbc, 0x25, 0x95, 0x70, 0xfc,
0x0c, 0xf4, 0x98, 0xf5, 0x81, 0x19, 0x8c, 0xb0, 0x90, 0x28, 0x8f, 0xc3, 0x64, 0x60, 0x7f, 0x00, 0x08, 0xd4, 0x4c, 0xf7, 0x88, 0x25, 0xb7, 0x67, 0x90, 0xf1, 0x40, 0x98, 0x8b, 0xab, 0x6f, 0x57,
0x5a, 0x76, 0x55, 0x8a, 0x43, 0xd0, 0x57, 0x65, 0x45, 0x3f, 0xc9, 0x1f, 0x91, 0x69, 0x52, 0xaa, 0xc4, 0x40, 0x0f, 0x67, 0xf7, 0x0c, 0x7f, 0x84, 0x23, 0x89, 0xf2, 0x38, 0x4c, 0x04, 0xf6, 0x07,
0xde, 0x37, 0x61, 0x45, 0x45, 0xaf, 0x02, 0xc9, 0x99, 0xad, 0xe9, 0xad, 0x38, 0x24, 0xa6, 0x72, 0xa0, 0x66, 0x57, 0x25, 0x39, 0x3a, 0x7d, 0x55, 0x54, 0xf4, 0xd3, 0xfc, 0x11, 0x99, 0x26, 0xa5,
0x98, 0xb6, 0xcb, 0xa4, 0x0a, 0xcf, 0x65, 0xa9, 0xf0, 0xac, 0xff, 0x7a, 0x05, 0x50, 0x5e, 0xfd, 0xea, 0x7d, 0x03, 0x96, 0x65, 0xf4, 0x4a, 0x90, 0x9c, 0xdb, 0x9a, 0xde, 0x8a, 0x43, 0x62, 0x2a,
0x51, 0x07, 0xca, 0xf1, 0x24, 0xe5, 0xed, 0xad, 0x8c, 0xba, 0x95, 0x73, 0xea, 0x76, 0x11, 0x1a, 0x87, 0x69, 0xbb, 0x4c, 0xaa, 0xf0, 0x5c, 0x12, 0x0a, 0xcf, 0xda, 0x6f, 0x96, 0x01, 0xe5, 0xd5,
0xf1, 0xae, 0xcf, 0x5d, 0x7c, 0x02, 0x48, 0x2b, 0x63, 0x55, 0x56, 0xc6, 0x14, 0x61, 0x35, 0xb9, 0x1f, 0x75, 0xa0, 0x14, 0x4f, 0x52, 0xda, 0xda, 0xcc, 0xa8, 0x5b, 0x29, 0xa7, 0x6e, 0x97, 0xa1,
0x22, 0x7e, 0x03, 0x56, 0x1c, 0x33, 0x8c, 0x06, 0xac, 0xf0, 0x1e, 0xd9, 0x2e, 0x0e, 0x23, 0xd3, 0x11, 0xef, 0xfa, 0xdc, 0xc5, 0x27, 0x80, 0xb4, 0x32, 0x56, 0x44, 0x65, 0x4c, 0x11, 0x56, 0x15,
0x1d, 0x53, 0x51, 0x56, 0x0d, 0x44, 0xda, 0xb6, 0x48, 0xd3, 0x03, 0xd1, 0x82, 0x1e, 0x88, 0xe8, 0x2b, 0xe2, 0xb7, 0x60, 0xd9, 0x36, 0x82, 0x70, 0xc0, 0x0a, 0xef, 0xa1, 0xe5, 0xe0, 0x20, 0x34,
0x9a, 0xf8, 0x5e, 0x7e, 0xbd, 0xe0, 0xd5, 0x62, 0xe6, 0x9e, 0x94, 0xbb, 0x99, 0x46, 0x35, 0xe2, 0x9c, 0x31, 0x15, 0x65, 0x45, 0x47, 0xa4, 0x6d, 0x93, 0x34, 0xed, 0x45, 0x2d, 0x68, 0x2f, 0x8a,
0xb0, 0xb3, 0xff, 0x09, 0x74, 0xe4, 0x46, 0x85, 0xf8, 0x6e, 0xc9, 0xe2, 0x2b, 0x12, 0xd8, 0xa6, 0xae, 0x89, 0xef, 0xe5, 0x97, 0x12, 0x5e, 0x2d, 0x66, 0xee, 0x49, 0xb9, 0x9b, 0x69, 0x54, 0x23,
0x64, 0x78, 0x00, 0x28, 0xef, 0x3c, 0xd2, 0x3c, 0x2b, 0xc9, 0x3c, 0x9b, 0x25, 0x8b, 0x14, 0x4f, 0x0e, 0x3b, 0xfb, 0x9f, 0x40, 0x47, 0x6c, 0x94, 0x88, 0xef, 0x8e, 0x28, 0xbe, 0x22, 0x81, 0x6d,
0x2b, 0xb2, 0xb0, 0xff, 0xac, 0x02, 0x28, 0x89, 0xe0, 0xe2, 0xe3, 0xee, 0x22, 0x61, 0xcf, 0x75, 0x4a, 0x86, 0x87, 0x80, 0xf2, 0xce, 0x23, 0xcd, 0x33, 0x45, 0xe4, 0xd9, 0x2c, 0x59, 0xa4, 0x78,
0x58, 0xce, 0xc7, 0x77, 0x22, 0xa8, 0x45, 0xb9, 0xe8, 0x4e, 0x15, 0x89, 0x55, 0x54, 0x97, 0x4b, 0x5a, 0x16, 0x85, 0xfd, 0xe7, 0x65, 0x40, 0x49, 0x04, 0x17, 0x1f, 0x92, 0x17, 0x09, 0x7b, 0x6e,
0x5f, 0x8b, 0xdd, 0x3d, 0x0b, 0x57, 0x2f, 0x4f, 0x3d, 0xcf, 0x90, 0x3d, 0xfe, 0x0f, 0xb3, 0x97, 0xc2, 0x52, 0x3e, 0xbe, 0x8b, 0x82, 0x5a, 0x94, 0x8b, 0xee, 0x64, 0x91, 0x58, 0x59, 0x76, 0x25,
0x52, 0x99, 0xff, 0xb8, 0xa5, 0x74, 0xcd, 0xb9, 0x25, 0xcf, 0xbc, 0x91, 0x2a, 0x05, 0xd2, 0x0b, 0xf5, 0xb5, 0xd8, 0xdd, 0xb3, 0x70, 0xf5, 0xea, 0xd4, 0xf3, 0x0c, 0xd1, 0xe3, 0xff, 0x30, 0x7b,
0xa7, 0x09, 0xa4, 0xe7, 0xbf, 0x42, 0xfa, 0x1f, 0x65, 0x58, 0x8a, 0x19, 0x79, 0x2a, 0x21, 0xcd, 0x95, 0x95, 0xf9, 0x8f, 0x3b, 0x52, 0xd7, 0x9c, 0x5b, 0xf2, 0xcc, 0x7b, 0xac, 0x42, 0x20, 0x5d,
0xbe, 0x99, 0xf0, 0x94, 0xa5, 0xf2, 0xb1, 0x5a, 0x2a, 0xdf, 0x3e, 0x31, 0x99, 0x29, 0x2a, 0x94, 0x3b, 0x4b, 0x20, 0x3d, 0xff, 0xc5, 0xd3, 0x9f, 0x95, 0x60, 0x31, 0x66, 0xe4, 0x99, 0x84, 0x34,
0xf9, 0x39, 0xfb, 0x19, 0x2c, 0xf2, 0xb2, 0x74, 0xce, 0xc1, 0x15, 0x29, 0x17, 0xac, 0x40, 0x8d, 0xfb, 0x3e, 0xc3, 0x53, 0x96, 0xca, 0xc7, 0x72, 0xa9, 0x7c, 0xfb, 0xd4, 0x64, 0xa6, 0xa8, 0x50,
0xf8, 0x53, 0x51, 0x53, 0x64, 0x1f, 0x8c, 0xa5, 0xe9, 0x2b, 0xca, 0xdc, 0xc7, 0xb5, 0xa5, 0x1b, 0xe6, 0xe7, 0xec, 0x67, 0xb0, 0xc0, 0xcb, 0xd2, 0x39, 0x07, 0x57, 0xa4, 0x5c, 0xb0, 0x0c, 0x55,
0xca, 0xfa, 0x6f, 0x55, 0x00, 0x76, 0x8f, 0xbd, 0xe1, 0x6d, 0x66, 0xa4, 0x37, 0xa0, 0x3a, 0xeb, 0xe2, 0x4f, 0xa3, 0x9a, 0x22, 0xfb, 0x60, 0x2c, 0x4d, 0x5f, 0x6c, 0xe6, 0x3e, 0xae, 0x2d, 0xdc,
0x42, 0x1b, 0xe9, 0x4d, 0x75, 0x8b, 0xf6, 0x2c, 0x20, 0x5c, 0xa9, 0x20, 0x52, 0xc9, 0x16, 0x44, 0x6b, 0xd6, 0x7e, 0xa7, 0x0c, 0xb0, 0x7b, 0xe2, 0x0e, 0xef, 0x32, 0x23, 0xbd, 0x05, 0x95, 0x59,
0xa6, 0x95, 0x32, 0xa6, 0xbb, 0xe0, 0x6f, 0x43, 0x95, 0xba, 0x52, 0x76, 0xdf, 0xab, 0xd0, 0xa9, 0xd7, 0xe0, 0x48, 0x6f, 0xaa, 0x5b, 0xb4, 0x67, 0x01, 0xe1, 0x0a, 0x05, 0x91, 0x72, 0xb6, 0x20,
0x30, 0x1d, 0x80, 0xd6, 0x40, 0x6c, 0xc9, 0xdb, 0x1e, 0xdb, 0x73, 0xa9, 0x3b, 0xae, 0x18, 0x59, 0x32, 0xad, 0x94, 0x31, 0xdd, 0x05, 0x7f, 0x1b, 0x2a, 0xd4, 0x95, 0xb2, 0x5b, 0x62, 0x85, 0x4e,
0x30, 0x7a, 0x01, 0x3a, 0xac, 0x10, 0x16, 0x77, 0x64, 0x39, 0x5d, 0x06, 0x9a, 0xdf, 0xd1, 0x1b, 0x85, 0xe9, 0x00, 0xb4, 0x0a, 0xd1, 0x96, 0xbc, 0xe5, 0xb2, 0x3d, 0x97, 0xba, 0xe3, 0xb2, 0x9e,
0x8a, 0x1d, 0x9d, 0xe0, 0xb5, 0x02, 0x7f, 0x3c, 0x4e, 0x4d, 0xc7, 0x2a, 0x21, 0x59, 0xb0, 0xfe, 0x05, 0xa3, 0x17, 0xa0, 0xc3, 0x0a, 0x61, 0x71, 0x47, 0x96, 0xd3, 0x65, 0xa0, 0xf9, 0x1d, 0xbd,
0x79, 0x19, 0x2e, 0x10, 0xfe, 0x3e, 0x99, 0xa8, 0xbc, 0x88, 0xf2, 0xa4, 0xfc, 0x79, 0x45, 0xf6, 0x21, 0xd9, 0xd1, 0x09, 0x5e, 0xd3, 0xf7, 0xc6, 0xe3, 0xd4, 0x74, 0xac, 0x12, 0x92, 0x05, 0x6b,
0xe7, 0xb7, 0x60, 0x91, 0x95, 0x5b, 0x44, 0x7c, 0x79, 0x79, 0x9a, 0x36, 0x30, 0xdd, 0x31, 0x44, 0x9f, 0x97, 0xe0, 0x12, 0xe1, 0xef, 0x93, 0x89, 0xca, 0x8b, 0x28, 0x4f, 0xca, 0x9f, 0x97, 0x45,
0xf7, 0x79, 0x73, 0x76, 0xe9, 0xcc, 0x7c, 0x61, 0xbe, 0x33, 0xf3, 0xc5, 0x6c, 0x51, 0x36, 0xa5, 0x7f, 0x7e, 0x07, 0x16, 0x58, 0xb9, 0x25, 0x8a, 0x2f, 0xaf, 0x4e, 0xd3, 0x06, 0xa6, 0x3b, 0x7a,
0x56, 0x75, 0x79, 0x17, 0x7a, 0x08, 0x6d, 0x23, 0x6d, 0x1a, 0x08, 0x41, 0x35, 0x75, 0xc5, 0x95, 0xd4, 0x7d, 0xde, 0x9c, 0x5d, 0x38, 0x33, 0xaf, 0xcd, 0x77, 0x66, 0xbe, 0x90, 0x2d, 0xca, 0xa6,
0xfe, 0xa6, 0x69, 0xb6, 0x39, 0x36, 0x87, 0x76, 0x74, 0x4c, 0xd9, 0x59, 0x33, 0xe2, 0x6f, 0xb5, 0xd4, 0xaa, 0x2e, 0xee, 0x42, 0x0f, 0xa1, 0xad, 0xa7, 0x4d, 0x03, 0x21, 0xa8, 0xa4, 0x2e, 0xc6,
0x1d, 0xea, 0xff, 0x5b, 0x82, 0xf3, 0xe2, 0x50, 0x95, 0x5b, 0xf9, 0xd9, 0x25, 0xba, 0x01, 0xab, 0xd2, 0xdf, 0x34, 0xcd, 0x36, 0xc6, 0xc6, 0xd0, 0x0a, 0x4f, 0x28, 0x3b, 0xab, 0x7a, 0xfc, 0x2d,
0xdc, 0xa4, 0x33, 0xb6, 0xcd, 0x82, 0xe9, 0x65, 0x06, 0x93, 0x97, 0xb1, 0x01, 0xab, 0x11, 0xd5, 0xb7, 0x43, 0xed, 0x7f, 0x15, 0xb8, 0x18, 0x1d, 0xaa, 0x72, 0x2b, 0x3f, 0xbf, 0x44, 0xd7, 0x61,
0xae, 0xec, 0x18, 0x26, 0xef, 0x65, 0xd6, 0x28, 0x8f, 0x29, 0x72, 0xa8, 0xfd, 0x0c, 0xbb, 0xb3, 0x85, 0x9b, 0x74, 0xc6, 0xb6, 0x59, 0x30, 0xbd, 0xc4, 0x60, 0xe2, 0x32, 0xd6, 0x61, 0x25, 0xa4,
0xc5, 0x59, 0xcb, 0x8d, 0x14, 0xbc, 0x89, 0xcb, 0x57, 0xa9, 0x1f, 0xc1, 0x45, 0x76, 0xc9, 0x7c, 0xda, 0x95, 0x1d, 0xc3, 0xe4, 0xbd, 0xc4, 0x1a, 0xc5, 0x31, 0x45, 0x0e, 0xb5, 0x9f, 0x61, 0x37,
0x4f, 0xa6, 0x68, 0xae, 0x33, 0x0d, 0xe5, 0xba, 0x33, 0x3e, 0xed, 0x4f, 0x4b, 0x70, 0x69, 0x0a, 0xbd, 0x38, 0x6b, 0xb9, 0x91, 0x82, 0x3b, 0x71, 0xf8, 0x2a, 0xb5, 0x63, 0xb8, 0xcc, 0xae, 0xa6,
0xe6, 0x79, 0xb2, 0xb9, 0xf7, 0x94, 0xd8, 0xa7, 0xe4, 0xde, 0x12, 0x5e, 0x76, 0x61, 0x41, 0x26, 0xef, 0x8b, 0x14, 0xcd, 0x75, 0xa6, 0x21, 0x5d, 0x77, 0xc6, 0xa7, 0xfd, 0x99, 0x02, 0x57, 0xa6,
0xf2, 0xf3, 0x2a, 0x2c, 0xe5, 0x3a, 0x9d, 0x5a, 0xe7, 0x5e, 0x06, 0x44, 0x84, 0x10, 0x3f, 0xa8, 0x60, 0x9e, 0x27, 0x9b, 0x7b, 0x4f, 0x8a, 0x7d, 0x4a, 0xee, 0x2d, 0xe0, 0x65, 0x17, 0x16, 0x44,
0xa4, 0xe5, 0x0c, 0xbe, 0x79, 0x6a, 0xde, 0xc4, 0x8d, 0x1f, 0x53, 0xee, 0xf8, 0x16, 0x46, 0x36, 0x22, 0x3f, 0xaf, 0xc0, 0x62, 0xae, 0xd3, 0x99, 0x75, 0xee, 0x65, 0x40, 0x44, 0x08, 0xf1, 0x33,
0xeb, 0xcd, 0x4e, 0x34, 0x62, 0xc9, 0x55, 0xa7, 0xbf, 0x9b, 0xc9, 0x11, 0xb8, 0xbe, 0x33, 0x71, 0x4c, 0x5a, 0xce, 0xe0, 0x9b, 0xa7, 0xea, 0x4e, 0x9c, 0xf8, 0x09, 0xe6, 0xb6, 0x67, 0x62, 0x64,
0xd9, 0xe1, 0x07, 0x97, 0x32, 0xdb, 0x10, 0x09, 0x2a, 0x09, 0x8c, 0xf6, 0x61, 0x89, 0xde, 0xe8, 0xb1, 0xde, 0xec, 0x44, 0x23, 0x96, 0x5c, 0x65, 0xfa, 0x6b, 0x9b, 0x1c, 0x81, 0x6b, 0xdb, 0x13,
0x9b, 0x44, 0x23, 0x9f, 0x24, 0x54, 0x94, 0x2e, 0xb6, 0xed, 0x7e, 0xb7, 0x30, 0xa6, 0x0f, 0xf8, 0x87, 0x1d, 0x7e, 0x70, 0x29, 0xb3, 0x0d, 0x91, 0xa0, 0x12, 0xc0, 0xe8, 0x00, 0x16, 0xe9, 0x3d,
0x68, 0x42, 0x3c, 0xcf, 0xa9, 0x3c, 0x19, 0x2a, 0xf0, 0xd8, 0xde, 0xd0, 0x77, 0x63, 0x3c, 0x0b, 0xc0, 0x49, 0x38, 0xf2, 0x48, 0x42, 0x45, 0xe9, 0x62, 0xdb, 0xee, 0x77, 0x0b, 0x63, 0xfa, 0x80,
0xa7, 0xc4, 0xb3, 0xcd, 0x47, 0xcb, 0x78, 0xd2, 0xd0, 0xfe, 0x26, 0xac, 0x2a, 0x97, 0x3e, 0x6b, 0x8f, 0x26, 0xc4, 0xf3, 0x9c, 0xca, 0x15, 0xa1, 0x11, 0x1e, 0xcb, 0x1d, 0x7a, 0x4e, 0x8c, 0xa7,
0xa3, 0xaf, 0xa5, 0x33, 0xaf, 0x3b, 0xb0, 0xa2, 0x5a, 0xd5, 0x19, 0xe6, 0xc8, 0x51, 0x7c, 0x9a, 0x76, 0x46, 0x3c, 0x5b, 0x7c, 0xb4, 0x88, 0x27, 0x0d, 0xed, 0x6f, 0xc0, 0x8a, 0x74, 0xe9, 0xb3,
0x39, 0xf4, 0xbf, 0x2c, 0x43, 0x7b, 0x0b, 0x3b, 0x38, 0xc2, 0x4f, 0xf7, 0xcc, 0x39, 0x77, 0x80, 0x36, 0xfa, 0x6a, 0x3a, 0xf3, 0xba, 0x07, 0xcb, 0xb2, 0x55, 0x9d, 0x63, 0x8e, 0x1c, 0xc5, 0x67,
0x5e, 0xc9, 0x1f, 0xa0, 0xe7, 0x6e, 0x03, 0x54, 0x15, 0xb7, 0x01, 0x2e, 0xc5, 0x97, 0x20, 0xc8, 0x99, 0x43, 0xfb, 0xab, 0x12, 0xb4, 0x37, 0xb1, 0x8d, 0x43, 0xfc, 0x74, 0xcf, 0x9c, 0x73, 0x07,
0x2c, 0x35, 0x39, 0x86, 0xb0, 0xd0, 0xeb, 0xd0, 0x1a, 0x07, 0xb6, 0x6b, 0x06, 0xc7, 0x83, 0x47, 0xe8, 0xe5, 0xfc, 0x01, 0x7a, 0xee, 0x36, 0x40, 0x45, 0x72, 0x1b, 0xe0, 0x4a, 0x7c, 0x09, 0x82,
0xf8, 0x38, 0xe4, 0x9b, 0x46, 0x4f, 0xb9, 0xed, 0x6c, 0x6f, 0x85, 0x46, 0x93, 0xf7, 0x7e, 0x17, 0xcc, 0x52, 0x15, 0x63, 0x08, 0x13, 0xbd, 0x0e, 0xad, 0xb1, 0x6f, 0x39, 0x86, 0x7f, 0x32, 0x78,
0x1f, 0xd3, 0x0b, 0x16, 0x71, 0x1a, 0xc7, 0xee, 0xe0, 0x55, 0x8d, 0x14, 0xe4, 0xda, 0x4b, 0xd0, 0x84, 0x4f, 0x02, 0xbe, 0x69, 0xf4, 0xa4, 0xdb, 0xce, 0xd6, 0x66, 0xa0, 0x37, 0x79, 0xef, 0x77,
0x88, 0x2f, 0x2e, 0xa1, 0x3a, 0x54, 0xef, 0x4e, 0x1c, 0x47, 0x3b, 0x87, 0x1a, 0x50, 0xa3, 0x89, 0xf1, 0x09, 0xbd, 0x60, 0x11, 0xa7, 0x71, 0xec, 0xe6, 0x5e, 0x45, 0x4f, 0x41, 0x6e, 0xbc, 0x04,
0x9e, 0x56, 0x22, 0x3f, 0x69, 0xec, 0xa7, 0x95, 0xaf, 0xfd, 0x12, 0x34, 0xe2, 0x0b, 0x14, 0xa8, 0x8d, 0xf8, 0xe2, 0x12, 0xaa, 0x43, 0xe5, 0xfe, 0xc4, 0xb6, 0xd5, 0x0b, 0xa8, 0x01, 0x55, 0x9a,
0x09, 0x8b, 0x0f, 0xbd, 0x77, 0x3d, 0xff, 0xc8, 0xd3, 0xce, 0xa1, 0x45, 0xa8, 0xdc, 0x76, 0x1c, 0xe8, 0xa9, 0x0a, 0xf9, 0x49, 0x63, 0x3f, 0xb5, 0x74, 0xe3, 0x57, 0xa0, 0x11, 0x5f, 0xa0, 0x40,
0xad, 0x84, 0xda, 0xd0, 0xd8, 0x8d, 0x02, 0x6c, 0x12, 0xf1, 0x69, 0x65, 0xd4, 0x01, 0x78, 0xc7, 0x4d, 0x58, 0x78, 0xe8, 0xbe, 0xeb, 0x7a, 0xc7, 0xae, 0x7a, 0x01, 0x2d, 0x40, 0xf9, 0xae, 0x6d,
0x0e, 0x23, 0x3f, 0xb0, 0x87, 0xa6, 0xa3, 0x55, 0xae, 0x7d, 0x06, 0x1d, 0xb9, 0x9e, 0x8e, 0x5a, 0xab, 0x0a, 0x6a, 0x43, 0x63, 0x37, 0xf4, 0xb1, 0x41, 0xc4, 0xa7, 0x96, 0x50, 0x07, 0xe0, 0x1d,
0x50, 0xdf, 0xf1, 0xa3, 0xb7, 0x3f, 0xb5, 0xc3, 0x48, 0x3b, 0x47, 0xfa, 0xef, 0xf8, 0xd1, 0xfd, 0x2b, 0x08, 0x3d, 0xdf, 0x1a, 0x1a, 0xb6, 0x5a, 0xbe, 0xf1, 0x19, 0x74, 0xc4, 0x7a, 0x3a, 0x6a,
0x00, 0x87, 0xd8, 0x8b, 0xb4, 0x12, 0x02, 0x58, 0xf8, 0xc0, 0xdb, 0xb2, 0xc3, 0x47, 0x5a, 0x19, 0x41, 0x7d, 0xdb, 0x0b, 0xdf, 0xfe, 0xd4, 0x0a, 0x42, 0xf5, 0x02, 0xe9, 0xbf, 0xed, 0x85, 0x3b,
0x2d, 0xf3, 0xa3, 0x32, 0xd3, 0xd9, 0xe6, 0x45, 0x6a, 0xad, 0x42, 0x86, 0xc7, 0x5f, 0x55, 0xa4, 0x3e, 0x0e, 0xb0, 0x1b, 0xaa, 0x0a, 0x02, 0xa8, 0x7d, 0xe0, 0x6e, 0x5a, 0xc1, 0x23, 0xb5, 0x84,
0x41, 0x2b, 0xee, 0x72, 0xef, 0xfe, 0x43, 0xad, 0xc6, 0xa8, 0x27, 0x3f, 0x17, 0xae, 0x59, 0xa0, 0x96, 0xf8, 0x51, 0x99, 0x61, 0x6f, 0xf1, 0x22, 0xb5, 0x5a, 0x26, 0xc3, 0xe3, 0xaf, 0x0a, 0x52,
0x65, 0x8f, 0x78, 0xc9, 0x9c, 0x6c, 0x11, 0x31, 0x48, 0x3b, 0x47, 0x56, 0xc6, 0xcf, 0xd8, 0xb5, 0xa1, 0x15, 0x77, 0x79, 0xb0, 0xf3, 0x50, 0xad, 0x32, 0xea, 0xc9, 0xcf, 0xda, 0x0d, 0x13, 0xd4,
0x12, 0xea, 0x42, 0x33, 0x75, 0x62, 0xad, 0x95, 0x09, 0xe0, 0x5e, 0x30, 0x1e, 0x72, 0xdd, 0x62, 0xec, 0x11, 0x2f, 0x99, 0x93, 0x2d, 0x22, 0x06, 0xa9, 0x17, 0xc8, 0xca, 0xf8, 0x19, 0xbb, 0xaa,
0x24, 0x10, 0x45, 0xdd, 0x22, 0x9c, 0xa8, 0x5e, 0xbb, 0x03, 0x75, 0x91, 0x9f, 0x90, 0xae, 0x9c, 0xa0, 0x2e, 0x34, 0x53, 0x27, 0xd6, 0x6a, 0x89, 0x00, 0x1e, 0xf8, 0xe3, 0x21, 0xd7, 0x2d, 0x46,
0x45, 0xe4, 0x53, 0x3b, 0x87, 0x96, 0xa0, 0x2d, 0x3d, 0xd6, 0xd3, 0x4a, 0x08, 0x41, 0x47, 0x7e, 0x02, 0x51, 0xd4, 0x4d, 0xc2, 0x89, 0xca, 0x8d, 0x7b, 0x50, 0x8f, 0xf2, 0x13, 0xd2, 0x95, 0xb3,
0x4e, 0xab, 0x95, 0xaf, 0x6d, 0x00, 0x24, 0x71, 0x3e, 0x21, 0x67, 0xdb, 0x3b, 0x34, 0x1d, 0xdb, 0x88, 0x7c, 0xaa, 0x17, 0xd0, 0x22, 0xb4, 0x85, 0x27, 0x7e, 0xaa, 0x82, 0x10, 0x74, 0xc4, 0x47,
0x62, 0xb4, 0x91, 0x26, 0xc2, 0x5d, 0xca, 0x1d, 0x66, 0xb3, 0x5a, 0xf9, 0xda, 0x9b, 0x50, 0x17, 0xb8, 0x6a, 0xe9, 0xc6, 0x3a, 0x40, 0x12, 0xe7, 0x13, 0x72, 0xb6, 0xdc, 0x23, 0xc3, 0xb6, 0x4c,
0xb1, 0x2b, 0x81, 0x1b, 0xd8, 0xf5, 0x0f, 0x31, 0x93, 0xcc, 0x2e, 0x8e, 0x98, 0x1c, 0x6f, 0xbb, 0x46, 0x1b, 0x69, 0x22, 0xdc, 0xa5, 0xdc, 0x61, 0x36, 0xab, 0x96, 0x6e, 0xbc, 0x09, 0xf5, 0x28,
0xd8, 0xb3, 0xb4, 0x32, 0x21, 0xe3, 0xe1, 0xd8, 0x32, 0x23, 0x71, 0xe9, 0x51, 0xab, 0x6c, 0xfc, 0x76, 0x25, 0x70, 0x1d, 0x3b, 0xde, 0x11, 0x66, 0x92, 0xd9, 0xc5, 0x21, 0x93, 0xe3, 0x5d, 0x07,
0xd7, 0x32, 0x00, 0x3b, 0xb3, 0xf5, 0xfd, 0xc0, 0x42, 0x0e, 0xbd, 0xbb, 0xb1, 0xe9, 0xbb, 0x63, 0xbb, 0xa6, 0x5a, 0x22, 0x64, 0x3c, 0x1c, 0x9b, 0x46, 0x18, 0x5d, 0x67, 0x55, 0xcb, 0xeb, 0xff,
0xdf, 0x13, 0x07, 0x4a, 0x21, 0x5a, 0xcf, 0x94, 0x48, 0xd8, 0x47, 0xbe, 0x23, 0xe7, 0x4d, 0xff, 0xb5, 0x04, 0xc0, 0xce, 0x6c, 0x3d, 0xcf, 0x37, 0x91, 0x4d, 0xef, 0x6e, 0x6c, 0x78, 0xce, 0xd8,
0x39, 0x65, 0xff, 0x4c, 0x67, 0xfd, 0x1c, 0x72, 0x29, 0xb6, 0x07, 0xb6, 0x8b, 0x1f, 0xd8, 0xc3, 0x73, 0xa3, 0x03, 0xa5, 0x00, 0xad, 0x65, 0x4a, 0x24, 0xec, 0x23, 0xdf, 0x91, 0xf3, 0xa6, 0xff,
0x47, 0xf1, 0x41, 0xef, 0xf4, 0x67, 0xae, 0x99, 0xae, 0x02, 0xdf, 0x55, 0x25, 0xbe, 0xdd, 0x28, 0x9c, 0xb4, 0x7f, 0xa6, 0xb3, 0x76, 0x01, 0x39, 0x14, 0xdb, 0x9e, 0xe5, 0xe0, 0x3d, 0x6b, 0xf8,
0xb0, 0xbd, 0x91, 0xd8, 0x1d, 0xf5, 0x73, 0xe8, 0x71, 0xe6, 0x91, 0xad, 0x40, 0xb8, 0x51, 0xe4, 0x28, 0x3e, 0xe8, 0x9d, 0xfe, 0x38, 0x36, 0xd3, 0x35, 0xc2, 0x77, 0x5d, 0x8a, 0x6f, 0x37, 0xf4,
0x5d, 0xed, 0xd9, 0x50, 0x3a, 0xd0, 0xcd, 0xfc, 0x9b, 0x01, 0xba, 0xa6, 0x7e, 0xad, 0xa4, 0xfa, 0x2d, 0x77, 0x14, 0xed, 0x8e, 0xda, 0x05, 0xf4, 0x38, 0xf3, 0x34, 0x37, 0x42, 0xb8, 0x5e, 0xe4,
0xe7, 0x85, 0xfe, 0x4b, 0x85, 0xfa, 0xc6, 0xd8, 0x6c, 0xe8, 0xc8, 0xcf, 0xf0, 0xd1, 0x37, 0xa6, 0x35, 0xee, 0xf9, 0x50, 0xda, 0xd0, 0xcd, 0xfc, 0x07, 0x02, 0xba, 0x21, 0x7f, 0xe3, 0x24, 0xfb,
0x4d, 0x90, 0x7b, 0x2f, 0xd9, 0xbf, 0x56, 0xa4, 0x6b, 0x8c, 0xea, 0x23, 0xa6, 0xbe, 0xb3, 0x50, 0xbf, 0x86, 0xfe, 0x4b, 0x85, 0xfa, 0xc6, 0xd8, 0x2c, 0xe8, 0x88, 0x8f, 0xf7, 0xd1, 0x37, 0xa6,
0x29, 0x9f, 0xa8, 0xf6, 0x4f, 0x0a, 0x4c, 0xf4, 0x73, 0xe8, 0x13, 0x12, 0x43, 0x64, 0x5e, 0x75, 0x4d, 0x90, 0x7b, 0x65, 0xd9, 0xbf, 0x51, 0xa4, 0x6b, 0x8c, 0xea, 0x23, 0xa6, 0xbe, 0xb3, 0x50,
0xa2, 0x97, 0xd5, 0xfb, 0x9e, 0xfa, 0xf1, 0xe7, 0x2c, 0x0c, 0x1f, 0x65, 0x8d, 0x6f, 0x3a, 0xf5, 0x49, 0x1f, 0xb6, 0xf6, 0x4f, 0x0b, 0x4c, 0xb4, 0x0b, 0xe8, 0x13, 0x12, 0x43, 0x64, 0xde, 0x82,
0xb9, 0xe7, 0xe2, 0xc5, 0xa9, 0x4f, 0x4d, 0x7f, 0x12, 0xf5, 0xa7, 0xc6, 0xe0, 0xb0, 0x74, 0x4a, 0xa2, 0x97, 0xe5, 0xfb, 0x9e, 0xfc, 0xc9, 0xe8, 0x2c, 0x0c, 0x1f, 0x65, 0x8d, 0x6f, 0x3a, 0xf5,
0xf1, 0x9e, 0x2c, 0xab, 0xca, 0x49, 0x36, 0x33, 0xfd, 0xf1, 0xd9, 0x2c, 0x6c, 0x13, 0x6a, 0xa4, 0xb9, 0x47, 0xe6, 0xc5, 0xa9, 0x4f, 0x4d, 0x7f, 0x1a, 0xf5, 0x67, 0xc6, 0x60, 0xb3, 0x74, 0x4a,
0xd9, 0xcb, 0x0a, 0xaf, 0x4c, 0x39, 0x06, 0x51, 0x3f, 0x64, 0xed, 0xaf, 0x17, 0xed, 0x9e, 0xd6, 0xf2, 0x0a, 0x2d, 0xab, 0xca, 0x49, 0x36, 0x33, 0xfd, 0xc9, 0xda, 0x2c, 0x6c, 0x13, 0x6a, 0xa4,
0x65, 0xf9, 0xad, 0xa4, 0x5a, 0x44, 0xca, 0xf7, 0x9d, 0x6a, 0x5d, 0x56, 0x3f, 0xbd, 0xd4, 0xcf, 0xd9, 0xcb, 0x0a, 0xaf, 0x4c, 0x39, 0x06, 0x91, 0x3f, 0x7f, 0xed, 0xaf, 0x15, 0xed, 0x9e, 0xd6,
0xa1, 0x07, 0x92, 0xab, 0x47, 0x2f, 0x4c, 0x53, 0x05, 0xf9, 0xf6, 0xd2, 0x2c, 0xbe, 0xfd, 0x2a, 0x65, 0xf1, 0x85, 0xa5, 0x5c, 0x44, 0xd2, 0x57, 0xa1, 0x72, 0x5d, 0x96, 0x3f, 0xd8, 0xd4, 0x2e,
0x20, 0x66, 0xa9, 0xde, 0xbe, 0x3d, 0x9a, 0x04, 0x26, 0x53, 0xe3, 0x69, 0xce, 0x2d, 0xdf, 0x55, 0xa0, 0x3d, 0xc1, 0xd5, 0xa3, 0x17, 0xa6, 0xa9, 0x82, 0x78, 0x7b, 0x69, 0x16, 0xdf, 0x7e, 0x1d,
0xa0, 0xf9, 0xe6, 0x29, 0x46, 0xc4, 0x4b, 0x1a, 0x00, 0xdc, 0xc3, 0xd1, 0xfb, 0xf4, 0xd1, 0x5c, 0x10, 0xb3, 0x54, 0xf7, 0xc0, 0x1a, 0x4d, 0x7c, 0x83, 0xa9, 0xf1, 0x34, 0xe7, 0x96, 0xef, 0x1a,
0x98, 0x5d, 0x51, 0xe2, 0xbf, 0x79, 0x07, 0x81, 0xea, 0xc5, 0x99, 0xfd, 0x62, 0x04, 0x7b, 0xd0, 0xa1, 0xf9, 0xe6, 0x19, 0x46, 0xc4, 0x4b, 0x1a, 0x00, 0x3c, 0xc0, 0xe1, 0xfb, 0xf4, 0xa9, 0x5d,
0xbc, 0x47, 0xf2, 0x2b, 0x1a, 0x33, 0x86, 0x68, 0xea, 0x48, 0xd1, 0x43, 0xa0, 0x58, 0x9b, 0xdd, 0x90, 0x5d, 0x51, 0xe2, 0xbf, 0x79, 0x87, 0x08, 0xd5, 0x8b, 0x33, 0xfb, 0xc5, 0x08, 0xf6, 0xa1,
0x31, 0xed, 0x3c, 0x33, 0xef, 0x46, 0xd1, 0x54, 0xc1, 0xe6, 0x5f, 0xb3, 0xaa, 0x9d, 0xe7, 0x94, 0xf9, 0x80, 0xe4, 0x57, 0x34, 0x66, 0x0c, 0xd0, 0xd4, 0x91, 0x51, 0x8f, 0x08, 0xc5, 0xea, 0xec,
0x87, 0xa8, 0x6c, 0x45, 0xf4, 0x28, 0xee, 0x1d, 0x6c, 0x3a, 0xd1, 0xc1, 0x94, 0x15, 0xa5, 0x7a, 0x8e, 0x69, 0xe7, 0x99, 0x79, 0x6d, 0x8a, 0xa6, 0x0a, 0x36, 0xff, 0x06, 0x56, 0xee, 0x3c, 0xa7,
0x9c, 0xbc, 0x22, 0xa9, 0x63, 0x8c, 0x03, 0xc3, 0x32, 0xb3, 0x42, 0x39, 0x31, 0xbd, 0xae, 0x9e, 0x3c, 0x5f, 0x65, 0x2b, 0xa2, 0x47, 0x71, 0xef, 0x60, 0xc3, 0x0e, 0x0f, 0xa7, 0xac, 0x28, 0xd5,
0x22, 0xdf, 0xb3, 0xa0, 0xea, 0x99, 0xb0, 0xb4, 0x15, 0xf8, 0x63, 0x19, 0xc9, 0x2b, 0x4a, 0x24, 0xe3, 0xf4, 0x15, 0x09, 0x1d, 0x63, 0x1c, 0x18, 0x96, 0x98, 0x15, 0x8a, 0x89, 0xe9, 0x4d, 0xf9,
0xb9, 0x7e, 0x05, 0x51, 0x7c, 0x1f, 0x5a, 0x22, 0xff, 0xa7, 0x19, 0x8b, 0x9a, 0x0b, 0xe9, 0x2e, 0x14, 0xf9, 0x9e, 0x05, 0x55, 0xcf, 0x80, 0xc5, 0x4d, 0xdf, 0x1b, 0x8b, 0x48, 0x5e, 0x91, 0x22,
0x05, 0x27, 0xfe, 0x18, 0xba, 0x99, 0xc2, 0x82, 0x5a, 0xe8, 0xea, 0xea, 0xc3, 0xac, 0xd9, 0x8f, 0xc9, 0xf5, 0x2b, 0x88, 0xe2, 0xfb, 0xd0, 0x8a, 0xf2, 0x7f, 0x9a, 0xb1, 0xc8, 0xb9, 0x90, 0xee,
0x00, 0xd1, 0xc7, 0xc0, 0xf2, 0xff, 0x19, 0xa8, 0xe3, 0x9b, 0x7c, 0x47, 0x81, 0xe4, 0x7a, 0xe1, 0x52, 0x70, 0xe2, 0x8f, 0xa1, 0x9b, 0x29, 0x2c, 0xc8, 0x85, 0x2e, 0xaf, 0x3e, 0xcc, 0x9a, 0xfd,
0xfe, 0xb1, 0xe4, 0x7f, 0x0d, 0x56, 0x95, 0xc9, 0x7b, 0xd6, 0x21, 0xf0, 0xeb, 0xca, 0x27, 0x54, 0x18, 0x10, 0x7d, 0x42, 0x2c, 0xfe, 0x0b, 0x82, 0x3c, 0xbe, 0xc9, 0x77, 0x8c, 0x90, 0xdc, 0x2c,
0x18, 0xb2, 0x0e, 0xe1, 0xc4, 0x11, 0x02, 0xff, 0xc6, 0xbf, 0x23, 0x68, 0xd0, 0x38, 0x8f, 0x4a, 0xdc, 0x3f, 0x96, 0xfc, 0x6f, 0xc0, 0x8a, 0x34, 0x79, 0xcf, 0x3a, 0x04, 0x7e, 0x5d, 0xf9, 0x94,
0xeb, 0x17, 0x61, 0xde, 0x93, 0x0d, 0xf3, 0x3e, 0x86, 0x6e, 0xe6, 0x91, 0xaa, 0x5a, 0x69, 0xd5, 0x0a, 0x43, 0xd6, 0x21, 0x9c, 0x3a, 0x22, 0xc2, 0xbf, 0xfe, 0x1f, 0x08, 0x1a, 0x34, 0xce, 0xa3,
0x2f, 0x59, 0x0b, 0x44, 0x2b, 0xf2, 0xfb, 0x4e, 0xf5, 0x56, 0xa8, 0x7c, 0x03, 0x3a, 0x6b, 0xee, 0xd2, 0xfa, 0x65, 0x98, 0xf7, 0x64, 0xc3, 0xbc, 0x8f, 0xa1, 0x9b, 0x79, 0xda, 0x2a, 0x57, 0x5a,
0x0f, 0xd9, 0x03, 0xf0, 0xf8, 0x34, 0xf7, 0xc5, 0xa9, 0x87, 0x0f, 0xf2, 0xb5, 0xe3, 0x2f, 0x3e, 0xf9, 0xfb, 0xd7, 0x02, 0xd1, 0x8a, 0xf8, 0x2a, 0x54, 0xbe, 0x15, 0x4a, 0x5f, 0x8e, 0xce, 0x9a,
0x0a, 0xfa, 0x6a, 0x47, 0xa0, 0x1f, 0x43, 0x37, 0xf3, 0xb0, 0x47, 0xad, 0x31, 0xea, 0xd7, 0x3f, 0xfb, 0x43, 0xf6, 0x6c, 0x3c, 0x3e, 0xcd, 0x7d, 0x71, 0xea, 0xe1, 0x83, 0x78, 0xed, 0xf8, 0x8b,
0xb3, 0x66, 0xff, 0x39, 0x06, 0x4f, 0x16, 0x2c, 0x2b, 0xde, 0x51, 0xa0, 0xf5, 0x69, 0x81, 0xa8, 0x8f, 0x82, 0xbe, 0xda, 0x11, 0xe8, 0xc7, 0xd0, 0xcd, 0x3c, 0xec, 0x91, 0x6b, 0x8c, 0xfc, 0xf5,
0xfa, 0xc1, 0xc5, 0xec, 0x05, 0xb5, 0x25, 0x33, 0xcd, 0xee, 0x37, 0x09, 0x91, 0xd9, 0x3f, 0x42, 0xcf, 0xac, 0xd9, 0x7f, 0x81, 0xc1, 0x93, 0x09, 0x4b, 0x92, 0x77, 0x14, 0x68, 0x6d, 0x5a, 0x20,
0xea, 0xbf, 0x5c, 0xec, 0x5f, 0x93, 0xe2, 0x05, 0xed, 0xc2, 0x02, 0x7b, 0xee, 0x83, 0x9e, 0x55, 0x2a, 0x7f, 0x70, 0x31, 0x7b, 0x41, 0x6d, 0xc1, 0x4c, 0xb3, 0xfb, 0x4d, 0x42, 0x64, 0xf6, 0xef,
0x1f, 0xc2, 0xa4, 0x9e, 0x02, 0xf5, 0x67, 0x3d, 0x18, 0x0a, 0x27, 0x4e, 0x44, 0xe8, 0xff, 0x01, 0x93, 0xfa, 0x2f, 0x17, 0xfb, 0xaf, 0xa5, 0x78, 0x41, 0xbb, 0x50, 0x63, 0xcf, 0x7d, 0xd0, 0xb3,
0x74, 0x18, 0x28, 0x66, 0xd0, 0x13, 0x9c, 0x7c, 0x17, 0x6a, 0xd4, 0xb5, 0x23, 0xe5, 0x81, 0x42, 0xf2, 0x43, 0x98, 0xd4, 0x53, 0xa0, 0xfe, 0xac, 0x07, 0x43, 0xc1, 0xc4, 0x0e, 0x09, 0xfd, 0x3f,
0xfa, 0x51, 0x4f, 0x7f, 0xf6, 0x3b, 0x9e, 0x84, 0xe2, 0x26, 0x1d, 0xc9, 0xaa, 0x3a, 0x4f, 0x72, 0x80, 0x0e, 0x03, 0xc5, 0x0c, 0x7a, 0x82, 0x93, 0xef, 0x42, 0x95, 0xba, 0x76, 0x24, 0x3d, 0x50,
0xea, 0x1b, 0x25, 0xf4, 0x03, 0x68, 0xb3, 0xc9, 0x05, 0x37, 0x9e, 0x24, 0xe5, 0x43, 0x58, 0x4e, 0x48, 0x3f, 0xea, 0xe9, 0xcf, 0x7e, 0xc7, 0x93, 0x50, 0xdc, 0xa4, 0x23, 0x59, 0x55, 0xe7, 0x49,
0x51, 0xfe, 0x34, 0x50, 0xdc, 0x28, 0xfd, 0x3f, 0x8f, 0xee, 0x3f, 0xa5, 0x8f, 0x6a, 0xb2, 0xd7, 0x4e, 0x7d, 0x4b, 0x41, 0x3f, 0x80, 0x36, 0x9b, 0x3c, 0xe2, 0xc6, 0x93, 0xa4, 0x7c, 0x08, 0x4b,
0xc6, 0xd0, 0xfa, 0xe9, 0xee, 0xbe, 0xf5, 0xaf, 0x17, 0xee, 0x1f, 0x63, 0xfe, 0x11, 0x68, 0xd9, 0x29, 0xca, 0x9f, 0x06, 0x8a, 0x5b, 0xca, 0xff, 0xf3, 0xe8, 0xfe, 0x53, 0xfa, 0xa8, 0x26, 0x7b,
0xa3, 0x42, 0xf4, 0xd2, 0x34, 0x5f, 0xa2, 0xc2, 0x39, 0xc3, 0x91, 0x7c, 0x0f, 0x16, 0x58, 0x8d, 0x6d, 0x0c, 0xad, 0x9d, 0xed, 0xee, 0x5b, 0xff, 0x66, 0xe1, 0xfe, 0x31, 0xe6, 0x1f, 0x81, 0x9a,
0x58, 0x6d, 0x80, 0x52, 0xfd, 0x78, 0xc6, 0x5c, 0x77, 0xbe, 0xf5, 0xd1, 0xc6, 0xc8, 0x8e, 0x0e, 0x3d, 0x2a, 0x44, 0x2f, 0x4d, 0xf3, 0x25, 0x32, 0x9c, 0x33, 0x1c, 0xc9, 0xf7, 0xa0, 0xc6, 0x6a,
0x26, 0x7b, 0xa4, 0xe5, 0x3a, 0xeb, 0xfa, 0x8a, 0xed, 0xf3, 0x5f, 0xd7, 0x85, 0x2c, 0xaf, 0xd3, 0xc4, 0x72, 0x03, 0x14, 0xea, 0xc7, 0x33, 0xe6, 0xba, 0xf7, 0xad, 0x8f, 0xd6, 0x47, 0x56, 0x78,
0xd1, 0xd7, 0x29, 0x82, 0xf1, 0xde, 0xde, 0x02, 0xfd, 0xbc, 0xf9, 0x7f, 0x01, 0x00, 0x00, 0xff, 0x38, 0xd9, 0x27, 0x2d, 0x37, 0x59, 0xd7, 0x57, 0x2c, 0x8f, 0xff, 0xba, 0x19, 0xc9, 0xf2, 0x26,
0xff, 0x58, 0xcf, 0x74, 0x0f, 0x02, 0x54, 0x00, 0x00, 0x1d, 0x7d, 0x93, 0x22, 0x18, 0xef, 0xef, 0xd7, 0xe8, 0xe7, 0xed, 0xff, 0x0b, 0x00, 0x00, 0xff,
0xff, 0xf9, 0x7b, 0x39, 0xe5, 0x38, 0x54, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

View File

@ -226,17 +226,18 @@ func (broker *CoordinatorBroker) GetIndexInfo(ctx context.Context, collectionID
indexes := make([]*querypb.FieldIndexInfo, 0) indexes := make([]*querypb.FieldIndexInfo, 0)
for _, info := range segmentInfo.GetIndexInfos() { for _, info := range segmentInfo.GetIndexInfos() {
indexes = append(indexes, &querypb.FieldIndexInfo{ indexes = append(indexes, &querypb.FieldIndexInfo{
FieldID: info.GetFieldID(), FieldID: info.GetFieldID(),
EnableIndex: true, EnableIndex: true,
IndexName: info.GetIndexName(), IndexName: info.GetIndexName(),
IndexID: info.GetIndexID(), IndexID: info.GetIndexID(),
BuildID: info.GetBuildID(), BuildID: info.GetBuildID(),
IndexParams: info.GetIndexParams(), IndexParams: info.GetIndexParams(),
IndexFilePaths: info.GetIndexFilePaths(), IndexFilePaths: info.GetIndexFilePaths(),
IndexSize: int64(info.GetSerializedSize()), IndexSize: int64(info.GetSerializedSize()),
IndexVersion: info.GetIndexVersion(), IndexVersion: info.GetIndexVersion(),
NumRows: info.GetNumRows(), NumRows: info.GetNumRows(),
IndexEngineVersion: info.GetIndexEngineVersion(), CurrentIndexVersion: info.GetCurrentIndexVersion(),
MinimalIndexVersion: info.GetMinimalIndexVersion(),
}) })
} }

View File

@ -87,7 +87,7 @@ func (li *LoadIndexInfo) appendLoadIndexInfo(indexInfo *querypb.FieldIndexInfo,
} }
} }
if err := li.appendIndexEngineVersion(indexInfo.GetIndexEngineVersion()); err != nil { if err := li.appendIndexEngineVersion(indexInfo.GetCurrentIndexVersion()); err != nil {
return err return err
} }
@ -153,9 +153,8 @@ func (li *LoadIndexInfo) appendIndexData(indexKeys []string) error {
return HandleCStatus(&status, "AppendIndex failed") return HandleCStatus(&status, "AppendIndex failed")
} }
func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion string) error { func (li *LoadIndexInfo) appendIndexEngineVersion(indexEngineVersion int32) error {
cIndexEngineVersion := C.CString(indexEngineVersion) cIndexEngineVersion := C.int32_t(indexEngineVersion)
defer C.free(unsafe.Pointer(cIndexEngineVersion))
status := C.AppendIndexEngineVersionToLoadInfo(li.cLoadIndexInfo, cIndexEngineVersion) status := C.AppendIndexEngineVersionToLoadInfo(li.cLoadIndexInfo, cIndexEngineVersion)
return HandleCStatus(&status, "AppendIndexEngineVersion failed") return HandleCStatus(&status, "AppendIndexEngineVersion failed")

View File

@ -673,7 +673,8 @@ func (loader *segmentLoader) loadFieldsIndex(ctx context.Context,
zap.Int64("segment", segment.segmentID), zap.Int64("segment", segment.segmentID),
zap.Int64("fieldID", fieldID), zap.Int64("fieldID", fieldID),
zap.Any("binlog", fieldInfo.FieldBinlog.Binlogs), zap.Any("binlog", fieldInfo.FieldBinlog.Binlogs),
zap.String("index_engine_version", fieldInfo.IndexInfo.GetIndexEngineVersion()), zap.Int32("current_index_version", fieldInfo.IndexInfo.GetCurrentIndexVersion()),
zap.Int32("minimal_index_version", fieldInfo.IndexInfo.GetMinimalIndexVersion()),
) )
segment.AddIndex(fieldID, fieldInfo) segment.AddIndex(fieldID, fieldInfo)

View File

@ -145,7 +145,12 @@ func NewQueryNode(ctx context.Context, factory dependency.Factory) *QueryNode {
} }
func (node *QueryNode) initSession() error { func (node *QueryNode) initSession() error {
node.session = sessionutil.NewSession(node.ctx, paramtable.Get().EtcdCfg.MetaRootPath.GetValue(), node.etcdCli) minimalIndexVersion, currentIndexVersion := getIndexEngineVersion()
node.session = sessionutil.NewSession(node.ctx,
paramtable.Get().EtcdCfg.MetaRootPath.GetValue(),
node.etcdCli,
sessionutil.WithIndexEngineVersion(minimalIndexVersion, currentIndexVersion),
)
if node.session == nil { if node.session == nil {
return fmt.Errorf("session is nil, the etcd client connection may have failed") return fmt.Errorf("session is nil, the etcd client connection may have failed")
} }
@ -241,6 +246,11 @@ func (node *QueryNode) InitSegcore() error {
return nil return nil
} }
func getIndexEngineVersion() (minimal, current int32) {
cMinimal, cCurrent := C.GetMinimalIndexVersion(), C.GetCurrentIndexVersion()
return int32(cMinimal), int32(cCurrent)
}
func (node *QueryNode) CloseSegcore() { func (node *QueryNode) CloseSegcore() {
// safe stop // safe stop
initcore.CleanRemoteChunkManager() initcore.CleanRemoteChunkManager()

View File

@ -151,9 +151,8 @@ func (bi *BuildIndexInfo) AppendInsertFile(filePath string) error {
return HandleCStatus(&status, "appendInsertFile failed") return HandleCStatus(&status, "appendInsertFile failed")
} }
func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion string) error { func (bi *BuildIndexInfo) AppendIndexEngineVersion(indexEngineVersion int32) error {
cIndexEngineVersion := C.CString(indexEngineVersion) cIndexEngineVersion := C.int32_t(indexEngineVersion)
defer C.free(unsafe.Pointer(cIndexEngineVersion))
status := C.AppendIndexEngineVersionToBuildInfo(bi.cBuildIndexInfo, cIndexEngineVersion) status := C.AppendIndexEngineVersionToBuildInfo(bi.cBuildIndexInfo, cIndexEngineVersion)
return HandleCStatus(&status, "AppendIndexEngineVersion failed") return HandleCStatus(&status, "AppendIndexEngineVersion failed")

View File

@ -78,6 +78,11 @@ const (
SessionUpdateEvent SessionUpdateEvent
) )
type IndexEngineVersion struct {
MinimalIndexVersion int32 `json:"MinimalIndexVersion,omitempty"`
CurrentIndexVersion int32 `json:"CurrentIndexVersion,omitempty"`
}
// Session is a struct to store service's session, including ServerID, ServerName, // Session is a struct to store service's session, including ServerID, ServerName,
// Address. // Address.
// Exclusive indicates that this server can only start one. // Exclusive indicates that this server can only start one.
@ -89,13 +94,14 @@ type Session struct {
keepAliveCancel context.CancelFunc keepAliveCancel context.CancelFunc
keepAliveCtx context.Context keepAliveCtx context.Context
ServerID int64 `json:"ServerID,omitempty"` ServerID int64 `json:"ServerID,omitempty"`
ServerName string `json:"ServerName,omitempty"` ServerName string `json:"ServerName,omitempty"`
Address string `json:"Address,omitempty"` Address string `json:"Address,omitempty"`
Exclusive bool `json:"Exclusive,omitempty"` Exclusive bool `json:"Exclusive,omitempty"`
Stopping bool `json:"Stopping,omitempty"` Stopping bool `json:"Stopping,omitempty"`
TriggerKill bool TriggerKill bool
Version semver.Version `json:"Version,omitempty"` Version semver.Version `json:"Version,omitempty"`
IndexEngineVersion IndexEngineVersion `json:"IndexEngineVersion,omitempty"`
liveChOnce sync.Once liveChOnce sync.Once
liveCh chan struct{} liveCh chan struct{}
@ -134,6 +140,14 @@ func WithResueNodeID(b bool) SessionOption {
return func(session *Session) { session.reuseNodeID = b } return func(session *Session) { session.reuseNodeID = b }
} }
// WithIndexEngineVersion should be only used by querynode.
func WithIndexEngineVersion(minimal, current int32) SessionOption {
return func(session *Session) {
session.IndexEngineVersion.MinimalIndexVersion = minimal
session.IndexEngineVersion.CurrentIndexVersion = current
}
}
func (s *Session) apply(opts ...SessionOption) { func (s *Session) apply(opts ...SessionOption) {
for _, opt := range opts { for _, opt := range opts {
opt(s) opt(s)
@ -143,14 +157,15 @@ func (s *Session) apply(opts ...SessionOption) {
// UnmarshalJSON unmarshal bytes to Session. // UnmarshalJSON unmarshal bytes to Session.
func (s *Session) UnmarshalJSON(data []byte) error { func (s *Session) UnmarshalJSON(data []byte) error {
var raw struct { var raw struct {
ServerID int64 `json:"ServerID,omitempty"` ServerID int64 `json:"ServerID,omitempty"`
ServerName string `json:"ServerName,omitempty"` ServerName string `json:"ServerName,omitempty"`
Address string `json:"Address,omitempty"` Address string `json:"Address,omitempty"`
Exclusive bool `json:"Exclusive,omitempty"` Exclusive bool `json:"Exclusive,omitempty"`
Stopping bool `json:"Stopping,omitempty"` Stopping bool `json:"Stopping,omitempty"`
TriggerKill bool TriggerKill bool
Version string `json:"Version"` Version string `json:"Version"`
LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` IndexEngineVersion string `json:"IndexEngineVersion,omitempty"`
LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"`
} }
err := json.Unmarshal(data, &raw) err := json.Unmarshal(data, &raw)
if err != nil { if err != nil {
@ -164,6 +179,17 @@ func (s *Session) UnmarshalJSON(data []byte) error {
} }
} }
if raw.IndexEngineVersion != "" {
json.Unmarshal([]byte(raw.IndexEngineVersion), &s.IndexEngineVersion)
if err != nil {
return err
}
} else {
// set zero when queryNode not register knowhere version
s.IndexEngineVersion.MinimalIndexVersion = 0
s.IndexEngineVersion.CurrentIndexVersion = 0
}
s.ServerID = raw.ServerID s.ServerID = raw.ServerID
s.ServerName = raw.ServerName s.ServerName = raw.ServerName
s.Address = raw.Address s.Address = raw.Address
@ -177,24 +203,30 @@ func (s *Session) UnmarshalJSON(data []byte) error {
// MarshalJSON marshals session to bytes. // MarshalJSON marshals session to bytes.
func (s *Session) MarshalJSON() ([]byte, error) { func (s *Session) MarshalJSON() ([]byte, error) {
verStr := s.Version.String() verStr := s.Version.String()
indexVerStr, err := json.Marshal(s.IndexEngineVersion)
if err != nil {
return nil, err
}
return json.Marshal(&struct { return json.Marshal(&struct {
ServerID int64 `json:"ServerID,omitempty"` ServerID int64 `json:"ServerID,omitempty"`
ServerName string `json:"ServerName,omitempty"` ServerName string `json:"ServerName,omitempty"`
Address string `json:"Address,omitempty"` Address string `json:"Address,omitempty"`
Exclusive bool `json:"Exclusive,omitempty"` Exclusive bool `json:"Exclusive,omitempty"`
Stopping bool `json:"Stopping,omitempty"` Stopping bool `json:"Stopping,omitempty"`
TriggerKill bool TriggerKill bool
Version string `json:"Version"` Version string `json:"Version"`
LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"` IndexEngineVersion string `json:"IndexEngineVersion,omitempty"`
LeaseID *clientv3.LeaseID `json:"LeaseID,omitempty"`
}{ }{
ServerID: s.ServerID, ServerID: s.ServerID,
ServerName: s.ServerName, ServerName: s.ServerName,
Address: s.Address, Address: s.Address,
Exclusive: s.Exclusive, Exclusive: s.Exclusive,
Stopping: s.Stopping, Stopping: s.Stopping,
TriggerKill: s.TriggerKill, TriggerKill: s.TriggerKill,
Version: verStr, Version: verStr,
LeaseID: s.leaseID, IndexEngineVersion: string(indexVerStr),
LeaseID: s.leaseID,
}) })
} }

View File

@ -216,8 +216,6 @@ type commonConfig struct {
EnableLockMetrics ParamItem `refreshable:"false"` EnableLockMetrics ParamItem `refreshable:"false"`
LockSlowLogInfoThreshold ParamItem `refreshable:"true"` LockSlowLogInfoThreshold ParamItem `refreshable:"true"`
LockSlowLogWarnThreshold ParamItem `refreshable:"true"` LockSlowLogWarnThreshold ParamItem `refreshable:"true"`
IndexEngineVersion ParamItem `refreshable:"true"`
} }
func (p *commonConfig) init(base *BaseTable) { func (p *commonConfig) init(base *BaseTable) {
@ -614,15 +612,6 @@ like the old password verification when updating the credential`,
Export: true, Export: true,
} }
p.LockSlowLogWarnThreshold.Init(base.mgr) p.LockSlowLogWarnThreshold.Init(base.mgr)
p.IndexEngineVersion = ParamItem{
Key: "common.indexEngineVersion",
Version: "2.3.2",
DefaultValue: "knowhere-v0",
Doc: "version of index engine",
Export: true,
}
p.IndexEngineVersion.Init(base.mgr)
} }
type traceConfig struct { type traceConfig struct {

View File

@ -1,4 +0,0 @@
extraConfigFiles:
user.yaml: |+
common:
indexEngineVersion: "cardinal-v0"