Add FlushAll support (#22942)

Signed-off-by: bigsheeper <yihao.dai@zilliz.com>
This commit is contained in:
yihao.dai 2023-03-30 11:28:25 +08:00 committed by GitHub
parent 74da53c027
commit a182594bf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 1034 additions and 459 deletions

8
go.mod
View File

@ -10,7 +10,7 @@ require (
github.com/antonmedv/expr v1.8.9
github.com/apache/arrow/go/v8 v8.0.0-20220322092137-778b1772fd20
github.com/apache/pulsar-client-go v0.6.1-0.20210728062540-29414db801a7
github.com/apache/thrift v0.15.0 // indirect
github.com/apache/thrift v0.15.0
github.com/benesch/cgosymbolizer v0.0.0-20190515212042-bec6fe6e597b
github.com/bits-and-blooms/bloom/v3 v3.0.1
github.com/casbin/casbin/v2 v2.44.2
@ -26,7 +26,7 @@ require (
github.com/klauspost/compress v1.14.4
github.com/lingdor/stackerror v0.0.0-20191119040541-976d8885ed76
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230309062747-133bf302bb11
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230322065753-aa8a66130217
github.com/minio/minio-go/v7 v7.0.17
github.com/panjf2000/ants/v2 v2.4.8
github.com/prometheus/client_golang v1.11.1
@ -185,10 +185,10 @@ require (
)
require (
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect
github.com/alibabacloud-go/tea v1.1.8 // indirect
cloud.google.com/go/compute v1.12.1 // indirect
cloud.google.com/go/compute/metadata v0.2.1 // indirect
github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect
github.com/alibabacloud-go/tea v1.1.8 // indirect
github.com/cenkalti/backoff/v4 v4.2.0 // indirect
github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f // indirect
github.com/cockroachdb/redact v1.1.3 // indirect

4
go.sum
View File

@ -572,8 +572,8 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/milvus-io/gorocksdb v0.0.0-20220624081344-8c5f4212846b h1:TfeY0NxYxZzUfIfYe5qYDBzt4ZYRqzUjTR6CvUzjat8=
github.com/milvus-io/gorocksdb v0.0.0-20220624081344-8c5f4212846b/go.mod h1:iwW+9cWfIzzDseEBCCeDSN5SD16Tidvy8cwQ7ZY8Qj4=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230309062747-133bf302bb11 h1:ly7SWpwWH0ezos2xw3HPOQCqxTdTjlpUSvfpguPg91c=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230309062747-133bf302bb11/go.mod h1:148qnlmZ0Fdm1Fq+Mj/OW2uDoEP25g3mjh0vMGtkgmk=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230322065753-aa8a66130217 h1:58lCM3+oh3ZuCemnOE3V2VdaPnIL+LS7eoEyrFfrxOM=
github.com/milvus-io/milvus-proto/go-api v0.0.0-20230322065753-aa8a66130217/go.mod h1:148qnlmZ0Fdm1Fq+Mj/OW2uDoEP25g3mjh0vMGtkgmk=
github.com/milvus-io/pulsar-client-go v0.6.10 h1:eqpJjU+/QX0iIhEo3nhOqMNXL+TyInAs1IAHZCrCM/A=
github.com/milvus-io/pulsar-client-go v0.6.10/go.mod h1:lQqCkgwDF8YFYjKA+zOheTk1tev2B+bKj5j7+nm8M1w=
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=

View File

@ -401,103 +401,106 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE(
"led\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Drop"
"ped\020\006\022\r\n\tImporting\020\007*>\n\017PlaceholderType\022"
"\010\n\004None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVect"
"or\020e*\300\016\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020Creat"
"or\020e*\246\017\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020Creat"
"eCollection\020d\022\022\n\016DropCollection\020e\022\021\n\rHas"
"Collection\020f\022\026\n\022DescribeCollection\020g\022\023\n\017"
"ShowCollections\020h\022\024\n\020GetSystemConfigs\020i\022"
"\022\n\016LoadCollection\020j\022\025\n\021ReleaseCollection"
"\020k\022\017\n\013CreateAlias\020l\022\r\n\tDropAlias\020m\022\016\n\nAl"
"terAlias\020n\022\023\n\017AlterCollection\020o\022\024\n\020Renam"
"eCollection\020p\022\024\n\017CreatePartition\020\310\001\022\022\n\rD"
"ropPartition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021De"
"scribePartition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022"
"\023\n\016LoadPartitions\020\315\001\022\026\n\021ReleasePartition"
"s\020\316\001\022\021\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegme"
"nt\020\373\001\022\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegme"
"nts\020\375\001\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBala"
"nceSegments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n"
"\013CreateIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tD"
"ropIndex\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n"
"\005Flush\020\222\003\022\027\n\022ResendSegmentStats\020\223\003\022\013\n\006Up"
"sert\020\224\003\022\013\n\006Search\020\364\003\022\021\n\014SearchResult\020\365\003\022"
"\022\n\rGetIndexState\020\366\003\022\032\n\025GetIndexBuildProg"
"ress\020\367\003\022\034\n\027GetCollectionStatistics\020\370\003\022\033\n"
"\026GetPartitionStatistics\020\371\003\022\r\n\010Retrieve\020\372"
"\003\022\023\n\016RetrieveResult\020\373\003\022\024\n\017WatchDmChannel"
"s\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022WatchQuer"
"yChannels\020\376\003\022\030\n\023RemoveQueryChannels\020\377\003\022\035"
"\n\030SealedSegmentsChangeInfo\020\200\004\022\027\n\022WatchDe"
"ltaChannels\020\201\004\022\024\n\017GetShardLeaders\020\202\004\022\020\n\013"
"GetReplicas\020\203\004\022\023\n\016UnsubDmChannel\020\204\004\022\024\n\017G"
"etDistribution\020\205\004\022\025\n\020SyncDistribution\020\206\004"
"\022\020\n\013SegmentInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017G"
"etRecoveryInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022"
"\r\n\010TimeTick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tL"
"oadIndex\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTS"
"O\020\264\t\022\024\n\017AllocateSegment\020\265\t\022\026\n\021SegmentSta"
"tistics\020\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDat"
"aNodeTt\020\270\t\022\025\n\020CreateCredential\020\334\013\022\022\n\rGet"
"Credential\020\335\013\022\025\n\020DeleteCredential\020\336\013\022\025\n\020"
"UpdateCredential\020\337\013\022\026\n\021ListCredUsernames"
"\020\340\013\022\017\n\nCreateRole\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017O"
"perateUserRole\020\302\014\022\017\n\nSelectRole\020\303\014\022\017\n\nSe"
"lectUser\020\304\014\022\023\n\016SelectResource\020\305\014\022\025\n\020Oper"
"atePrivilege\020\306\014\022\020\n\013SelectGrant\020\307\014\022\033\n\026Ref"
"reshPolicyInfoCache\020\310\014\022\017\n\nListPolicy\020\311\014\022"
"\030\n\023CreateResourceGroup\020\244\r\022\026\n\021DropResourc"
"eGroup\020\245\r\022\027\n\022ListResourceGroups\020\246\r\022\032\n\025De"
"scribeResourceGroup\020\247\r\022\021\n\014TransferNode\020\250"
"\r\022\024\n\017TransferReplica\020\251\r*\"\n\007DslType\022\007\n\003Ds"
"l\020\000\022\016\n\nBoolExprV1\020\001*B\n\017CompactionState\022\021"
"\n\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tComp"
"leted\020\002*X\n\020ConsistencyLevel\022\n\n\006Strong\020\000\022"
"\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventually\020"
"\003\022\016\n\nCustomized\020\004*\236\001\n\013ImportState\022\021\n\rImp"
"ortPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImport"
"Started\020\002\022\023\n\017ImportPersisted\020\005\022\021\n\rImport"
"Flushed\020\010\022\023\n\017ImportCompleted\020\006\022\032\n\026Import"
"FailedAndCleaned\020\007*2\n\nObjectType\022\016\n\nColl"
"ection\020\000\022\n\n\006Global\020\001\022\010\n\004User\020\002*\227\007\n\017Objec"
"tPrivilege\022\020\n\014PrivilegeAll\020\000\022\035\n\031Privileg"
"eCreateCollection\020\001\022\033\n\027PrivilegeDropColl"
"ection\020\002\022\037\n\033PrivilegeDescribeCollection\020"
"\003\022\034\n\030PrivilegeShowCollections\020\004\022\021\n\rPrivi"
"legeLoad\020\005\022\024\n\020PrivilegeRelease\020\006\022\027\n\023Priv"
"ilegeCompaction\020\007\022\023\n\017PrivilegeInsert\020\010\022\023"
"\n\017PrivilegeDelete\020\t\022\032\n\026PrivilegeGetStati"
"stics\020\n\022\030\n\024PrivilegeCreateIndex\020\013\022\030\n\024Pri"
"vilegeIndexDetail\020\014\022\026\n\022PrivilegeDropInde"
"x\020\r\022\023\n\017PrivilegeSearch\020\016\022\022\n\016PrivilegeFlu"
"sh\020\017\022\022\n\016PrivilegeQuery\020\020\022\030\n\024PrivilegeLoa"
"dBalance\020\021\022\023\n\017PrivilegeImport\020\022\022\034\n\030Privi"
"legeCreateOwnership\020\023\022\027\n\023PrivilegeUpdate"
"User\020\024\022\032\n\026PrivilegeDropOwnership\020\025\022\034\n\030Pr"
"ivilegeSelectOwnership\020\026\022\034\n\030PrivilegeMan"
"ageOwnership\020\027\022\027\n\023PrivilegeSelectUser\020\030\022"
"\023\n\017PrivilegeUpsert\020\031\022 \n\034PrivilegeCreateR"
"esourceGroup\020\032\022\036\n\032PrivilegeDropResourceG"
"roup\020\033\022\"\n\036PrivilegeDescribeResourceGroup"
"\020\034\022\037\n\033PrivilegeListResourceGroups\020\035\022\031\n\025P"
"rivilegeTransferNode\020\036\022\034\n\030PrivilegeTrans"
"ferReplica\020\037\022\037\n\033PrivilegeGetLoadingProgr"
"ess\020 \022\031\n\025PrivilegeGetLoadState\020!*S\n\tStat"
"eCode\022\020\n\014Initializing\020\000\022\013\n\007Healthy\020\001\022\014\n\010"
"Abnormal\020\002\022\013\n\007StandBy\020\003\022\014\n\010Stopping\020\004*c\n"
"\tLoadState\022\025\n\021LoadStateNotExist\020\000\022\024\n\020Loa"
"dStateNotLoad\020\001\022\024\n\020LoadStateLoading\020\002\022\023\n"
"\017LoadStateLoaded\020\003:^\n\021privilege_ext_obj\022"
"\037.google.protobuf.MessageOptions\030\351\007 \001(\0132"
"!.milvus.proto.common.PrivilegeExtBf\n\016io"
".milvus.grpcB\013CommonProtoP\001Z1github.com/"
"milvus-io/milvus-proto/go-api/commonpb\240\001"
"\001\252\002\016IO.Milvus.Grpcb\006proto3"
"eCollection\020p\022\021\n\rDescribeAlias\020q\022\017\n\013List"
"Aliases\020r\022\024\n\017CreatePartition\020\310\001\022\022\n\rDropP"
"artition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021Descri"
"bePartition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022\023\n\016L"
"oadPartitions\020\315\001\022\026\n\021ReleasePartitions\020\316\001"
"\022\021\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegment\020\373"
"\001\022\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegments\020"
"\375\001\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBalanceS"
"egments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\034\n\027Fed"
"erListIndexedSegment\020\201\002\022\"\n\035FederDescribe"
"SegmentIndexData\020\202\002\022\020\n\013CreateIndex\020\254\002\022\022\n"
"\rDescribeIndex\020\255\002\022\016\n\tDropIndex\020\256\002\022\013\n\006Ins"
"ert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush\020\222\003\022\027\n\022Resen"
"dSegmentStats\020\223\003\022\013\n\006Upsert\020\224\003\022\013\n\006Search\020"
"\364\003\022\021\n\014SearchResult\020\365\003\022\022\n\rGetIndexState\020\366"
"\003\022\032\n\025GetIndexBuildProgress\020\367\003\022\034\n\027GetColl"
"ectionStatistics\020\370\003\022\033\n\026GetPartitionStati"
"stics\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveResul"
"t\020\373\003\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDmCh"
"annels\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023Re"
"moveQueryChannels\020\377\003\022\035\n\030SealedSegmentsCh"
"angeInfo\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\024\n\017"
"GetShardLeaders\020\202\004\022\020\n\013GetReplicas\020\203\004\022\023\n\016"
"UnsubDmChannel\020\204\004\022\024\n\017GetDistribution\020\205\004\022"
"\025\n\020SyncDistribution\020\206\004\022\020\n\013SegmentInfo\020\330\004"
"\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004\022"
"\024\n\017GetSegmentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n\016"
"QueryNodeStats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tReq"
"uestID\020\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateSe"
"gment\020\265\t\022\026\n\021SegmentStatistics\020\266\t\022\025\n\020Segm"
"entFlushDone\020\267\t\022\017\n\nDataNodeTt\020\270\t\022\025\n\020Crea"
"teCredential\020\334\013\022\022\n\rGetCredential\020\335\013\022\025\n\020D"
"eleteCredential\020\336\013\022\025\n\020UpdateCredential\020\337"
"\013\022\026\n\021ListCredUsernames\020\340\013\022\017\n\nCreateRole\020"
"\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017OperateUserRole\020\302\014\022"
"\017\n\nSelectRole\020\303\014\022\017\n\nSelectUser\020\304\014\022\023\n\016Sel"
"ectResource\020\305\014\022\025\n\020OperatePrivilege\020\306\014\022\020\n"
"\013SelectGrant\020\307\014\022\033\n\026RefreshPolicyInfoCach"
"e\020\310\014\022\017\n\nListPolicy\020\311\014\022\030\n\023CreateResourceG"
"roup\020\244\r\022\026\n\021DropResourceGroup\020\245\r\022\027\n\022ListR"
"esourceGroups\020\246\r\022\032\n\025DescribeResourceGrou"
"p\020\247\r\022\021\n\014TransferNode\020\250\r\022\024\n\017TransferRepli"
"ca\020\251\r*\"\n\007DslType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020"
"\001*B\n\017CompactionState\022\021\n\rUndefiedState\020\000\022"
"\r\n\tExecuting\020\001\022\r\n\tCompleted\020\002*X\n\020Consist"
"encyLevel\022\n\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bo"
"unded\020\002\022\016\n\nEventually\020\003\022\016\n\nCustomized\020\004*"
"\236\001\n\013ImportState\022\021\n\rImportPending\020\000\022\020\n\014Im"
"portFailed\020\001\022\021\n\rImportStarted\020\002\022\023\n\017Impor"
"tPersisted\020\005\022\021\n\rImportFlushed\020\010\022\023\n\017Impor"
"tCompleted\020\006\022\032\n\026ImportFailedAndCleaned\020\007"
"*2\n\nObjectType\022\016\n\nCollection\020\000\022\n\n\006Global"
"\020\001\022\010\n\004User\020\002*\227\007\n\017ObjectPrivilege\022\020\n\014Priv"
"ilegeAll\020\000\022\035\n\031PrivilegeCreateCollection\020"
"\001\022\033\n\027PrivilegeDropCollection\020\002\022\037\n\033Privil"
"egeDescribeCollection\020\003\022\034\n\030PrivilegeShow"
"Collections\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020Priv"
"ilegeRelease\020\006\022\027\n\023PrivilegeCompaction\020\007\022"
"\023\n\017PrivilegeInsert\020\010\022\023\n\017PrivilegeDelete\020"
"\t\022\032\n\026PrivilegeGetStatistics\020\n\022\030\n\024Privile"
"geCreateIndex\020\013\022\030\n\024PrivilegeIndexDetail\020"
"\014\022\026\n\022PrivilegeDropIndex\020\r\022\023\n\017PrivilegeSe"
"arch\020\016\022\022\n\016PrivilegeFlush\020\017\022\022\n\016PrivilegeQ"
"uery\020\020\022\030\n\024PrivilegeLoadBalance\020\021\022\023\n\017Priv"
"ilegeImport\020\022\022\034\n\030PrivilegeCreateOwnershi"
"p\020\023\022\027\n\023PrivilegeUpdateUser\020\024\022\032\n\026Privileg"
"eDropOwnership\020\025\022\034\n\030PrivilegeSelectOwner"
"ship\020\026\022\034\n\030PrivilegeManageOwnership\020\027\022\027\n\023"
"PrivilegeSelectUser\020\030\022\023\n\017PrivilegeUpsert"
"\020\031\022 \n\034PrivilegeCreateResourceGroup\020\032\022\036\n\032"
"PrivilegeDropResourceGroup\020\033\022\"\n\036Privileg"
"eDescribeResourceGroup\020\034\022\037\n\033PrivilegeLis"
"tResourceGroups\020\035\022\031\n\025PrivilegeTransferNo"
"de\020\036\022\034\n\030PrivilegeTransferReplica\020\037\022\037\n\033Pr"
"ivilegeGetLoadingProgress\020 \022\031\n\025Privilege"
"GetLoadState\020!*S\n\tStateCode\022\020\n\014Initializ"
"ing\020\000\022\013\n\007Healthy\020\001\022\014\n\010Abnormal\020\002\022\013\n\007Stan"
"dBy\020\003\022\014\n\010Stopping\020\004*c\n\tLoadState\022\025\n\021Load"
"StateNotExist\020\000\022\024\n\020LoadStateNotLoad\020\001\022\024\n"
"\020LoadStateLoading\020\002\022\023\n\017LoadStateLoaded\020\003"
":^\n\021privilege_ext_obj\022\037.google.protobuf."
"MessageOptions\030\351\007 \001(\0132!.milvus.proto.com"
"mon.PrivilegeExtBf\n\016io.milvus.grpcB\013Comm"
"onProtoP\001Z1github.com/milvus-io/milvus-p"
"roto/go-api/commonpb\240\001\001\252\002\016IO.Milvus.Grpc"
"b\006proto3"
;
static const ::_pbi::DescriptorTable* const descriptor_table_common_2eproto_deps[1] = {
&::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto,
};
static ::_pbi::once_flag descriptor_table_common_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_common_2eproto = {
false, false, 6226, descriptor_table_protodef_common_2eproto,
false, false, 6328, descriptor_table_protodef_common_2eproto,
"common.proto",
&descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_deps, 1, 12,
schemas, file_default_instances, TableStruct_common_2eproto::offsets,
@ -657,6 +660,8 @@ bool MsgType_IsValid(int value) {
case 110:
case 111:
case 112:
case 113:
case 114:
case 200:
case 201:
case 202:
@ -671,6 +676,8 @@ bool MsgType_IsValid(int value) {
case 254:
case 255:
case 256:
case 257:
case 258:
case 300:
case 301:
case 302:

View File

@ -289,6 +289,8 @@ enum MsgType : int {
AlterAlias = 110,
AlterCollection = 111,
RenameCollection = 112,
DescribeAlias = 113,
ListAliases = 114,
CreatePartition = 200,
DropPartition = 201,
HasPartition = 202,
@ -303,6 +305,8 @@ enum MsgType : int {
HandoffSegments = 254,
LoadBalanceSegments = 255,
DescribeSegments = 256,
FederListIndexedSegment = 257,
FederDescribeSegmentIndexData = 258,
CreateIndex = 300,
DescribeIndex = 301,
DropIndex = 302,

View File

@ -45,6 +45,7 @@ import (
"github.com/milvus-io/milvus/internal/indexnode"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/metastore/model"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/mq/msgstream"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/indexpb"
@ -3451,6 +3452,87 @@ func TestGetFlushState(t *testing.T) {
})
}
func TestGetFlushAllState(t *testing.T) {
tests := []struct {
testName string
ChannelCPs []Timestamp
FlushAllTs Timestamp
ServerIsHealthy bool
ShowCollectionFailed bool
DescribeCollectionFailed bool
ExpectedSuccess bool
ExpectedFlushed bool
}{
{"test FlushAll flushed", []Timestamp{100, 200}, 99,
true, false, false, true, true},
{"test FlushAll not flushed", []Timestamp{100, 200}, 150,
true, false, false, true, false},
{"test Sever is not healthy", nil, 0,
false, false, false, false, false},
{"test ShowCollections failed", nil, 0,
true, true, false, false, false},
{"test DescribeCollection failed", nil, 0,
true, false, true, false, false},
}
for _, test := range tests {
t.Run(test.testName, func(t *testing.T) {
collection := UniqueID(0)
vchannels := []string{"mock-vchannel-0", "mock-vchannel-1"}
svr := &Server{}
if test.ServerIsHealthy {
svr.stateCode.Store(commonpb.StateCode_Healthy)
}
var err error
svr.meta = &meta{}
svr.rootCoordClient = mocks.NewRootCoord(t)
if test.ShowCollectionFailed {
svr.rootCoordClient.(*mocks.RootCoord).EXPECT().ShowCollections(mock.Anything, mock.Anything).
Return(&milvuspb.ShowCollectionsResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UnexpectedError},
}, nil).Maybe()
} else {
svr.rootCoordClient.(*mocks.RootCoord).EXPECT().ShowCollections(mock.Anything, mock.Anything).
Return(&milvuspb.ShowCollectionsResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success},
CollectionIds: []int64{collection},
}, nil).Maybe()
}
if test.DescribeCollectionFailed {
svr.rootCoordClient.(*mocks.RootCoord).EXPECT().DescribeCollectionInternal(mock.Anything, mock.Anything).
Return(&milvuspb.DescribeCollectionResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UnexpectedError},
}, nil).Maybe()
} else {
svr.rootCoordClient.(*mocks.RootCoord).EXPECT().DescribeCollectionInternal(mock.Anything, mock.Anything).
Return(&milvuspb.DescribeCollectionResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success},
VirtualChannelNames: vchannels,
}, nil).Maybe()
}
svr.meta.channelCPs = make(map[string]*msgpb.MsgPosition)
for i, ts := range test.ChannelCPs {
channel := vchannels[i]
svr.meta.channelCPs[channel] = &msgpb.MsgPosition{
ChannelName: channel,
Timestamp: ts,
}
}
resp, err := svr.GetFlushAllState(context.TODO(), &milvuspb.GetFlushAllStateRequest{FlushAllTs: test.FlushAllTs})
assert.Nil(t, err)
if test.ExpectedSuccess {
assert.Equal(t, commonpb.ErrorCode_Success, resp.GetStatus().GetErrorCode())
} else {
assert.Equal(t, commonpb.ErrorCode_UnexpectedError, resp.GetStatus().GetErrorCode())
}
assert.Equal(t, test.ExpectedFlushed, resp.GetFlushed())
})
}
}
func TestDataCoordServer_SetSegmentState(t *testing.T) {
t.Run("normal case", func(t *testing.T) {
svr := newTestServer(t, nil)

View File

@ -1169,6 +1169,51 @@ func (s *Server) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateR
return resp, nil
}
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
func (s *Server) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
resp := &milvuspb.GetFlushAllStateResponse{Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UnexpectedError}}
if s.isClosed() {
log.Warn("DataCoord receive GetFlushAllState request, server closed")
resp.Status.Reason = msgDataCoordIsUnhealthy(paramtable.GetNodeID())
return resp, nil
}
showColRsp, err := s.rootCoordClient.ShowCollections(ctx, &milvuspb.ShowCollectionsRequest{
Base: commonpbutil.NewMsgBase(
commonpbutil.WithMsgType(commonpb.MsgType_ShowCollections),
)})
if err = VerifyResponse(showColRsp, err); err != nil {
log.Warn("failed to ShowCollections", zap.Error(err))
resp.Status.Reason = err.Error()
return resp, nil
}
for _, collection := range showColRsp.GetCollectionIds() {
describeColRsp, err := s.rootCoordClient.DescribeCollectionInternal(ctx, &milvuspb.DescribeCollectionRequest{
Base: commonpbutil.NewMsgBase(
commonpbutil.WithMsgType(commonpb.MsgType_DescribeCollection),
),
CollectionID: collection,
})
if err = VerifyResponse(describeColRsp, err); err != nil {
log.Warn("failed to DescribeCollectionInternal", zap.Error(err))
resp.Status.Reason = err.Error()
return resp, nil
}
for _, channel := range describeColRsp.GetVirtualChannelNames() {
channelCP := s.meta.GetChannelCheckpoint(channel)
if channelCP == nil || channelCP.GetTimestamp() < req.GetFlushAllTs() {
resp.Flushed = false
resp.Status.ErrorCode = commonpb.ErrorCode_Success
return resp, nil
}
}
}
resp.Flushed = true
resp.Status.ErrorCode = commonpb.ErrorCode_Success
return resp, nil
}
// Import distributes the import tasks to dataNodes.
// It returns a failed status if no dataNode is available or if any error occurs.
func (s *Server) Import(ctx context.Context, itr *datapb.ImportTaskRequest) (*datapb.ImportTaskResponse, error) {

View File

@ -585,6 +585,20 @@ func (c *Client) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateR
return ret.(*milvuspb.GetFlushStateResponse), err
}
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
func (c *Client) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
ret, err := c.grpcClient.ReCall(ctx, func(client datapb.DataCoordClient) (any, error) {
if !funcutil.CheckCtxValid(ctx) {
return nil, ctx.Err()
}
return client.GetFlushAllState(ctx, req)
})
if err != nil || ret == nil {
return nil, err
}
return ret.(*milvuspb.GetFlushAllStateResponse), err
}
// DropVirtualChannel drops virtual channel in datacoord.
func (c *Client) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
req = typeutil.Clone(req)

View File

@ -196,6 +196,9 @@ func Test_NewClient(t *testing.T) {
r39, err := client.UpdateChannelCheckpoint(ctx, nil)
retCheck(retNotNil, r39, err)
r, err := client.GetFlushAllState(ctx, nil)
retCheck(retNotNil, r, err)
{
ret, err := client.BroadcastAlteredCollection(ctx, nil)
retCheck(retNotNil, ret, err)

View File

@ -328,6 +328,11 @@ func (s *Server) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateR
return s.dataCoord.GetFlushState(ctx, req)
}
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
func (s *Server) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return s.dataCoord.GetFlushAllState(ctx, req)
}
// DropVirtualChannel drop virtual channel in datacoord
func (s *Server) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
return s.dataCoord.DropVirtualChannel(ctx, req)

View File

@ -61,6 +61,7 @@ type MockDataCoord struct {
compactionPlansResp *milvuspb.GetCompactionPlansResponse
watchChannelsResp *datapb.WatchChannelsResponse
getFlushStateResp *milvuspb.GetFlushStateResponse
getFlushAllStateResp *milvuspb.GetFlushAllStateResponse
dropVChanResp *datapb.DropVirtualChannelResponse
setSegmentStateResp *datapb.SetSegmentStateResponse
importResp *datapb.ImportTaskResponse
@ -203,6 +204,10 @@ func (m *MockDataCoord) GetFlushState(ctx context.Context, req *milvuspb.GetFlus
return m.getFlushStateResp, m.err
}
func (m *MockDataCoord) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return m.getFlushAllStateResp, m.err
}
func (m *MockDataCoord) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
return m.dropVChanResp, m.err
}
@ -451,6 +456,15 @@ func Test_NewServer(t *testing.T) {
assert.NotNil(t, resp)
})
t.Run("GetFlushAllState", func(t *testing.T) {
server.dataCoord = &MockDataCoord{
getFlushAllStateResp: &milvuspb.GetFlushAllStateResponse{},
}
resp, err := server.GetFlushAllState(ctx, nil)
assert.Nil(t, err)
assert.NotNil(t, resp)
})
t.Run("DropVirtualChannel", func(t *testing.T) {
server.dataCoord = &MockDataCoord{
dropVChanResp: &datapb.DropVirtualChannelResponse{},

View File

@ -39,6 +39,7 @@ import (
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus-proto/go-api/federpb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
dcc "github.com/milvus-io/milvus/internal/distributed/datacoord/client"
"github.com/milvus-io/milvus/internal/distributed/proxy/httpserver"
@ -664,6 +665,10 @@ func (s *Server) CalcDistance(ctx context.Context, request *milvuspb.CalcDistanc
return s.proxy.CalcDistance(ctx, request)
}
func (s *Server) FlushAll(ctx context.Context, request *milvuspb.FlushAllRequest) (*milvuspb.FlushAllResponse, error) {
return s.proxy.FlushAll(ctx, request)
}
func (s *Server) GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error) {
return s.proxy.GetDdChannel(ctx, request)
}
@ -711,6 +716,14 @@ func (s *Server) AlterAlias(ctx context.Context, request *milvuspb.AlterAliasReq
return s.proxy.AlterAlias(ctx, request)
}
func (s *Server) DescribeAlias(ctx context.Context, request *milvuspb.DescribeAliasRequest) (*milvuspb.DescribeAliasResponse, error) {
panic("TODO: implement me")
}
func (s *Server) ListAliases(ctx context.Context, request *milvuspb.ListAliasesRequest) (*milvuspb.ListAliasesResponse, error) {
panic("TODO: implement me")
}
// GetCompactionState gets the state of a compaction
func (s *Server) GetCompactionState(ctx context.Context, req *milvuspb.GetCompactionStateRequest) (*milvuspb.GetCompactionStateResponse, error) {
return s.proxy.GetCompactionState(ctx, req)
@ -730,6 +743,11 @@ func (s *Server) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateR
return s.proxy.GetFlushState(ctx, req)
}
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
func (s *Server) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return s.proxy.GetFlushAllState(ctx, req)
}
func (s *Server) Import(ctx context.Context, req *milvuspb.ImportRequest) (*milvuspb.ImportResponse, error) {
return s.proxy.Import(ctx, req)
}
@ -892,3 +910,11 @@ func (s *Server) TransferReplica(ctx context.Context, req *milvuspb.TransferRepl
func (s *Server) ListResourceGroups(ctx context.Context, req *milvuspb.ListResourceGroupsRequest) (*milvuspb.ListResourceGroupsResponse, error) {
return s.proxy.ListResourceGroups(ctx, req)
}
func (s *Server) ListIndexedSegment(ctx context.Context, req *federpb.ListIndexedSegmentRequest) (*federpb.ListIndexedSegmentResponse, error) {
panic("TODO: implement me")
}
func (s *Server) DescribeSegmentIndexData(ctx context.Context, req *federpb.DescribeSegmentIndexDataRequest) (*federpb.DescribeSegmentIndexDataResponse, error) {
panic("TODO: implement me")
}

View File

@ -415,6 +415,10 @@ func (m *MockDataCoord) GetFlushState(ctx context.Context, req *milvuspb.GetFlus
return nil, nil
}
func (m *MockDataCoord) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return nil, nil
}
func (m *MockDataCoord) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
return &datapb.DropVirtualChannelResponse{}, nil
}
@ -626,6 +630,10 @@ func (m *MockProxy) CalcDistance(ctx context.Context, request *milvuspb.CalcDist
return nil, nil
}
func (m *MockProxy) FlushAll(ctx context.Context, request *milvuspb.FlushAllRequest) (*milvuspb.FlushAllResponse, error) {
return nil, nil
}
func (m *MockProxy) GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error) {
return nil, nil
}
@ -724,6 +732,10 @@ func (m *MockProxy) GetFlushState(ctx context.Context, req *milvuspb.GetFlushSta
return nil, nil
}
func (m *MockProxy) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return nil, nil
}
func (m *MockProxy) Import(ctx context.Context, req *milvuspb.ImportRequest) (*milvuspb.ImportResponse, error) {
return nil, nil
}
@ -1290,6 +1302,16 @@ func Test_NewServer(t *testing.T) {
assert.Nil(t, err)
})
t.Run("FlushAll", func(t *testing.T) {
_, err := server.FlushAll(ctx, nil)
assert.Nil(t, err)
})
t.Run("GetFlushAllState", func(t *testing.T) {
_, err := server.GetFlushAllState(ctx, nil)
assert.Nil(t, err)
})
err = server.Stop()
assert.Nil(t, err)

View File

@ -1,4 +1,4 @@
// Code generated by mockery v2.15.0. DO NOT EDIT.
// Code generated by mockery v2.14.0. DO NOT EDIT.
package mocks
@ -60,8 +60,8 @@ type DataCoord_AssignSegmentID_Call struct {
}
// AssignSegmentID is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.AssignSegmentIDRequest
// - ctx context.Context
// - req *datapb.AssignSegmentIDRequest
func (_e *DataCoord_Expecter) AssignSegmentID(ctx interface{}, req interface{}) *DataCoord_AssignSegmentID_Call {
return &DataCoord_AssignSegmentID_Call{Call: _e.mock.On("AssignSegmentID", ctx, req)}
}
@ -107,8 +107,8 @@ type DataCoord_BroadcastAlteredCollection_Call struct {
}
// BroadcastAlteredCollection is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.AlterCollectionRequest
// - ctx context.Context
// - req *datapb.AlterCollectionRequest
func (_e *DataCoord_Expecter) BroadcastAlteredCollection(ctx interface{}, req interface{}) *DataCoord_BroadcastAlteredCollection_Call {
return &DataCoord_BroadcastAlteredCollection_Call{Call: _e.mock.On("BroadcastAlteredCollection", ctx, req)}
}
@ -154,8 +154,8 @@ type DataCoord_CheckHealth_Call struct {
}
// CheckHealth is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.CheckHealthRequest
// - ctx context.Context
// - req *milvuspb.CheckHealthRequest
func (_e *DataCoord_Expecter) CheckHealth(ctx interface{}, req interface{}) *DataCoord_CheckHealth_Call {
return &DataCoord_CheckHealth_Call{Call: _e.mock.On("CheckHealth", ctx, req)}
}
@ -201,8 +201,8 @@ type DataCoord_CreateIndex_Call struct {
}
// CreateIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.CreateIndexRequest
// - ctx context.Context
// - req *indexpb.CreateIndexRequest
func (_e *DataCoord_Expecter) CreateIndex(ctx interface{}, req interface{}) *DataCoord_CreateIndex_Call {
return &DataCoord_CreateIndex_Call{Call: _e.mock.On("CreateIndex", ctx, req)}
}
@ -248,8 +248,8 @@ type DataCoord_DescribeIndex_Call struct {
}
// DescribeIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.DescribeIndexRequest
// - ctx context.Context
// - req *indexpb.DescribeIndexRequest
func (_e *DataCoord_Expecter) DescribeIndex(ctx interface{}, req interface{}) *DataCoord_DescribeIndex_Call {
return &DataCoord_DescribeIndex_Call{Call: _e.mock.On("DescribeIndex", ctx, req)}
}
@ -295,8 +295,8 @@ type DataCoord_DropIndex_Call struct {
}
// DropIndex is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.DropIndexRequest
// - ctx context.Context
// - req *indexpb.DropIndexRequest
func (_e *DataCoord_Expecter) DropIndex(ctx interface{}, req interface{}) *DataCoord_DropIndex_Call {
return &DataCoord_DropIndex_Call{Call: _e.mock.On("DropIndex", ctx, req)}
}
@ -342,8 +342,8 @@ type DataCoord_DropVirtualChannel_Call struct {
}
// DropVirtualChannel is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.DropVirtualChannelRequest
// - ctx context.Context
// - req *datapb.DropVirtualChannelRequest
func (_e *DataCoord_Expecter) DropVirtualChannel(ctx interface{}, req interface{}) *DataCoord_DropVirtualChannel_Call {
return &DataCoord_DropVirtualChannel_Call{Call: _e.mock.On("DropVirtualChannel", ctx, req)}
}
@ -389,8 +389,8 @@ type DataCoord_Flush_Call struct {
}
// Flush is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.FlushRequest
// - ctx context.Context
// - req *datapb.FlushRequest
func (_e *DataCoord_Expecter) Flush(ctx interface{}, req interface{}) *DataCoord_Flush_Call {
return &DataCoord_Flush_Call{Call: _e.mock.On("Flush", ctx, req)}
}
@ -436,8 +436,8 @@ type DataCoord_GcConfirm_Call struct {
}
// GcConfirm is a helper method to define mock.On call
// - ctx context.Context
// - request *datapb.GcConfirmRequest
// - ctx context.Context
// - request *datapb.GcConfirmRequest
func (_e *DataCoord_Expecter) GcConfirm(ctx interface{}, request interface{}) *DataCoord_GcConfirm_Call {
return &DataCoord_GcConfirm_Call{Call: _e.mock.On("GcConfirm", ctx, request)}
}
@ -483,8 +483,8 @@ type DataCoord_GetCollectionStatistics_Call struct {
}
// GetCollectionStatistics is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetCollectionStatisticsRequest
// - ctx context.Context
// - req *datapb.GetCollectionStatisticsRequest
func (_e *DataCoord_Expecter) GetCollectionStatistics(ctx interface{}, req interface{}) *DataCoord_GetCollectionStatistics_Call {
return &DataCoord_GetCollectionStatistics_Call{Call: _e.mock.On("GetCollectionStatistics", ctx, req)}
}
@ -530,8 +530,8 @@ type DataCoord_GetCompactionState_Call struct {
}
// GetCompactionState is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.GetCompactionStateRequest
// - ctx context.Context
// - req *milvuspb.GetCompactionStateRequest
func (_e *DataCoord_Expecter) GetCompactionState(ctx interface{}, req interface{}) *DataCoord_GetCompactionState_Call {
return &DataCoord_GetCompactionState_Call{Call: _e.mock.On("GetCompactionState", ctx, req)}
}
@ -577,8 +577,8 @@ type DataCoord_GetCompactionStateWithPlans_Call struct {
}
// GetCompactionStateWithPlans is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.GetCompactionPlansRequest
// - ctx context.Context
// - req *milvuspb.GetCompactionPlansRequest
func (_e *DataCoord_Expecter) GetCompactionStateWithPlans(ctx interface{}, req interface{}) *DataCoord_GetCompactionStateWithPlans_Call {
return &DataCoord_GetCompactionStateWithPlans_Call{Call: _e.mock.On("GetCompactionStateWithPlans", ctx, req)}
}
@ -624,7 +624,7 @@ type DataCoord_GetComponentStates_Call struct {
}
// GetComponentStates is a helper method to define mock.On call
// - ctx context.Context
// - ctx context.Context
func (_e *DataCoord_Expecter) GetComponentStates(ctx interface{}) *DataCoord_GetComponentStates_Call {
return &DataCoord_GetComponentStates_Call{Call: _e.mock.On("GetComponentStates", ctx)}
}
@ -641,6 +641,53 @@ func (_c *DataCoord_GetComponentStates_Call) Return(_a0 *milvuspb.ComponentState
return _c
}
// GetFlushAllState provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
ret := _m.Called(ctx, req)
var r0 *milvuspb.GetFlushAllStateResponse
if rf, ok := ret.Get(0).(func(context.Context, *milvuspb.GetFlushAllStateRequest) *milvuspb.GetFlushAllStateResponse); ok {
r0 = rf(ctx, req)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*milvuspb.GetFlushAllStateResponse)
}
}
var r1 error
if rf, ok := ret.Get(1).(func(context.Context, *milvuspb.GetFlushAllStateRequest) error); ok {
r1 = rf(ctx, req)
} else {
r1 = ret.Error(1)
}
return r0, r1
}
// DataCoord_GetFlushAllState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFlushAllState'
type DataCoord_GetFlushAllState_Call struct {
*mock.Call
}
// GetFlushAllState is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.GetFlushAllStateRequest
func (_e *DataCoord_Expecter) GetFlushAllState(ctx interface{}, req interface{}) *DataCoord_GetFlushAllState_Call {
return &DataCoord_GetFlushAllState_Call{Call: _e.mock.On("GetFlushAllState", ctx, req)}
}
func (_c *DataCoord_GetFlushAllState_Call) Run(run func(ctx context.Context, req *milvuspb.GetFlushAllStateRequest)) *DataCoord_GetFlushAllState_Call {
_c.Call.Run(func(args mock.Arguments) {
run(args[0].(context.Context), args[1].(*milvuspb.GetFlushAllStateRequest))
})
return _c
}
func (_c *DataCoord_GetFlushAllState_Call) Return(_a0 *milvuspb.GetFlushAllStateResponse, _a1 error) *DataCoord_GetFlushAllState_Call {
_c.Call.Return(_a0, _a1)
return _c
}
// GetFlushState provides a mock function with given fields: ctx, req
func (_m *DataCoord) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateRequest) (*milvuspb.GetFlushStateResponse, error) {
ret := _m.Called(ctx, req)
@ -670,8 +717,8 @@ type DataCoord_GetFlushState_Call struct {
}
// GetFlushState is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.GetFlushStateRequest
// - ctx context.Context
// - req *milvuspb.GetFlushStateRequest
func (_e *DataCoord_Expecter) GetFlushState(ctx interface{}, req interface{}) *DataCoord_GetFlushState_Call {
return &DataCoord_GetFlushState_Call{Call: _e.mock.On("GetFlushState", ctx, req)}
}
@ -717,8 +764,8 @@ type DataCoord_GetFlushedSegments_Call struct {
}
// GetFlushedSegments is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetFlushedSegmentsRequest
// - ctx context.Context
// - req *datapb.GetFlushedSegmentsRequest
func (_e *DataCoord_Expecter) GetFlushedSegments(ctx interface{}, req interface{}) *DataCoord_GetFlushedSegments_Call {
return &DataCoord_GetFlushedSegments_Call{Call: _e.mock.On("GetFlushedSegments", ctx, req)}
}
@ -764,8 +811,8 @@ type DataCoord_GetIndexBuildProgress_Call struct {
}
// GetIndexBuildProgress is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexBuildProgressRequest
// - ctx context.Context
// - req *indexpb.GetIndexBuildProgressRequest
func (_e *DataCoord_Expecter) GetIndexBuildProgress(ctx interface{}, req interface{}) *DataCoord_GetIndexBuildProgress_Call {
return &DataCoord_GetIndexBuildProgress_Call{Call: _e.mock.On("GetIndexBuildProgress", ctx, req)}
}
@ -811,8 +858,8 @@ type DataCoord_GetIndexInfos_Call struct {
}
// GetIndexInfos is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexInfoRequest
// - ctx context.Context
// - req *indexpb.GetIndexInfoRequest
func (_e *DataCoord_Expecter) GetIndexInfos(ctx interface{}, req interface{}) *DataCoord_GetIndexInfos_Call {
return &DataCoord_GetIndexInfos_Call{Call: _e.mock.On("GetIndexInfos", ctx, req)}
}
@ -858,8 +905,8 @@ type DataCoord_GetIndexState_Call struct {
}
// GetIndexState is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetIndexStateRequest
// - ctx context.Context
// - req *indexpb.GetIndexStateRequest
func (_e *DataCoord_Expecter) GetIndexState(ctx interface{}, req interface{}) *DataCoord_GetIndexState_Call {
return &DataCoord_GetIndexState_Call{Call: _e.mock.On("GetIndexState", ctx, req)}
}
@ -905,8 +952,8 @@ type DataCoord_GetInsertBinlogPaths_Call struct {
}
// GetInsertBinlogPaths is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetInsertBinlogPathsRequest
// - ctx context.Context
// - req *datapb.GetInsertBinlogPathsRequest
func (_e *DataCoord_Expecter) GetInsertBinlogPaths(ctx interface{}, req interface{}) *DataCoord_GetInsertBinlogPaths_Call {
return &DataCoord_GetInsertBinlogPaths_Call{Call: _e.mock.On("GetInsertBinlogPaths", ctx, req)}
}
@ -952,8 +999,8 @@ type DataCoord_GetMetrics_Call struct {
}
// GetMetrics is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.GetMetricsRequest
// - ctx context.Context
// - req *milvuspb.GetMetricsRequest
func (_e *DataCoord_Expecter) GetMetrics(ctx interface{}, req interface{}) *DataCoord_GetMetrics_Call {
return &DataCoord_GetMetrics_Call{Call: _e.mock.On("GetMetrics", ctx, req)}
}
@ -999,8 +1046,8 @@ type DataCoord_GetPartitionStatistics_Call struct {
}
// GetPartitionStatistics is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetPartitionStatisticsRequest
// - ctx context.Context
// - req *datapb.GetPartitionStatisticsRequest
func (_e *DataCoord_Expecter) GetPartitionStatistics(ctx interface{}, req interface{}) *DataCoord_GetPartitionStatistics_Call {
return &DataCoord_GetPartitionStatistics_Call{Call: _e.mock.On("GetPartitionStatistics", ctx, req)}
}
@ -1046,8 +1093,8 @@ type DataCoord_GetRecoveryInfo_Call struct {
}
// GetRecoveryInfo is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetRecoveryInfoRequest
// - ctx context.Context
// - req *datapb.GetRecoveryInfoRequest
func (_e *DataCoord_Expecter) GetRecoveryInfo(ctx interface{}, req interface{}) *DataCoord_GetRecoveryInfo_Call {
return &DataCoord_GetRecoveryInfo_Call{Call: _e.mock.On("GetRecoveryInfo", ctx, req)}
}
@ -1093,8 +1140,8 @@ type DataCoord_GetSegmentIndexState_Call struct {
}
// GetSegmentIndexState is a helper method to define mock.On call
// - ctx context.Context
// - req *indexpb.GetSegmentIndexStateRequest
// - ctx context.Context
// - req *indexpb.GetSegmentIndexStateRequest
func (_e *DataCoord_Expecter) GetSegmentIndexState(ctx interface{}, req interface{}) *DataCoord_GetSegmentIndexState_Call {
return &DataCoord_GetSegmentIndexState_Call{Call: _e.mock.On("GetSegmentIndexState", ctx, req)}
}
@ -1140,8 +1187,8 @@ type DataCoord_GetSegmentInfo_Call struct {
}
// GetSegmentInfo is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetSegmentInfoRequest
// - ctx context.Context
// - req *datapb.GetSegmentInfoRequest
func (_e *DataCoord_Expecter) GetSegmentInfo(ctx interface{}, req interface{}) *DataCoord_GetSegmentInfo_Call {
return &DataCoord_GetSegmentInfo_Call{Call: _e.mock.On("GetSegmentInfo", ctx, req)}
}
@ -1187,7 +1234,7 @@ type DataCoord_GetSegmentInfoChannel_Call struct {
}
// GetSegmentInfoChannel is a helper method to define mock.On call
// - ctx context.Context
// - ctx context.Context
func (_e *DataCoord_Expecter) GetSegmentInfoChannel(ctx interface{}) *DataCoord_GetSegmentInfoChannel_Call {
return &DataCoord_GetSegmentInfoChannel_Call{Call: _e.mock.On("GetSegmentInfoChannel", ctx)}
}
@ -1233,8 +1280,8 @@ type DataCoord_GetSegmentStates_Call struct {
}
// GetSegmentStates is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetSegmentStatesRequest
// - ctx context.Context
// - req *datapb.GetSegmentStatesRequest
func (_e *DataCoord_Expecter) GetSegmentStates(ctx interface{}, req interface{}) *DataCoord_GetSegmentStates_Call {
return &DataCoord_GetSegmentStates_Call{Call: _e.mock.On("GetSegmentStates", ctx, req)}
}
@ -1280,8 +1327,8 @@ type DataCoord_GetSegmentsByStates_Call struct {
}
// GetSegmentsByStates is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.GetSegmentsByStatesRequest
// - ctx context.Context
// - req *datapb.GetSegmentsByStatesRequest
func (_e *DataCoord_Expecter) GetSegmentsByStates(ctx interface{}, req interface{}) *DataCoord_GetSegmentsByStates_Call {
return &DataCoord_GetSegmentsByStates_Call{Call: _e.mock.On("GetSegmentsByStates", ctx, req)}
}
@ -1327,7 +1374,7 @@ type DataCoord_GetStatisticsChannel_Call struct {
}
// GetStatisticsChannel is a helper method to define mock.On call
// - ctx context.Context
// - ctx context.Context
func (_e *DataCoord_Expecter) GetStatisticsChannel(ctx interface{}) *DataCoord_GetStatisticsChannel_Call {
return &DataCoord_GetStatisticsChannel_Call{Call: _e.mock.On("GetStatisticsChannel", ctx)}
}
@ -1373,7 +1420,7 @@ type DataCoord_GetTimeTickChannel_Call struct {
}
// GetTimeTickChannel is a helper method to define mock.On call
// - ctx context.Context
// - ctx context.Context
func (_e *DataCoord_Expecter) GetTimeTickChannel(ctx interface{}) *DataCoord_GetTimeTickChannel_Call {
return &DataCoord_GetTimeTickChannel_Call{Call: _e.mock.On("GetTimeTickChannel", ctx)}
}
@ -1419,8 +1466,8 @@ type DataCoord_Import_Call struct {
}
// Import is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.ImportTaskRequest
// - ctx context.Context
// - req *datapb.ImportTaskRequest
func (_e *DataCoord_Expecter) Import(ctx interface{}, req interface{}) *DataCoord_Import_Call {
return &DataCoord_Import_Call{Call: _e.mock.On("Import", ctx, req)}
}
@ -1502,8 +1549,8 @@ type DataCoord_ManualCompaction_Call struct {
}
// ManualCompaction is a helper method to define mock.On call
// - ctx context.Context
// - req *milvuspb.ManualCompactionRequest
// - ctx context.Context
// - req *milvuspb.ManualCompactionRequest
func (_e *DataCoord_Expecter) ManualCompaction(ctx interface{}, req interface{}) *DataCoord_ManualCompaction_Call {
return &DataCoord_ManualCompaction_Call{Call: _e.mock.On("ManualCompaction", ctx, req)}
}
@ -1549,8 +1596,8 @@ type DataCoord_MarkSegmentsDropped_Call struct {
}
// MarkSegmentsDropped is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.MarkSegmentsDroppedRequest
// - ctx context.Context
// - req *datapb.MarkSegmentsDroppedRequest
func (_e *DataCoord_Expecter) MarkSegmentsDropped(ctx interface{}, req interface{}) *DataCoord_MarkSegmentsDropped_Call {
return &DataCoord_MarkSegmentsDropped_Call{Call: _e.mock.On("MarkSegmentsDropped", ctx, req)}
}
@ -1632,8 +1679,8 @@ type DataCoord_SaveBinlogPaths_Call struct {
}
// SaveBinlogPaths is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.SaveBinlogPathsRequest
// - ctx context.Context
// - req *datapb.SaveBinlogPathsRequest
func (_e *DataCoord_Expecter) SaveBinlogPaths(ctx interface{}, req interface{}) *DataCoord_SaveBinlogPaths_Call {
return &DataCoord_SaveBinlogPaths_Call{Call: _e.mock.On("SaveBinlogPaths", ctx, req)}
}
@ -1679,8 +1726,8 @@ type DataCoord_SaveImportSegment_Call struct {
}
// SaveImportSegment is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.SaveImportSegmentRequest
// - ctx context.Context
// - req *datapb.SaveImportSegmentRequest
func (_e *DataCoord_Expecter) SaveImportSegment(ctx interface{}, req interface{}) *DataCoord_SaveImportSegment_Call {
return &DataCoord_SaveImportSegment_Call{Call: _e.mock.On("SaveImportSegment", ctx, req)}
}
@ -1726,8 +1773,8 @@ type DataCoord_SetSegmentState_Call struct {
}
// SetSegmentState is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.SetSegmentStateRequest
// - ctx context.Context
// - req *datapb.SetSegmentStateRequest
func (_e *DataCoord_Expecter) SetSegmentState(ctx interface{}, req interface{}) *DataCoord_SetSegmentState_Call {
return &DataCoord_SetSegmentState_Call{Call: _e.mock.On("SetSegmentState", ctx, req)}
}
@ -1773,8 +1820,8 @@ type DataCoord_ShowConfigurations_Call struct {
}
// ShowConfigurations is a helper method to define mock.On call
// - ctx context.Context
// - req *internalpb.ShowConfigurationsRequest
// - ctx context.Context
// - req *internalpb.ShowConfigurationsRequest
func (_e *DataCoord_Expecter) ShowConfigurations(ctx interface{}, req interface{}) *DataCoord_ShowConfigurations_Call {
return &DataCoord_ShowConfigurations_Call{Call: _e.mock.On("ShowConfigurations", ctx, req)}
}
@ -1892,8 +1939,8 @@ type DataCoord_UnsetIsImportingState_Call struct {
}
// UnsetIsImportingState is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.UnsetIsImportingStateRequest
// - ctx context.Context
// - req *datapb.UnsetIsImportingStateRequest
func (_e *DataCoord_Expecter) UnsetIsImportingState(ctx interface{}, req interface{}) *DataCoord_UnsetIsImportingState_Call {
return &DataCoord_UnsetIsImportingState_Call{Call: _e.mock.On("UnsetIsImportingState", ctx, req)}
}
@ -1939,8 +1986,8 @@ type DataCoord_UpdateChannelCheckpoint_Call struct {
}
// UpdateChannelCheckpoint is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.UpdateChannelCheckpointRequest
// - ctx context.Context
// - req *datapb.UpdateChannelCheckpointRequest
func (_e *DataCoord_Expecter) UpdateChannelCheckpoint(ctx interface{}, req interface{}) *DataCoord_UpdateChannelCheckpoint_Call {
return &DataCoord_UpdateChannelCheckpoint_Call{Call: _e.mock.On("UpdateChannelCheckpoint", ctx, req)}
}
@ -1986,8 +2033,8 @@ type DataCoord_UpdateSegmentStatistics_Call struct {
}
// UpdateSegmentStatistics is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.UpdateSegmentStatisticsRequest
// - ctx context.Context
// - req *datapb.UpdateSegmentStatisticsRequest
func (_e *DataCoord_Expecter) UpdateSegmentStatistics(ctx interface{}, req interface{}) *DataCoord_UpdateSegmentStatistics_Call {
return &DataCoord_UpdateSegmentStatistics_Call{Call: _e.mock.On("UpdateSegmentStatistics", ctx, req)}
}
@ -2033,8 +2080,8 @@ type DataCoord_WatchChannels_Call struct {
}
// WatchChannels is a helper method to define mock.On call
// - ctx context.Context
// - req *datapb.WatchChannelsRequest
// - ctx context.Context
// - req *datapb.WatchChannelsRequest
func (_e *DataCoord_Expecter) WatchChannels(ctx interface{}, req interface{}) *DataCoord_WatchChannels_Call {
return &DataCoord_WatchChannels_Call{Call: _e.mock.On("WatchChannels", ctx, req)}
}

View File

@ -43,6 +43,7 @@ service DataCoord {
rpc GetRecoveryInfo(GetRecoveryInfoRequest) returns (GetRecoveryInfoResponse){}
rpc GetFlushedSegments(GetFlushedSegmentsRequest) returns(GetFlushedSegmentsResponse){}
rpc GetSegmentsByStates(GetSegmentsByStatesRequest) returns(GetSegmentsByStatesResponse){}
rpc GetFlushAllState(milvus.GetFlushAllStateRequest) returns(milvus.GetFlushAllStateResponse) {}
rpc ShowConfigurations(internal.ShowConfigurationsRequest) returns (internal.ShowConfigurationsResponse){}
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy

View File

@ -4867,297 +4867,298 @@ func init() {
func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) }
var fileDescriptor_82cd95f524594f49 = []byte{
// 4626 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x4b, 0x6c, 0x1b, 0x49,
0x76, 0x6e, 0xfe, 0x44, 0x3e, 0x52, 0x14, 0x55, 0xf6, 0xc8, 0x34, 0xfd, 0x9d, 0xb6, 0x3d, 0xd6,
0x78, 0x3c, 0xb6, 0xc7, 0xce, 0x62, 0x67, 0xd7, 0x3b, 0xb3, 0x6b, 0x49, 0x63, 0x0f, 0x13, 0xcb,
0xab, 0x6d, 0xc9, 0xe3, 0x60, 0x36, 0x00, 0xd1, 0x62, 0x97, 0xa8, 0x5e, 0x91, 0xdd, 0x74, 0x77,
0x53, 0xb2, 0x26, 0x40, 0x32, 0xf9, 0x02, 0xf9, 0x20, 0x09, 0x02, 0x04, 0x49, 0x6e, 0x8b, 0x1c,
0x82, 0x4d, 0x82, 0x3d, 0x6d, 0x72, 0xc9, 0x25, 0xd7, 0x01, 0x72, 0x58, 0x04, 0x01, 0x02, 0xe4,
0x90, 0x6b, 0x90, 0x7b, 0x80, 0x9c, 0x83, 0xfa, 0x74, 0xf5, 0xaf, 0xba, 0xd9, 0x22, 0xed, 0x31,
0x90, 0xdc, 0x58, 0xd5, 0xaf, 0x5e, 0xbd, 0xaa, 0xf7, 0x7f, 0x55, 0x45, 0x68, 0x19, 0xba, 0xa7,
0xf7, 0xfa, 0xb6, 0xed, 0x18, 0xb7, 0xc7, 0x8e, 0xed, 0xd9, 0x68, 0x79, 0x64, 0x0e, 0x0f, 0x27,
0x2e, 0x6b, 0xdd, 0x26, 0x9f, 0x3b, 0x8d, 0xbe, 0x3d, 0x1a, 0xd9, 0x16, 0xeb, 0xea, 0x34, 0x4d,
0xcb, 0xc3, 0x8e, 0xa5, 0x0f, 0x79, 0xbb, 0x11, 0x1e, 0xd0, 0x69, 0xb8, 0xfd, 0x7d, 0x3c, 0xd2,
0x79, 0xab, 0x36, 0x72, 0x07, 0xfc, 0xe7, 0xb2, 0x69, 0x19, 0xf8, 0x65, 0x78, 0x2a, 0x75, 0x01,
0xca, 0x9f, 0x8c, 0xc6, 0xde, 0xb1, 0xfa, 0xf7, 0x0a, 0x34, 0x1e, 0x0d, 0x27, 0xee, 0xbe, 0x86,
0x5f, 0x4c, 0xb0, 0xeb, 0xa1, 0xbb, 0x50, 0xda, 0xd5, 0x5d, 0xdc, 0x56, 0xae, 0x28, 0xab, 0xf5,
0x7b, 0x17, 0x6e, 0x47, 0x68, 0xe2, 0xd4, 0x6c, 0xba, 0x83, 0x35, 0xdd, 0xc5, 0x1a, 0x85, 0x44,
0x08, 0x4a, 0xc6, 0x6e, 0x77, 0xa3, 0x5d, 0xb8, 0xa2, 0xac, 0x16, 0x35, 0xfa, 0x1b, 0x5d, 0x02,
0x70, 0xf1, 0x60, 0x84, 0x2d, 0xaf, 0xbb, 0xe1, 0xb6, 0x8b, 0x57, 0x8a, 0xab, 0x45, 0x2d, 0xd4,
0x83, 0x54, 0x68, 0xf4, 0xed, 0xe1, 0x10, 0xf7, 0x3d, 0xd3, 0xb6, 0xba, 0x1b, 0xed, 0x12, 0x1d,
0x1b, 0xe9, 0x43, 0x1d, 0xa8, 0x9a, 0x6e, 0x77, 0x34, 0xb6, 0x1d, 0xaf, 0x5d, 0xbe, 0xa2, 0xac,
0x56, 0x35, 0xd1, 0x56, 0xff, 0x53, 0x81, 0x45, 0x4e, 0xb6, 0x3b, 0xb6, 0x2d, 0x17, 0xa3, 0xfb,
0x50, 0x71, 0x3d, 0xdd, 0x9b, 0xb8, 0x9c, 0xf2, 0xf3, 0x52, 0xca, 0xb7, 0x29, 0x88, 0xc6, 0x41,
0xa5, 0xa4, 0xc7, 0x49, 0x2b, 0x4a, 0x48, 0x8b, 0x2e, 0xaf, 0x94, 0x58, 0xde, 0x2a, 0x2c, 0xed,
0x11, 0xea, 0xb6, 0x03, 0xa0, 0x32, 0x05, 0x8a, 0x77, 0x13, 0x4c, 0x9e, 0x39, 0xc2, 0xdf, 0xdf,
0xdb, 0xc6, 0xfa, 0xb0, 0x5d, 0xa1, 0x73, 0x85, 0x7a, 0xd4, 0x7f, 0x51, 0xa0, 0x25, 0xc0, 0x7d,
0x1e, 0x9d, 0x81, 0x72, 0xdf, 0x9e, 0x58, 0x1e, 0x5d, 0xea, 0xa2, 0xc6, 0x1a, 0xe8, 0x6d, 0x68,
0xf4, 0xf7, 0x75, 0xcb, 0xc2, 0xc3, 0x9e, 0xa5, 0x8f, 0x30, 0x5d, 0x54, 0x4d, 0xab, 0xf3, 0xbe,
0xa7, 0xfa, 0x08, 0xe7, 0x5a, 0xdb, 0x15, 0xa8, 0x8f, 0x75, 0xc7, 0x33, 0x23, 0x9c, 0x09, 0x77,
0x65, 0x31, 0x86, 0xcc, 0x60, 0xd2, 0x5f, 0x3b, 0xba, 0x7b, 0xd0, 0xdd, 0xe0, 0x2b, 0x8a, 0xf4,
0xa9, 0x3f, 0x56, 0x60, 0xe5, 0xa1, 0xeb, 0x9a, 0x03, 0x2b, 0xb1, 0xb2, 0x15, 0xa8, 0x58, 0xb6,
0x81, 0xbb, 0x1b, 0x74, 0x69, 0x45, 0x8d, 0xb7, 0xd0, 0x79, 0xa8, 0x8d, 0x31, 0x76, 0x7a, 0x8e,
0x3d, 0xf4, 0x17, 0x56, 0x25, 0x1d, 0x9a, 0x3d, 0xc4, 0xe8, 0x07, 0xb0, 0xec, 0xc6, 0x10, 0x31,
0x99, 0xab, 0xdf, 0xbb, 0x7a, 0x3b, 0xa1, 0x53, 0xb7, 0xe3, 0x93, 0x6a, 0xc9, 0xd1, 0xea, 0x97,
0x05, 0x38, 0x2d, 0xe0, 0x18, 0xad, 0xe4, 0x37, 0xd9, 0x79, 0x17, 0x0f, 0x04, 0x79, 0xac, 0x91,
0x67, 0xe7, 0x05, 0xcb, 0x8a, 0x61, 0x96, 0xe5, 0x51, 0x83, 0x18, 0x3f, 0xca, 0x49, 0x7e, 0x5c,
0x86, 0x3a, 0x7e, 0x39, 0x36, 0x1d, 0xdc, 0x23, 0x82, 0x43, 0xb7, 0xbc, 0xa4, 0x01, 0xeb, 0xda,
0x31, 0x47, 0x61, 0xdd, 0x58, 0xc8, 0xad, 0x1b, 0xea, 0x5f, 0x29, 0x70, 0x36, 0xc1, 0x25, 0xae,
0x6c, 0x1a, 0xb4, 0xe8, 0xca, 0x83, 0x9d, 0x21, 0x6a, 0x47, 0x36, 0xfc, 0x9d, 0xac, 0x0d, 0x0f,
0xc0, 0xb5, 0xc4, 0xf8, 0x10, 0x91, 0x85, 0xfc, 0x44, 0x1e, 0xc0, 0xd9, 0xc7, 0xd8, 0xe3, 0x13,
0x90, 0x6f, 0xd8, 0x9d, 0xdd, 0x90, 0x45, 0xb5, 0xba, 0x10, 0xd7, 0x6a, 0xf5, 0xaf, 0x0b, 0x42,
0x17, 0xe9, 0x54, 0x5d, 0x6b, 0xcf, 0x46, 0x17, 0xa0, 0x26, 0x40, 0xb8, 0x54, 0x04, 0x1d, 0xe8,
0x9b, 0x50, 0x26, 0x94, 0x32, 0x91, 0x68, 0xde, 0x7b, 0x5b, 0xbe, 0xa6, 0x10, 0x4e, 0x8d, 0xc1,
0xa3, 0x0d, 0x68, 0xba, 0x9e, 0xee, 0x78, 0xbd, 0xb1, 0xed, 0x52, 0x3e, 0x53, 0xc1, 0xa9, 0xdf,
0xbb, 0x18, 0xc5, 0x40, 0x8c, 0xfc, 0xa6, 0x3b, 0xd8, 0xe2, 0x40, 0xda, 0x22, 0x1d, 0xe4, 0x37,
0xd1, 0xf7, 0xa0, 0x81, 0x2d, 0x23, 0xc0, 0x51, 0xca, 0x83, 0xa3, 0x8e, 0x2d, 0x43, 0x60, 0x08,
0xb8, 0x52, 0xce, 0xcf, 0x95, 0x3f, 0x54, 0xa0, 0x9d, 0x64, 0xcb, 0x3c, 0x86, 0xfa, 0x01, 0x1b,
0x84, 0x19, 0x5b, 0x32, 0xf5, 0x5a, 0xb0, 0x46, 0xe3, 0x43, 0xd4, 0x3f, 0x53, 0xe0, 0xad, 0x80,
0x1c, 0xfa, 0xe9, 0x75, 0xc9, 0x08, 0xba, 0x09, 0x2d, 0xd3, 0xea, 0x0f, 0x27, 0x06, 0x7e, 0x66,
0x7d, 0x8a, 0xf5, 0xa1, 0xb7, 0x7f, 0x4c, 0x39, 0x57, 0xd5, 0x12, 0xfd, 0xea, 0xbf, 0x17, 0x60,
0x25, 0x4e, 0xd7, 0x3c, 0x9b, 0xf4, 0x0b, 0x50, 0x36, 0xad, 0x3d, 0xdb, 0xdf, 0xa3, 0x4b, 0x19,
0xaa, 0x48, 0xe6, 0x62, 0xc0, 0xc8, 0x06, 0xe4, 0x1b, 0xaf, 0xfe, 0x3e, 0xee, 0x1f, 0x8c, 0x6d,
0x93, 0x9a, 0x29, 0x82, 0xe2, 0x7b, 0x12, 0x14, 0x72, 0x8a, 0x6f, 0xaf, 0x33, 0x1c, 0xeb, 0x02,
0xc5, 0x27, 0x96, 0xe7, 0x1c, 0x6b, 0xcb, 0xfd, 0x78, 0x7f, 0xa7, 0x0f, 0x2b, 0x72, 0x60, 0xd4,
0x82, 0xe2, 0x01, 0x3e, 0xa6, 0x4b, 0xae, 0x69, 0xe4, 0x27, 0xba, 0x0f, 0xe5, 0x43, 0x7d, 0x38,
0xc1, 0xdc, 0x26, 0x4c, 0x91, 0x5c, 0x06, 0xfb, 0xed, 0xc2, 0x87, 0x8a, 0x3a, 0x82, 0xf3, 0x8f,
0xb1, 0xd7, 0xb5, 0x5c, 0xec, 0x78, 0x6b, 0xa6, 0x35, 0xb4, 0x07, 0x5b, 0xba, 0xb7, 0x3f, 0x87,
0x71, 0x88, 0xe8, 0x79, 0x21, 0xa6, 0xe7, 0xea, 0x4f, 0x14, 0xb8, 0x20, 0x9f, 0x8f, 0x33, 0xb4,
0x03, 0xd5, 0x3d, 0x13, 0x0f, 0x0d, 0x22, 0x35, 0x0a, 0x95, 0x1a, 0xd1, 0x26, 0x46, 0x62, 0x4c,
0x80, 0x39, 0xdf, 0x62, 0x46, 0x42, 0xc4, 0x7c, 0xdb, 0x9e, 0x63, 0x5a, 0x83, 0x27, 0xa6, 0xeb,
0x69, 0x0c, 0x3e, 0x24, 0x25, 0xc5, 0xfc, 0xca, 0xf9, 0xfb, 0x0a, 0x5c, 0x7a, 0x8c, 0xbd, 0x75,
0xe1, 0x63, 0xc8, 0x77, 0xd3, 0xf5, 0xcc, 0xbe, 0xfb, 0x6a, 0x63, 0xc0, 0x1c, 0xc1, 0x86, 0xfa,
0xc7, 0x0a, 0x5c, 0x4e, 0x25, 0x86, 0x6f, 0x1d, 0xb7, 0xa1, 0xbe, 0x87, 0x91, 0xdb, 0xd0, 0x5f,
0xc2, 0xc7, 0x9f, 0x11, 0xe6, 0x6f, 0xe9, 0xa6, 0xc3, 0x6c, 0xe8, 0x8c, 0x1e, 0xe5, 0xa7, 0x0a,
0x5c, 0x7c, 0x8c, 0xbd, 0x2d, 0xdf, 0xbf, 0xbe, 0xc1, 0xdd, 0x21, 0x30, 0x21, 0x3f, 0xef, 0x07,
0x9a, 0x91, 0x3e, 0xf5, 0x8f, 0x18, 0x3b, 0xa5, 0xf4, 0xbe, 0x91, 0x0d, 0xbc, 0x44, 0x35, 0x21,
0x64, 0x22, 0xb8, 0xb2, 0xf3, 0xed, 0x53, 0x7f, 0xbb, 0x0c, 0x8d, 0xcf, 0xb8, 0x55, 0xa0, 0x1e,
0x34, 0xbe, 0x13, 0x8a, 0x3c, 0x08, 0x0a, 0x45, 0x53, 0xb2, 0x00, 0x6b, 0x0d, 0x16, 0x5d, 0x8c,
0x0f, 0x4e, 0xe8, 0x2f, 0x1b, 0x64, 0x8c, 0x70, 0x76, 0x4f, 0x60, 0x79, 0x62, 0xd1, 0x08, 0x1d,
0x1b, 0x7c, 0x01, 0x6c, 0xd3, 0xa7, 0x1b, 0xd3, 0xe4, 0x40, 0xf4, 0x29, 0x4f, 0x02, 0x42, 0xb8,
0xca, 0xb9, 0x70, 0xc5, 0x87, 0xa1, 0x2e, 0xb4, 0x0c, 0xc7, 0x1e, 0x8f, 0xb1, 0xd1, 0x73, 0x7d,
0x54, 0x95, 0x7c, 0xa8, 0xf8, 0x38, 0x81, 0xea, 0x2e, 0x9c, 0x8e, 0x53, 0xda, 0x35, 0x48, 0x5c,
0x48, 0x24, 0x4b, 0xf6, 0x09, 0xdd, 0x82, 0xe5, 0x24, 0x7c, 0x95, 0xc2, 0x27, 0x3f, 0xa0, 0xf7,
0x01, 0xc5, 0x48, 0x25, 0xe0, 0x35, 0x06, 0x1e, 0x25, 0x86, 0x83, 0xd3, 0xe4, 0x34, 0x0a, 0x0e,
0x0c, 0x9c, 0x7f, 0x09, 0x81, 0x77, 0x89, 0x77, 0x8d, 0x80, 0xbb, 0xed, 0x7a, 0xbe, 0x8d, 0x88,
0x22, 0x73, 0xd5, 0xdf, 0x53, 0x60, 0xe5, 0xb9, 0xee, 0xf5, 0xf7, 0x37, 0x46, 0x5c, 0x40, 0xe7,
0x50, 0xf0, 0x8f, 0xa0, 0x76, 0xc8, 0x85, 0xd1, 0xb7, 0xe2, 0x97, 0x25, 0x04, 0x85, 0xc5, 0x5e,
0x0b, 0x46, 0x90, 0x84, 0xe8, 0xcc, 0xa3, 0x50, 0x62, 0xf8, 0x06, 0x4c, 0xcd, 0x94, 0x8c, 0x56,
0x7d, 0x09, 0xc0, 0x89, 0xdb, 0x74, 0x07, 0x33, 0xd0, 0xf5, 0x21, 0x2c, 0x70, 0x6c, 0xdc, 0x96,
0x4c, 0x63, 0x98, 0x0f, 0xae, 0xfe, 0xb8, 0x02, 0xf5, 0xd0, 0x07, 0xd4, 0x84, 0x82, 0x30, 0x12,
0x05, 0xc9, 0xea, 0x0a, 0xd3, 0x73, 0xa8, 0x62, 0x32, 0x87, 0xba, 0x0e, 0x4d, 0x93, 0x3a, 0xef,
0x1e, 0xe7, 0x0a, 0x8d, 0x95, 0x6b, 0xda, 0x22, 0xeb, 0xe5, 0x22, 0x82, 0x2e, 0x41, 0xdd, 0x9a,
0x8c, 0x7a, 0xf6, 0x5e, 0xcf, 0xb1, 0x8f, 0x5c, 0x9e, 0x8c, 0xd5, 0xac, 0xc9, 0xe8, 0xfb, 0x7b,
0x9a, 0x7d, 0xe4, 0x06, 0xf1, 0x7e, 0xe5, 0x84, 0xf1, 0xfe, 0x25, 0xa8, 0x8f, 0xf4, 0x97, 0x04,
0x6b, 0xcf, 0x9a, 0x8c, 0x68, 0x9e, 0x56, 0xd4, 0x6a, 0x23, 0xfd, 0xa5, 0x66, 0x1f, 0x3d, 0x9d,
0x8c, 0xd0, 0x2a, 0xb4, 0x86, 0xba, 0xeb, 0xf5, 0xc2, 0x89, 0x5e, 0x95, 0x26, 0x7a, 0x4d, 0xd2,
0xff, 0x49, 0x90, 0xec, 0x25, 0x33, 0x87, 0xda, 0x6c, 0x99, 0x83, 0x31, 0x1a, 0x06, 0x38, 0x20,
0x57, 0xe6, 0x60, 0x8c, 0x86, 0x02, 0xc3, 0x87, 0xb0, 0xb0, 0x4b, 0x03, 0xa1, 0x2c, 0x15, 0x7d,
0x44, 0x62, 0x20, 0x16, 0x2f, 0x69, 0x3e, 0x38, 0xfa, 0x0e, 0xd4, 0xa8, 0xff, 0xa1, 0x63, 0x1b,
0xb9, 0xc6, 0x06, 0x03, 0xc8, 0x68, 0x03, 0x0f, 0x3d, 0x9d, 0x8e, 0x5e, 0xcc, 0x37, 0x5a, 0x0c,
0x20, 0xf6, 0xb1, 0xef, 0x60, 0xdd, 0xc3, 0xc6, 0xda, 0xf1, 0xba, 0x3d, 0x1a, 0xeb, 0x54, 0x84,
0xda, 0x4d, 0x1a, 0xc2, 0xcb, 0x3e, 0xa1, 0x77, 0xa0, 0xd9, 0x17, 0xad, 0x47, 0x8e, 0x3d, 0x6a,
0x2f, 0x51, 0xed, 0x89, 0xf5, 0xa2, 0x8b, 0x00, 0xbe, 0x65, 0xd4, 0xbd, 0x76, 0x8b, 0xf2, 0xae,
0xc6, 0x7b, 0x1e, 0xd2, 0xea, 0x8d, 0xe9, 0xf6, 0x58, 0x9d, 0xc4, 0xb4, 0x06, 0xed, 0x65, 0x3a,
0x63, 0xdd, 0x2f, 0xac, 0x98, 0xd6, 0x00, 0x9d, 0x85, 0x05, 0xd3, 0xed, 0xed, 0xe9, 0x07, 0xb8,
0x8d, 0xe8, 0xd7, 0x8a, 0xe9, 0x3e, 0xd2, 0x0f, 0xb0, 0xfa, 0x05, 0x9c, 0x09, 0x64, 0x2a, 0xc4,
0xc4, 0xa4, 0x28, 0x28, 0x33, 0x88, 0x42, 0x76, 0xe4, 0xfb, 0xf3, 0x12, 0xac, 0x6c, 0xeb, 0x87,
0xf8, 0xf5, 0x07, 0xd9, 0xb9, 0xec, 0xd8, 0x13, 0x58, 0xa6, 0x71, 0xf5, 0xbd, 0x10, 0x3d, 0x19,
0x2e, 0x3c, 0x2c, 0x05, 0xc9, 0x81, 0xe8, 0xbb, 0x24, 0xec, 0xc0, 0xfd, 0x83, 0x2d, 0x92, 0xa3,
0xf8, 0xee, 0xfb, 0xa2, 0x04, 0xcf, 0xba, 0x80, 0xd2, 0xc2, 0x23, 0xd0, 0x16, 0x2c, 0x45, 0x39,
0xe0, 0x3b, 0xee, 0x1b, 0x99, 0x09, 0x6c, 0xb0, 0xfb, 0x5a, 0x33, 0xc2, 0x0c, 0x17, 0xb5, 0x61,
0x81, 0x7b, 0x5d, 0x6a, 0x24, 0xaa, 0x9a, 0xdf, 0x44, 0x5b, 0x70, 0x9a, 0xad, 0x60, 0x9b, 0xeb,
0x02, 0x5b, 0x7c, 0x35, 0xd7, 0xe2, 0x65, 0x43, 0xa3, 0xaa, 0x54, 0x3b, 0xa9, 0x2a, 0xb5, 0x61,
0x81, 0x8b, 0x37, 0xb5, 0x1e, 0x55, 0xcd, 0x6f, 0x12, 0x36, 0x07, 0x82, 0x5e, 0xa7, 0xdf, 0x82,
0x0e, 0xf5, 0x77, 0x14, 0x80, 0x60, 0x3f, 0xa7, 0x14, 0x58, 0xbe, 0x05, 0x55, 0x21, 0xdc, 0xb9,
0x72, 0x44, 0x01, 0x1e, 0xb7, 0xe5, 0xc5, 0x98, 0x2d, 0x57, 0xff, 0x59, 0x81, 0xc6, 0x06, 0x59,
0xcd, 0x13, 0x7b, 0x40, 0x3d, 0xcf, 0x75, 0x68, 0x3a, 0xb8, 0x6f, 0x3b, 0x46, 0x0f, 0x5b, 0x9e,
0x63, 0x62, 0x96, 0x9c, 0x97, 0xb4, 0x45, 0xd6, 0xfb, 0x09, 0xeb, 0x24, 0x60, 0xc4, 0x3c, 0xbb,
0x9e, 0x3e, 0x1a, 0xf7, 0xf6, 0x88, 0x41, 0x28, 0x30, 0x30, 0xd1, 0x4b, 0xed, 0xc1, 0xdb, 0xd0,
0x08, 0xc0, 0x3c, 0x9b, 0xce, 0x5f, 0xd2, 0xea, 0xa2, 0x6f, 0xc7, 0x46, 0xd7, 0xa0, 0x49, 0xb7,
0xb3, 0x37, 0xb4, 0x07, 0x3d, 0x92, 0xf2, 0x71, 0xa7, 0xd4, 0x30, 0x38, 0x59, 0x84, 0x4d, 0x51,
0x28, 0xd7, 0xfc, 0x02, 0x73, 0xb7, 0x24, 0xa0, 0xb6, 0xcd, 0x2f, 0xb0, 0xfa, 0x5b, 0x0a, 0x2c,
0x72, 0x2f, 0xb6, 0x2d, 0x8a, 0xdf, 0xb4, 0x5a, 0xc9, 0xd2, 0x6d, 0xfa, 0x1b, 0x7d, 0x3b, 0x5a,
0xaf, 0xba, 0x26, 0x15, 0x75, 0x8a, 0x84, 0xc6, 0x4e, 0x11, 0x17, 0x96, 0x27, 0xdf, 0xfb, 0x92,
0xec, 0xa9, 0xee, 0xe9, 0x4f, 0x6d, 0x83, 0x95, 0xcf, 0xda, 0xb0, 0xa0, 0x1b, 0x86, 0x83, 0x5d,
0x97, 0xd3, 0xe1, 0x37, 0xc9, 0x97, 0x43, 0xec, 0xb8, 0x3e, 0x63, 0x8b, 0x9a, 0xdf, 0x44, 0xdf,
0x81, 0xaa, 0x08, 0xb6, 0x58, 0x9d, 0xe2, 0x4a, 0x3a, 0x9d, 0x3c, 0x3b, 0x11, 0x23, 0xd4, 0x7f,
0x28, 0x40, 0x93, 0x6b, 0xda, 0x1a, 0x77, 0x38, 0xd9, 0x22, 0xb6, 0x06, 0x8d, 0xbd, 0x40, 0xc2,
0xb3, 0xaa, 0x2b, 0x61, 0x45, 0x88, 0x8c, 0x99, 0x26, 0x6b, 0x51, 0x97, 0x57, 0x9a, 0xcb, 0xe5,
0x95, 0x4f, 0xaa, 0xa7, 0xc9, 0xd0, 0xa7, 0x22, 0x09, 0x7d, 0xd4, 0x5f, 0x81, 0x7a, 0x08, 0x01,
0xb5, 0x43, 0xac, 0x80, 0xc1, 0x77, 0xcc, 0x6f, 0xa2, 0xfb, 0x81, 0xe3, 0x67, 0x5b, 0x75, 0x4e,
0x42, 0x4b, 0xcc, 0xe7, 0xab, 0xff, 0xa4, 0x40, 0x85, 0x63, 0xbe, 0x0c, 0x75, 0xae, 0x5f, 0x34,
0x14, 0x62, 0xd8, 0x81, 0x77, 0x91, 0x58, 0xe8, 0xd5, 0x29, 0xd8, 0x39, 0xa8, 0xc6, 0x54, 0x6b,
0x81, 0x1b, 0x3f, 0xff, 0x53, 0x48, 0x9f, 0xc8, 0x27, 0xa2, 0x4a, 0xe8, 0x0c, 0x94, 0x87, 0xf6,
0x40, 0x1c, 0x6e, 0xb0, 0x86, 0xfa, 0x95, 0x42, 0x6b, 0xd1, 0x1a, 0xee, 0xdb, 0x87, 0xd8, 0x39,
0x9e, 0xbf, 0x9c, 0xf7, 0x20, 0x24, 0xe6, 0x39, 0x73, 0x0a, 0x31, 0x00, 0x3d, 0x08, 0x98, 0x50,
0x94, 0x65, 0xfd, 0x61, 0x87, 0xc3, 0x85, 0x34, 0x60, 0xc6, 0x9f, 0x28, 0xb4, 0x30, 0x19, 0x5d,
0xca, 0xac, 0x3e, 0xfd, 0x95, 0xc4, 0xe7, 0xea, 0xcf, 0x15, 0xe8, 0x04, 0x65, 0x05, 0x77, 0xed,
0x78, 0xde, 0x62, 0xff, 0xab, 0x49, 0x1b, 0xbe, 0x25, 0xea, 0xd2, 0x44, 0x69, 0x73, 0x05, 0xfc,
0x7e, 0x55, 0xda, 0xa2, 0x15, 0xca, 0xe4, 0x82, 0xe6, 0x11, 0x99, 0x0e, 0x54, 0x45, 0x5e, 0xcc,
0x6a, 0xd3, 0xa2, 0x4d, 0x34, 0xec, 0xdc, 0x63, 0xec, 0x3d, 0x8a, 0xd6, 0x16, 0xde, 0xf4, 0x06,
0x86, 0xeb, 0xe5, 0xfb, 0xbc, 0x5e, 0x5e, 0x8a, 0xd5, 0xcb, 0x79, 0xbf, 0x3a, 0xa2, 0x22, 0x90,
0x58, 0xc0, 0xeb, 0xda, 0xb0, 0xdf, 0x55, 0xa0, 0xcd, 0x67, 0xa1, 0x73, 0x92, 0x98, 0x7f, 0x88,
0x3d, 0x6c, 0x7c, 0xdd, 0x19, 0xf0, 0x5f, 0x14, 0xa0, 0x15, 0xf6, 0xba, 0xd4, 0x71, 0x7e, 0x03,
0xca, 0xb4, 0x80, 0xc0, 0x29, 0x98, 0x6a, 0x1a, 0x18, 0x34, 0x31, 0xdb, 0x34, 0xa0, 0xdc, 0x71,
0x7d, 0xaf, 0xca, 0x9b, 0x81, 0xeb, 0x2f, 0x9e, 0xdc, 0xf5, 0x5f, 0x80, 0x1a, 0x31, 0xab, 0xf6,
0x84, 0xe0, 0x65, 0x87, 0x98, 0x41, 0x07, 0xfa, 0x08, 0x2a, 0xec, 0x6a, 0x02, 0x3f, 0x43, 0xba,
0x1e, 0x45, 0xcd, 0xaf, 0x2d, 0x84, 0x6a, 0xc0, 0xb4, 0x43, 0xe3, 0x83, 0x08, 0x8f, 0xc6, 0x8e,
0x3d, 0xa0, 0x31, 0x02, 0xb1, 0xb8, 0x65, 0x4d, 0xb4, 0xd5, 0x5f, 0x84, 0x95, 0x20, 0x15, 0x63,
0x24, 0xcd, 0x2a, 0xd0, 0xea, 0xbf, 0x29, 0x70, 0x7a, 0xfb, 0xd8, 0xea, 0xc7, 0x55, 0x63, 0x05,
0x2a, 0xe3, 0xa1, 0x1e, 0x54, 0x26, 0x79, 0x8b, 0x9e, 0xfa, 0xb2, 0xb9, 0xb1, 0x41, 0xfc, 0x0b,
0xdb, 0xcf, 0xba, 0xe8, 0xdb, 0xb1, 0xa7, 0xba, 0xfd, 0xeb, 0x22, 0x77, 0xc4, 0x06, 0xf3, 0x64,
0xac, 0xf2, 0xb2, 0x28, 0x7a, 0xa9, 0x27, 0xfb, 0x08, 0x80, 0x3a, 0xfb, 0xde, 0x49, 0x1c, 0x3c,
0x1d, 0xf1, 0x84, 0x98, 0xf3, 0x9f, 0x15, 0xa0, 0x1d, 0xda, 0xa5, 0xaf, 0x3b, 0xf6, 0x49, 0xc9,
0x4b, 0x8a, 0xaf, 0x28, 0x2f, 0x29, 0xcd, 0x1f, 0xef, 0x94, 0x65, 0xf1, 0xce, 0x6f, 0x14, 0xa1,
0x19, 0xec, 0xda, 0xd6, 0x50, 0xb7, 0x52, 0x25, 0x61, 0x1b, 0x9a, 0x6e, 0x64, 0x57, 0xf9, 0x3e,
0xbd, 0x27, 0xd3, 0xa1, 0x14, 0x46, 0x68, 0x31, 0x14, 0xe8, 0x22, 0x65, 0xba, 0xe3, 0xb1, 0x5a,
0x0f, 0x0b, 0x5e, 0x6a, 0x4c, 0x59, 0xcd, 0x11, 0x46, 0xb7, 0x00, 0x71, 0x0d, 0xeb, 0x99, 0x56,
0xcf, 0xc5, 0x7d, 0xdb, 0x32, 0x98, 0xee, 0x95, 0xb5, 0x16, 0xff, 0xd2, 0xb5, 0xb6, 0x59, 0x3f,
0xfa, 0x06, 0x94, 0xbc, 0xe3, 0x31, 0x8b, 0x64, 0x9a, 0xd2, 0x58, 0x20, 0xa0, 0x6b, 0xe7, 0x78,
0x8c, 0x35, 0x0a, 0xee, 0xdf, 0x4e, 0xf1, 0x1c, 0xfd, 0x90, 0x87, 0x85, 0x25, 0x2d, 0xd4, 0x43,
0xac, 0x89, 0xbf, 0x87, 0x0b, 0x2c, 0x7c, 0xe2, 0x4d, 0x26, 0xd9, 0xbe, 0x42, 0xf7, 0x3c, 0x6f,
0x48, 0xab, 0x55, 0x54, 0xb2, 0xfd, 0xde, 0x1d, 0x6f, 0x48, 0x16, 0xe9, 0xd9, 0x9e, 0x3e, 0x64,
0xfa, 0x51, 0xe3, 0x96, 0x83, 0xf4, 0xd0, 0x14, 0xec, 0x5f, 0x89, 0xe5, 0x13, 0x84, 0x69, 0xd8,
0x9d, 0x0c, 0xd3, 0xf5, 0x31, 0xbb, 0x78, 0x30, 0x4d, 0x15, 0xbf, 0x0b, 0x75, 0x2e, 0x15, 0x27,
0x90, 0x2a, 0x60, 0x43, 0x9e, 0x64, 0x88, 0x79, 0xf9, 0x15, 0x89, 0x79, 0x65, 0x86, 0xf4, 0x5b,
0xce, 0x1b, 0xf5, 0x27, 0x0a, 0xbc, 0x95, 0xb0, 0x9a, 0x99, 0x5b, 0x9b, 0x9d, 0x16, 0x72, 0x6b,
0x1a, 0x47, 0xc9, 0x7d, 0xc3, 0x03, 0xa8, 0x38, 0x14, 0x3b, 0x3f, 0x91, 0xb9, 0x9a, 0x29, 0x7c,
0x8c, 0x10, 0x8d, 0x0f, 0x51, 0xff, 0x54, 0x81, 0xb3, 0x49, 0x52, 0xe7, 0x70, 0xf8, 0x6b, 0xb0,
0xc0, 0x50, 0xfb, 0x3a, 0xba, 0x9a, 0xad, 0xa3, 0xc1, 0xe6, 0x68, 0xfe, 0x40, 0x75, 0x1b, 0x56,
0xfc, 0xb8, 0x20, 0xd8, 0xfa, 0x4d, 0xec, 0xe9, 0x19, 0x49, 0xd1, 0x65, 0xa8, 0xb3, 0xe8, 0x9a,
0x25, 0x1b, 0xec, 0x00, 0x0b, 0x76, 0x45, 0xad, 0x49, 0xfd, 0x2f, 0x05, 0xce, 0x50, 0xc7, 0x1a,
0x3f, 0x8d, 0xc8, 0x73, 0x3c, 0xa6, 0x8a, 0x0b, 0x48, 0x4f, 0xf5, 0x11, 0xbf, 0x24, 0x51, 0xd3,
0x22, 0x7d, 0xa8, 0x9b, 0x2c, 0x45, 0x49, 0x93, 0xe7, 0xe0, 0x3c, 0x90, 0x24, 0xea, 0xf4, 0x38,
0x30, 0x5e, 0x83, 0x0a, 0x1c, 0x7a, 0x69, 0x06, 0x87, 0xae, 0x3e, 0x81, 0xb7, 0x62, 0x2b, 0x9d,
0x83, 0xa3, 0xea, 0xdf, 0x28, 0x84, 0x1d, 0x91, 0xcb, 0x26, 0xb3, 0x07, 0xb5, 0x17, 0xc5, 0x31,
0x48, 0xcf, 0x34, 0xe2, 0x46, 0xc4, 0x40, 0x1f, 0x43, 0xcd, 0xc2, 0x47, 0xbd, 0x70, 0x9c, 0x94,
0x23, 0xe2, 0xaf, 0x5a, 0xf8, 0x88, 0xfe, 0x52, 0x9f, 0xc2, 0xd9, 0x04, 0xa9, 0xf3, 0xac, 0xfd,
0x1f, 0x15, 0x38, 0xb7, 0xe1, 0xd8, 0xe3, 0xcf, 0x4c, 0xc7, 0x9b, 0xe8, 0xc3, 0xe8, 0x49, 0xeb,
0x0c, 0xcb, 0xcf, 0x71, 0x91, 0xed, 0xd3, 0x50, 0xc4, 0xcc, 0xe4, 0xe7, 0x96, 0x44, 0x83, 0x92,
0x44, 0xf1, 0x45, 0x87, 0xe2, 0xeb, 0xff, 0x28, 0xca, 0x88, 0xe7, 0x70, 0x53, 0xe2, 0x92, 0x3c,
0xc9, 0x87, 0xb4, 0x14, 0x5c, 0x9c, 0xb5, 0x14, 0x9c, 0x62, 0xde, 0x4b, 0xaf, 0xc8, 0xbc, 0x9f,
0xb8, 0x6a, 0xb3, 0x0e, 0xd1, 0x32, 0x3d, 0xf5, 0xce, 0x27, 0x2d, 0xed, 0x7f, 0x04, 0x10, 0x54,
0xab, 0xf9, 0xe5, 0xc0, 0x29, 0x18, 0x42, 0x03, 0x08, 0x8f, 0x84, 0x03, 0xe5, 0xfe, 0x3d, 0x54,
0x3f, 0xfd, 0x01, 0x74, 0x64, 0xb2, 0x39, 0x8f, 0xbc, 0xff, 0xac, 0x00, 0xd0, 0x15, 0x57, 0x49,
0x67, 0xf3, 0x00, 0x57, 0x21, 0x14, 0x83, 0x04, 0x5a, 0x1e, 0x96, 0x1d, 0x83, 0x28, 0x82, 0xc8,
0x52, 0x09, 0x4c, 0x22, 0x73, 0x35, 0x28, 0x9e, 0x90, 0xae, 0x30, 0x51, 0x88, 0x1b, 0xdd, 0xf3,
0x50, 0x73, 0xec, 0xa3, 0x1e, 0x51, 0x2e, 0xc3, 0xbf, 0x2b, 0xeb, 0xd8, 0x47, 0x44, 0xe5, 0x0c,
0x74, 0x16, 0x16, 0x3c, 0xdd, 0x3d, 0x20, 0xf8, 0x59, 0x25, 0xa9, 0x42, 0x9a, 0x5d, 0x03, 0x9d,
0x81, 0xf2, 0x9e, 0x39, 0xc4, 0xec, 0x58, 0xbe, 0xa6, 0xb1, 0x06, 0xfa, 0xa6, 0x7f, 0xbd, 0xab,
0x9a, 0xfb, 0x1a, 0x07, 0x85, 0x57, 0xbf, 0x52, 0x60, 0x29, 0xd8, 0x35, 0x6a, 0x76, 0x88, 0x25,
0xa3, 0x56, 0x6c, 0xdd, 0x36, 0x98, 0x81, 0x68, 0xa6, 0xf8, 0x01, 0x36, 0x90, 0xd9, 0xaa, 0x60,
0x48, 0x56, 0xe2, 0x4c, 0xd6, 0x45, 0x16, 0x6d, 0x1a, 0xfe, 0xcd, 0xef, 0x8a, 0x63, 0x1f, 0x75,
0x0d, 0xb1, 0x1b, 0xec, 0x22, 0x2c, 0x4b, 0x13, 0xc9, 0x6e, 0xac, 0xd3, 0xbb, 0xb0, 0x57, 0x61,
0x11, 0x3b, 0x8e, 0xed, 0xf4, 0x46, 0xd8, 0x75, 0xf5, 0x01, 0xe6, 0x51, 0x79, 0x83, 0x76, 0x6e,
0xb2, 0x3e, 0xf5, 0xcf, 0x4b, 0xd0, 0x0c, 0x96, 0xe2, 0x9f, 0x07, 0x9b, 0x86, 0x7f, 0x1e, 0x6c,
0x12, 0xd6, 0x81, 0xc3, 0x0c, 0xa0, 0x60, 0xee, 0x5a, 0xa1, 0xad, 0x68, 0x35, 0xde, 0xdb, 0x35,
0x88, 0x33, 0x26, 0xaa, 0x65, 0xd9, 0x06, 0x0e, 0x98, 0x0b, 0x7e, 0x17, 0xe7, 0x6d, 0x44, 0x46,
0x4a, 0x39, 0x64, 0xa4, 0x9c, 0x43, 0x46, 0x2a, 0x12, 0x19, 0x59, 0x81, 0xca, 0xee, 0xa4, 0x7f,
0x80, 0x3d, 0x1e, 0xa7, 0xf1, 0x56, 0x54, 0x76, 0xaa, 0x31, 0xd9, 0x11, 0x22, 0x52, 0x0b, 0x8b,
0xc8, 0x79, 0xa8, 0xb1, 0x23, 0xca, 0x9e, 0xe7, 0xd2, 0x43, 0x97, 0xa2, 0x56, 0x65, 0x1d, 0x3b,
0x2e, 0xfa, 0xd0, 0x0f, 0xe2, 0xea, 0x54, 0x59, 0x54, 0x89, 0xad, 0x89, 0x49, 0x89, 0x1f, 0xc2,
0xdd, 0x80, 0xa5, 0xd0, 0x76, 0x50, 0xcf, 0xd0, 0xa0, 0xa4, 0x86, 0x62, 0x7c, 0xea, 0x1c, 0xae,
0x43, 0x33, 0xd8, 0x12, 0x0a, 0xb7, 0xc8, 0x52, 0x2b, 0xd1, 0x4b, 0xc1, 0x84, 0x24, 0x37, 0x4f,
0x26, 0xc9, 0xe8, 0x1c, 0x54, 0x79, 0x4e, 0xe4, 0xb6, 0x97, 0x22, 0xe5, 0x0b, 0xf5, 0x47, 0x80,
0x02, 0xea, 0xe7, 0x8b, 0x11, 0x63, 0xe2, 0x51, 0x88, 0x8b, 0x87, 0xfa, 0xb7, 0x0a, 0x2c, 0x87,
0x27, 0x9b, 0xd5, 0xdd, 0x7e, 0x0c, 0x75, 0x76, 0xec, 0xd5, 0x23, 0x8a, 0x2f, 0x3f, 0xbf, 0x8a,
0xf1, 0x45, 0x83, 0xe0, 0x2a, 0x3d, 0x11, 0xaf, 0x23, 0xdb, 0x39, 0x30, 0xad, 0x41, 0x8f, 0x50,
0xe6, 0xab, 0x5b, 0x83, 0x77, 0x3e, 0x25, 0x7d, 0xea, 0x1f, 0x28, 0x70, 0xe9, 0xd9, 0xd8, 0xd0,
0x3d, 0x1c, 0x8a, 0x3b, 0xe6, 0xbd, 0xd1, 0x26, 0xae, 0x94, 0x15, 0x32, 0x38, 0x18, 0x9a, 0xcf,
0xe5, 0x57, 0xca, 0x48, 0xb4, 0xc6, 0xa9, 0x49, 0xdc, 0x01, 0x9d, 0x9d, 0x9a, 0x0e, 0x54, 0x0f,
0x39, 0x3a, 0xff, 0x71, 0x80, 0xdf, 0x8e, 0x1c, 0x10, 0x16, 0x4f, 0x74, 0x40, 0xa8, 0x6e, 0xc2,
0x39, 0x0d, 0xbb, 0xd8, 0x32, 0x22, 0x0b, 0x99, 0xb9, 0xbe, 0x34, 0x86, 0x8e, 0x0c, 0xdd, 0x3c,
0x92, 0xca, 0xc2, 0xd5, 0x9e, 0x43, 0xd0, 0x7a, 0xdc, 0x0e, 0x93, 0x28, 0x89, 0xce, 0xe3, 0xa9,
0x7f, 0x57, 0x80, 0xb3, 0x0f, 0x0d, 0x83, 0x9b, 0x70, 0x1e, 0x80, 0xbd, 0xae, 0xd8, 0x38, 0x1e,
0x3b, 0x16, 0x93, 0xb1, 0xe3, 0xab, 0x32, 0xab, 0xdc, 0xc1, 0x58, 0x93, 0x91, 0xef, 0x38, 0x1d,
0x76, 0x4b, 0xe6, 0x01, 0x3f, 0x46, 0x23, 0x39, 0x3c, 0x75, 0x9e, 0xd3, 0x43, 0xaa, 0xaa, 0x5f,
0x27, 0x53, 0xc7, 0xd0, 0x4e, 0x6e, 0xd6, 0x9c, 0x76, 0xc4, 0xdf, 0x91, 0xb1, 0xcd, 0xea, 0xad,
0x0d, 0x12, 0x3f, 0xd1, 0xae, 0x2d, 0xdb, 0x55, 0xff, 0xbb, 0x00, 0xed, 0x6d, 0xfd, 0x10, 0xff,
0xff, 0x61, 0xd0, 0xe7, 0x70, 0xc6, 0xd5, 0x0f, 0x71, 0x2f, 0x94, 0x0b, 0xf7, 0x1c, 0xfc, 0x82,
0x87, 0x9e, 0xef, 0xca, 0x2a, 0xe2, 0xd2, 0xbb, 0x25, 0xda, 0xb2, 0x1b, 0xe9, 0xd7, 0xf0, 0x0b,
0xf4, 0x0e, 0x2c, 0x85, 0xaf, 0x2c, 0x11, 0xd2, 0xaa, 0x74, 0xcb, 0x17, 0x43, 0xd7, 0x92, 0xba,
0x86, 0xfa, 0x02, 0x2e, 0x3c, 0xb3, 0x5c, 0xec, 0x75, 0x83, 0xab, 0x35, 0x73, 0x66, 0x8d, 0x97,
0xa1, 0x1e, 0x6c, 0x7c, 0xe2, 0x55, 0x80, 0xe1, 0xaa, 0x36, 0x74, 0x36, 0x75, 0xe7, 0xc0, 0xaf,
0x2c, 0x6f, 0xb0, 0x7b, 0x10, 0xaf, 0x71, 0xc2, 0x3d, 0x71, 0x23, 0x48, 0xc3, 0x7b, 0xd8, 0xc1,
0x56, 0x1f, 0x3f, 0xb1, 0xfb, 0x07, 0x24, 0xd6, 0xf0, 0xd8, 0xc3, 0x2c, 0x25, 0x14, 0x71, 0x6e,
0x84, 0xde, 0x5d, 0x15, 0x22, 0xef, 0xae, 0xa6, 0xbc, 0xe3, 0x53, 0x7f, 0x5a, 0x80, 0x95, 0x87,
0x43, 0x0f, 0x3b, 0x41, 0xb2, 0x7f, 0x92, 0xba, 0x45, 0x50, 0x48, 0x28, 0xcc, 0x72, 0x32, 0x10,
0xbf, 0x1f, 0x5d, 0x4c, 0xde, 0x8f, 0x96, 0x95, 0x3d, 0x4a, 0x33, 0x96, 0x3d, 0x1e, 0x02, 0x8c,
0x1d, 0x7b, 0x8c, 0x1d, 0xcf, 0xc4, 0x7e, 0xc6, 0x96, 0x23, 0x76, 0x09, 0x0d, 0x52, 0x3f, 0x87,
0xd6, 0xe3, 0xfe, 0xba, 0x6d, 0xed, 0x99, 0xce, 0xc8, 0xdf, 0xa8, 0x84, 0xd2, 0x29, 0x39, 0x94,
0xae, 0x90, 0x50, 0x3a, 0xd5, 0x84, 0xe5, 0x10, 0xee, 0x39, 0x0d, 0xd7, 0xa0, 0xdf, 0xdb, 0x33,
0x2d, 0x93, 0xde, 0x33, 0x2a, 0xd0, 0xd8, 0x13, 0x06, 0xfd, 0x47, 0xbc, 0xe7, 0xe6, 0xc7, 0xe2,
0x4a, 0xe6, 0xce, 0xf1, 0x18, 0xa3, 0x05, 0x28, 0x3e, 0xc5, 0x47, 0xad, 0x53, 0x08, 0xa0, 0xf2,
0xd4, 0x76, 0x46, 0xfa, 0xb0, 0xa5, 0xa0, 0x3a, 0x2c, 0xf0, 0xa3, 0xba, 0x56, 0x01, 0x2d, 0x42,
0x6d, 0xdd, 0x3f, 0xd2, 0x68, 0x15, 0x6f, 0xfe, 0xa5, 0x02, 0xcb, 0x89, 0xc3, 0x24, 0xd4, 0x04,
0x78, 0x66, 0xf5, 0xf9, 0x29, 0x5b, 0xeb, 0x14, 0x6a, 0x40, 0xd5, 0x3f, 0x73, 0x63, 0xf8, 0x76,
0x6c, 0x0a, 0xdd, 0x2a, 0xa0, 0x16, 0x34, 0xd8, 0xc0, 0x49, 0xbf, 0x8f, 0x5d, 0xb7, 0x55, 0x14,
0x3d, 0x8f, 0x74, 0x73, 0x38, 0x71, 0x70, 0xab, 0x44, 0xe6, 0xdc, 0xb1, 0x35, 0x3c, 0xc4, 0xba,
0x8b, 0x5b, 0x65, 0x84, 0xa0, 0xc9, 0x1b, 0xfe, 0xa0, 0x4a, 0xa8, 0xcf, 0x1f, 0xb6, 0x70, 0xf3,
0x79, 0xb8, 0xec, 0x4f, 0x97, 0x77, 0x16, 0x4e, 0x3f, 0xb3, 0x0c, 0xbc, 0x67, 0x5a, 0xd8, 0x08,
0x3e, 0xb5, 0x4e, 0xa1, 0xd3, 0xb0, 0xb4, 0x89, 0x9d, 0x01, 0x0e, 0x75, 0x16, 0xd0, 0x32, 0x2c,
0x6e, 0x9a, 0x2f, 0x43, 0x5d, 0x45, 0xb5, 0x54, 0x55, 0x5a, 0xca, 0xbd, 0xff, 0x79, 0x1b, 0x6a,
0x44, 0xb6, 0xd6, 0x6d, 0xdb, 0x31, 0xd0, 0x10, 0x10, 0x7d, 0xf8, 0x30, 0x1a, 0xdb, 0x96, 0x78,
0x24, 0x85, 0x6e, 0xc7, 0x62, 0x13, 0xd6, 0x48, 0x02, 0x72, 0xd9, 0xe9, 0x5c, 0x93, 0xc2, 0xc7,
0x80, 0xd5, 0x53, 0x68, 0x44, 0x67, 0xdb, 0x31, 0x47, 0x78, 0xc7, 0xec, 0x1f, 0xf8, 0xb1, 0xd1,
0xdd, 0x94, 0x97, 0x26, 0x49, 0x50, 0x7f, 0xbe, 0xab, 0xd2, 0xf9, 0xd8, 0xcb, 0x14, 0x5f, 0xe6,
0xd4, 0x53, 0xe8, 0x05, 0x9c, 0x79, 0x8c, 0x43, 0x81, 0xa6, 0x3f, 0xe1, 0xbd, 0xf4, 0x09, 0x13,
0xc0, 0x27, 0x9c, 0xf2, 0x09, 0x94, 0xa9, 0xb8, 0x21, 0xd9, 0x49, 0x68, 0xf8, 0x85, 0x73, 0xe7,
0x4a, 0x3a, 0x80, 0xc0, 0xf6, 0x23, 0x58, 0x8a, 0xbd, 0x7d, 0x44, 0x32, 0xe7, 0x24, 0x7f, 0xc5,
0xda, 0xb9, 0x99, 0x07, 0x54, 0xcc, 0x35, 0x80, 0x66, 0xf4, 0xc1, 0x04, 0x5a, 0xcd, 0xf1, 0xec,
0x8a, 0xcd, 0xf4, 0x6e, 0xee, 0x07, 0x5a, 0x54, 0x08, 0x5a, 0xf1, 0x57, 0x79, 0xe8, 0x66, 0x26,
0x82, 0xa8, 0xb0, 0xbd, 0x97, 0x0b, 0x56, 0x4c, 0x77, 0x4c, 0x85, 0x20, 0xf1, 0x24, 0x2a, 0x2e,
0xe3, 0x3e, 0x9a, 0xb4, 0xb7, 0x5a, 0x9d, 0x3b, 0xb9, 0xe1, 0xc5, 0xd4, 0xbf, 0xc9, 0xee, 0xe2,
0xc8, 0x9e, 0x15, 0xa1, 0x0f, 0xe4, 0xe8, 0x32, 0xde, 0x43, 0x75, 0xee, 0x9d, 0x64, 0x88, 0x20,
0xe2, 0xd7, 0xe9, 0x25, 0x1a, 0xc9, 0xc3, 0x9c, 0xb8, 0xde, 0xf9, 0xf8, 0xd2, 0xdf, 0x1c, 0x75,
0x3e, 0x38, 0xc1, 0x08, 0x41, 0x80, 0x1d, 0x7f, 0xf6, 0xe8, 0xab, 0xe1, 0x9d, 0xa9, 0x52, 0x33,
0x9b, 0x0e, 0xfe, 0x10, 0x96, 0x62, 0xe1, 0x1a, 0xca, 0x1f, 0xd2, 0x75, 0xb2, 0x5c, 0x13, 0x53,
0xc9, 0xd8, 0x9d, 0x24, 0x94, 0x22, 0xfd, 0x92, 0x7b, 0x4b, 0x9d, 0x9b, 0x79, 0x40, 0xc5, 0x42,
0x5c, 0x6a, 0x2e, 0x63, 0x37, 0x4d, 0xd0, 0x2d, 0x39, 0x0e, 0xf9, 0x8d, 0x9a, 0xce, 0xfb, 0x39,
0xa1, 0xc5, 0xa4, 0x87, 0x70, 0x5a, 0x72, 0x21, 0x08, 0xbd, 0x9f, 0xc9, 0xac, 0xf8, 0x4d, 0xa8,
0xce, 0xed, 0xbc, 0xe0, 0x62, 0xde, 0x5f, 0x05, 0xb4, 0xbd, 0x6f, 0x1f, 0xd1, 0xc8, 0x61, 0x30,
0x71, 0x74, 0x16, 0xec, 0xa4, 0xf9, 0x86, 0x24, 0x68, 0x8a, 0x8c, 0x66, 0x8e, 0x10, 0x93, 0xf7,
0x00, 0x1e, 0x63, 0x6f, 0x13, 0x7b, 0x0e, 0x51, 0x8c, 0x77, 0xd2, 0xdc, 0x1f, 0x07, 0xf0, 0xa7,
0xba, 0x31, 0x15, 0x2e, 0xe4, 0x8a, 0x5a, 0x9b, 0xba, 0x35, 0xd1, 0x87, 0xa1, 0x2b, 0xfb, 0xb7,
0xa4, 0xc3, 0xe3, 0x60, 0x29, 0x8c, 0x4c, 0x85, 0x16, 0x53, 0x1e, 0x09, 0xd7, 0x1e, 0x3a, 0x44,
0xcc, 0x76, 0xed, 0xc9, 0x0b, 0x2c, 0x71, 0xb3, 0x97, 0x01, 0x2f, 0x26, 0xfe, 0x52, 0xa1, 0x77,
0xca, 0x62, 0x00, 0xcf, 0x4d, 0x6f, 0x7f, 0x6b, 0xa8, 0x5b, 0x6e, 0x1e, 0x12, 0x28, 0xe0, 0x09,
0x48, 0xe0, 0xf0, 0x82, 0x04, 0x03, 0x16, 0x23, 0x67, 0x7b, 0x48, 0x76, 0xd1, 0x5d, 0x76, 0xce,
0xd9, 0x59, 0x9d, 0x0e, 0x28, 0x66, 0xd9, 0x87, 0x45, 0x5f, 0x95, 0xd8, 0xe6, 0xbe, 0x9b, 0x46,
0x69, 0x00, 0x93, 0x62, 0x09, 0xe4, 0xa0, 0x61, 0x4b, 0x90, 0x3c, 0xc4, 0x40, 0xf9, 0x8e, 0xbc,
0xb2, 0x2c, 0x41, 0xfa, 0xc9, 0x08, 0x33, 0x75, 0xb1, 0x63, 0x42, 0xb9, 0x1d, 0x95, 0x9e, 0x7a,
0x4a, 0x4d, 0x5d, 0xca, 0xa9, 0xa3, 0x7a, 0x0a, 0x3d, 0x87, 0x0a, 0xff, 0xeb, 0x8e, 0x6b, 0xd9,
0x85, 0x47, 0x8e, 0xfd, 0xfa, 0x14, 0x28, 0x81, 0xf8, 0x00, 0xce, 0xa6, 0x94, 0x1d, 0xa5, 0x2e,
0x38, 0xbb, 0x44, 0x39, 0xcd, 0x39, 0x88, 0xc9, 0x12, 0x55, 0xc5, 0x8c, 0xc9, 0xd2, 0x2a, 0x90,
0xd3, 0x26, 0xeb, 0xc1, 0x72, 0xa2, 0x6a, 0x83, 0xde, 0x4b, 0x71, 0x74, 0xb2, 0xda, 0xce, 0xb4,
0x09, 0x06, 0xf0, 0x96, 0xb4, 0x42, 0x21, 0x75, 0xdc, 0x59, 0xb5, 0x8c, 0x69, 0x13, 0xf5, 0xe1,
0xb4, 0xa4, 0x2e, 0x21, 0x75, 0x39, 0xe9, 0xf5, 0x8b, 0x69, 0x93, 0xec, 0x41, 0x67, 0xcd, 0xb1,
0x75, 0xa3, 0xaf, 0xbb, 0x1e, 0xad, 0x15, 0x90, 0x2c, 0xca, 0x8f, 0x9c, 0xe4, 0x61, 0xb5, 0xb4,
0xa2, 0x30, 0x6d, 0x9e, 0x5d, 0xa8, 0x53, 0x56, 0xb2, 0xbf, 0x57, 0x40, 0x72, 0x1f, 0x11, 0x82,
0x48, 0x31, 0x3c, 0x32, 0x40, 0x21, 0xd4, 0x3b, 0x50, 0x5f, 0xa7, 0xe7, 0x29, 0x5d, 0xcb, 0xc0,
0x2f, 0xe3, 0xfe, 0x8a, 0xbe, 0x31, 0xbd, 0x1d, 0x02, 0xc8, 0xbd, 0x43, 0x8b, 0x34, 0xa0, 0x35,
0xf0, 0x4b, 0xc6, 0xe7, 0x55, 0x19, 0xde, 0x08, 0x48, 0x4a, 0x02, 0x20, 0x85, 0x0c, 0x79, 0xfa,
0x33, 0xe1, 0x30, 0x4f, 0x4c, 0x77, 0x27, 0x05, 0x49, 0x02, 0xd2, 0x9f, 0xf5, 0x6e, 0xfe, 0x01,
0x61, 0xcf, 0xe0, 0xd3, 0xd5, 0xa5, 0x87, 0x39, 0x37, 0xb2, 0x48, 0x0f, 0xc7, 0x6e, 0xab, 0xd3,
0x01, 0xc5, 0x2c, 0x5b, 0x50, 0x23, 0xd2, 0xc9, 0xd8, 0x73, 0x4d, 0x36, 0x50, 0x7c, 0xce, 0xcf,
0x9c, 0x0d, 0xec, 0xf6, 0x1d, 0x73, 0x97, 0x33, 0x5d, 0x4a, 0x4e, 0x04, 0x24, 0x93, 0x39, 0x31,
0x48, 0x41, 0xf9, 0xaf, 0xd1, 0x68, 0x9d, 0xf6, 0xae, 0x4d, 0xcc, 0xa1, 0xb1, 0xc5, 0xef, 0xb8,
0xa2, 0xbb, 0x59, 0xcb, 0x8f, 0x80, 0xa6, 0x46, 0x62, 0x19, 0x23, 0xc4, 0xfc, 0xbf, 0x0c, 0x35,
0x51, 0x3e, 0x42, 0xb2, 0x4b, 0x5a, 0xf1, 0xc2, 0x55, 0xe7, 0x5a, 0x36, 0x90, 0x8f, 0xf9, 0xde,
0x57, 0x35, 0xa8, 0xfa, 0x8f, 0x7e, 0xbe, 0xe6, 0xba, 0xc7, 0x1b, 0x28, 0x44, 0xfc, 0x10, 0x96,
0x62, 0xef, 0xca, 0xa5, 0x36, 0x4e, 0xfe, 0xf6, 0x7c, 0x9a, 0x30, 0x3e, 0xe7, 0x7f, 0x7b, 0x26,
0x72, 0x92, 0x1b, 0x69, 0xc5, 0x8c, 0x78, 0x3a, 0x32, 0x05, 0xf1, 0xff, 0xed, 0x24, 0xe0, 0x29,
0x40, 0x28, 0xfc, 0xcf, 0xbe, 0xfe, 0x4a, 0x22, 0xda, 0x69, 0xbb, 0x35, 0x92, 0x46, 0xf8, 0xef,
0xe6, 0xb9, 0x4a, 0x98, 0x1e, 0xa3, 0xa5, 0xc7, 0xf5, 0xcf, 0xa0, 0x11, 0xbe, 0x98, 0x8e, 0xa4,
0x7f, 0xb2, 0x95, 0xbc, 0xb9, 0x3e, 0x6d, 0x15, 0x9b, 0x27, 0x0c, 0xfd, 0xa6, 0xa0, 0x73, 0x01,
0x25, 0xcf, 0x37, 0xa5, 0xa1, 0x72, 0xea, 0xa9, 0xaa, 0x34, 0x54, 0x4e, 0x3f, 0x34, 0x65, 0x35,
0xad, 0xf8, 0xa1, 0x9d, 0xb4, 0xa6, 0x95, 0x72, 0x0c, 0x2a, 0xad, 0x69, 0xa5, 0x9d, 0x02, 0xaa,
0xa7, 0xd6, 0xee, 0x7f, 0xfe, 0xc1, 0xc0, 0xf4, 0xf6, 0x27, 0xbb, 0x64, 0xf5, 0x77, 0xd8, 0xd0,
0xf7, 0x4d, 0x9b, 0xff, 0xba, 0xe3, 0x8b, 0xfb, 0x1d, 0x8a, 0xed, 0x0e, 0xc1, 0x36, 0xde, 0xdd,
0xad, 0xd0, 0xd6, 0xfd, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x73, 0xee, 0x56, 0x2b, 0xf2, 0x51,
0x00, 0x00,
// 4645 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x4b, 0x6f, 0x1b, 0x49,
0x7a, 0x6e, 0xbe, 0x44, 0x7e, 0xa4, 0x28, 0xaa, 0xec, 0x91, 0x69, 0xfa, 0x39, 0x6d, 0x7b, 0xac,
0xf1, 0x78, 0x6c, 0x8f, 0x9d, 0xc5, 0xce, 0xae, 0x77, 0x66, 0xd7, 0x92, 0xc6, 0x1e, 0x26, 0x96,
0x57, 0xdb, 0x92, 0xc7, 0xc1, 0x6c, 0x00, 0xa2, 0xc5, 0x2e, 0x51, 0xbd, 0x6a, 0x76, 0xd3, 0xdd,
0x4d, 0xc9, 0x9a, 0x00, 0xc9, 0xe4, 0x09, 0xe4, 0x81, 0x24, 0x08, 0x10, 0x24, 0xb9, 0x2d, 0x72,
0x08, 0x36, 0x09, 0xf6, 0xb4, 0xc9, 0x25, 0x97, 0x5c, 0x07, 0xc8, 0x61, 0x11, 0x04, 0x08, 0x90,
0x43, 0xae, 0x41, 0x72, 0xce, 0x1f, 0x08, 0xea, 0xd1, 0xd5, 0xaf, 0x62, 0xb3, 0x45, 0xda, 0x63,
0x20, 0xb9, 0xb1, 0xaa, 0xbf, 0xfa, 0xea, 0xab, 0xfa, 0xde, 0x5f, 0x55, 0x11, 0x5a, 0x86, 0xee,
0xeb, 0xbd, 0xbe, 0xe3, 0xb8, 0xc6, 0xed, 0x91, 0xeb, 0xf8, 0x0e, 0x5a, 0x1e, 0x9a, 0xd6, 0xe1,
0xd8, 0x63, 0xad, 0xdb, 0xe4, 0x73, 0xa7, 0xd1, 0x77, 0x86, 0x43, 0xc7, 0x66, 0x5d, 0x9d, 0xa6,
0x69, 0xfb, 0xd8, 0xb5, 0x75, 0x8b, 0xb7, 0x1b, 0xd1, 0x01, 0x9d, 0x86, 0xd7, 0xdf, 0xc7, 0x43,
0x9d, 0xb7, 0x6a, 0x43, 0x6f, 0xc0, 0x7f, 0x2e, 0x9b, 0xb6, 0x81, 0x5f, 0x46, 0xa7, 0x52, 0x17,
0xa0, 0xfc, 0xc9, 0x70, 0xe4, 0x1f, 0xab, 0x7f, 0xaf, 0x40, 0xe3, 0x91, 0x35, 0xf6, 0xf6, 0x35,
0xfc, 0x62, 0x8c, 0x3d, 0x1f, 0xdd, 0x85, 0xd2, 0xae, 0xee, 0xe1, 0xb6, 0x72, 0x45, 0x59, 0xad,
0xdf, 0xbb, 0x70, 0x3b, 0x46, 0x13, 0xa7, 0x66, 0xd3, 0x1b, 0xac, 0xe9, 0x1e, 0xd6, 0x28, 0x24,
0x42, 0x50, 0x32, 0x76, 0xbb, 0x1b, 0xed, 0xc2, 0x15, 0x65, 0xb5, 0xa8, 0xd1, 0xdf, 0xe8, 0x12,
0x80, 0x87, 0x07, 0x43, 0x6c, 0xfb, 0xdd, 0x0d, 0xaf, 0x5d, 0xbc, 0x52, 0x5c, 0x2d, 0x6a, 0x91,
0x1e, 0xa4, 0x42, 0xa3, 0xef, 0x58, 0x16, 0xee, 0xfb, 0xa6, 0x63, 0x77, 0x37, 0xda, 0x25, 0x3a,
0x36, 0xd6, 0x87, 0x3a, 0x50, 0x35, 0xbd, 0xee, 0x70, 0xe4, 0xb8, 0x7e, 0xbb, 0x7c, 0x45, 0x59,
0xad, 0x6a, 0xa2, 0xad, 0xfe, 0xa7, 0x02, 0x8b, 0x9c, 0x6c, 0x6f, 0xe4, 0xd8, 0x1e, 0x46, 0xf7,
0xa1, 0xe2, 0xf9, 0xba, 0x3f, 0xf6, 0x38, 0xe5, 0xe7, 0xa5, 0x94, 0x6f, 0x53, 0x10, 0x8d, 0x83,
0x4a, 0x49, 0x4f, 0x92, 0x56, 0x94, 0x90, 0x16, 0x5f, 0x5e, 0x29, 0xb5, 0xbc, 0x55, 0x58, 0xda,
0x23, 0xd4, 0x6d, 0x87, 0x40, 0x65, 0x0a, 0x94, 0xec, 0x26, 0x98, 0x7c, 0x73, 0x88, 0xbf, 0xbf,
0xb7, 0x8d, 0x75, 0xab, 0x5d, 0xa1, 0x73, 0x45, 0x7a, 0xd4, 0x7f, 0x51, 0xa0, 0x25, 0xc0, 0x03,
0x1e, 0x9d, 0x81, 0x72, 0xdf, 0x19, 0xdb, 0x3e, 0x5d, 0xea, 0xa2, 0xc6, 0x1a, 0xe8, 0x6d, 0x68,
0xf4, 0xf7, 0x75, 0xdb, 0xc6, 0x56, 0xcf, 0xd6, 0x87, 0x98, 0x2e, 0xaa, 0xa6, 0xd5, 0x79, 0xdf,
0x53, 0x7d, 0x88, 0x73, 0xad, 0xed, 0x0a, 0xd4, 0x47, 0xba, 0xeb, 0x9b, 0x31, 0xce, 0x44, 0xbb,
0xb2, 0x18, 0x43, 0x66, 0x30, 0xe9, 0xaf, 0x1d, 0xdd, 0x3b, 0xe8, 0x6e, 0xf0, 0x15, 0xc5, 0xfa,
0xd4, 0x1f, 0x2b, 0xb0, 0xf2, 0xd0, 0xf3, 0xcc, 0x81, 0x9d, 0x5a, 0xd9, 0x0a, 0x54, 0x6c, 0xc7,
0xc0, 0xdd, 0x0d, 0xba, 0xb4, 0xa2, 0xc6, 0x5b, 0xe8, 0x3c, 0xd4, 0x46, 0x18, 0xbb, 0x3d, 0xd7,
0xb1, 0x82, 0x85, 0x55, 0x49, 0x87, 0xe6, 0x58, 0x18, 0xfd, 0x00, 0x96, 0xbd, 0x04, 0x22, 0x26,
0x73, 0xf5, 0x7b, 0x57, 0x6f, 0xa7, 0x74, 0xea, 0x76, 0x72, 0x52, 0x2d, 0x3d, 0x5a, 0xfd, 0xb2,
0x00, 0xa7, 0x05, 0x1c, 0xa3, 0x95, 0xfc, 0x26, 0x3b, 0xef, 0xe1, 0x81, 0x20, 0x8f, 0x35, 0xf2,
0xec, 0xbc, 0x60, 0x59, 0x31, 0xca, 0xb2, 0x3c, 0x6a, 0x90, 0xe0, 0x47, 0x39, 0xcd, 0x8f, 0xcb,
0x50, 0xc7, 0x2f, 0x47, 0xa6, 0x8b, 0x7b, 0x44, 0x70, 0xe8, 0x96, 0x97, 0x34, 0x60, 0x5d, 0x3b,
0xe6, 0x30, 0xaa, 0x1b, 0x0b, 0xb9, 0x75, 0x43, 0xfd, 0x2b, 0x05, 0xce, 0xa6, 0xb8, 0xc4, 0x95,
0x4d, 0x83, 0x16, 0x5d, 0x79, 0xb8, 0x33, 0x44, 0xed, 0xc8, 0x86, 0xbf, 0x93, 0xb5, 0xe1, 0x21,
0xb8, 0x96, 0x1a, 0x1f, 0x21, 0xb2, 0x90, 0x9f, 0xc8, 0x03, 0x38, 0xfb, 0x18, 0xfb, 0x7c, 0x02,
0xf2, 0x0d, 0x7b, 0xb3, 0x1b, 0xb2, 0xb8, 0x56, 0x17, 0x92, 0x5a, 0xad, 0xfe, 0x75, 0x41, 0xe8,
0x22, 0x9d, 0xaa, 0x6b, 0xef, 0x39, 0xe8, 0x02, 0xd4, 0x04, 0x08, 0x97, 0x8a, 0xb0, 0x03, 0x7d,
0x13, 0xca, 0x84, 0x52, 0x26, 0x12, 0xcd, 0x7b, 0x6f, 0xcb, 0xd7, 0x14, 0xc1, 0xa9, 0x31, 0x78,
0xb4, 0x01, 0x4d, 0xcf, 0xd7, 0x5d, 0xbf, 0x37, 0x72, 0x3c, 0xca, 0x67, 0x2a, 0x38, 0xf5, 0x7b,
0x17, 0xe3, 0x18, 0x88, 0x91, 0xdf, 0xf4, 0x06, 0x5b, 0x1c, 0x48, 0x5b, 0xa4, 0x83, 0x82, 0x26,
0xfa, 0x1e, 0x34, 0xb0, 0x6d, 0x84, 0x38, 0x4a, 0x79, 0x70, 0xd4, 0xb1, 0x6d, 0x08, 0x0c, 0x21,
0x57, 0xca, 0xf9, 0xb9, 0xf2, 0x87, 0x0a, 0xb4, 0xd3, 0x6c, 0x99, 0xc7, 0x50, 0x3f, 0x60, 0x83,
0x30, 0x63, 0x4b, 0xa6, 0x5e, 0x0b, 0xd6, 0x68, 0x7c, 0x88, 0xfa, 0x67, 0x0a, 0xbc, 0x15, 0x92,
0x43, 0x3f, 0xbd, 0x2e, 0x19, 0x41, 0x37, 0xa1, 0x65, 0xda, 0x7d, 0x6b, 0x6c, 0xe0, 0x67, 0xf6,
0xa7, 0x58, 0xb7, 0xfc, 0xfd, 0x63, 0xca, 0xb9, 0xaa, 0x96, 0xea, 0x57, 0xff, 0xbd, 0x00, 0x2b,
0x49, 0xba, 0xe6, 0xd9, 0xa4, 0x5f, 0x80, 0xb2, 0x69, 0xef, 0x39, 0xc1, 0x1e, 0x5d, 0xca, 0x50,
0x45, 0x32, 0x17, 0x03, 0x46, 0x0e, 0xa0, 0xc0, 0x78, 0xf5, 0xf7, 0x71, 0xff, 0x60, 0xe4, 0x98,
0xd4, 0x4c, 0x11, 0x14, 0xdf, 0x93, 0xa0, 0x90, 0x53, 0x7c, 0x7b, 0x9d, 0xe1, 0x58, 0x17, 0x28,
0x3e, 0xb1, 0x7d, 0xf7, 0x58, 0x5b, 0xee, 0x27, 0xfb, 0x3b, 0x7d, 0x58, 0x91, 0x03, 0xa3, 0x16,
0x14, 0x0f, 0xf0, 0x31, 0x5d, 0x72, 0x4d, 0x23, 0x3f, 0xd1, 0x7d, 0x28, 0x1f, 0xea, 0xd6, 0x18,
0x73, 0x9b, 0x30, 0x45, 0x72, 0x19, 0xec, 0xb7, 0x0b, 0x1f, 0x2a, 0xea, 0x10, 0xce, 0x3f, 0xc6,
0x7e, 0xd7, 0xf6, 0xb0, 0xeb, 0xaf, 0x99, 0xb6, 0xe5, 0x0c, 0xb6, 0x74, 0x7f, 0x7f, 0x0e, 0xe3,
0x10, 0xd3, 0xf3, 0x42, 0x42, 0xcf, 0xd5, 0x9f, 0x28, 0x70, 0x41, 0x3e, 0x1f, 0x67, 0x68, 0x07,
0xaa, 0x7b, 0x26, 0xb6, 0x0c, 0x22, 0x35, 0x0a, 0x95, 0x1a, 0xd1, 0x26, 0x46, 0x62, 0x44, 0x80,
0x39, 0xdf, 0x12, 0x46, 0x42, 0xc4, 0x7c, 0xdb, 0xbe, 0x6b, 0xda, 0x83, 0x27, 0xa6, 0xe7, 0x6b,
0x0c, 0x3e, 0x22, 0x25, 0xc5, 0xfc, 0xca, 0xf9, 0xfb, 0x0a, 0x5c, 0x7a, 0x8c, 0xfd, 0x75, 0xe1,
0x63, 0xc8, 0x77, 0xd3, 0xf3, 0xcd, 0xbe, 0xf7, 0x6a, 0x63, 0xc0, 0x1c, 0xc1, 0x86, 0xfa, 0xc7,
0x0a, 0x5c, 0x9e, 0x48, 0x0c, 0xdf, 0x3a, 0x6e, 0x43, 0x03, 0x0f, 0x23, 0xb7, 0xa1, 0xbf, 0x84,
0x8f, 0x3f, 0x23, 0xcc, 0xdf, 0xd2, 0x4d, 0x97, 0xd9, 0xd0, 0x19, 0x3d, 0xca, 0x4f, 0x15, 0xb8,
0xf8, 0x18, 0xfb, 0x5b, 0x81, 0x7f, 0x7d, 0x83, 0xbb, 0x43, 0x60, 0x22, 0x7e, 0x3e, 0x08, 0x34,
0x63, 0x7d, 0xea, 0x1f, 0x31, 0x76, 0x4a, 0xe9, 0x7d, 0x23, 0x1b, 0x78, 0x89, 0x6a, 0x42, 0xc4,
0x44, 0x70, 0x65, 0xe7, 0xdb, 0xa7, 0xfe, 0x76, 0x19, 0x1a, 0x9f, 0x71, 0xab, 0x40, 0x3d, 0x68,
0x72, 0x27, 0x14, 0x79, 0x10, 0x14, 0x89, 0xa6, 0x64, 0x01, 0xd6, 0x1a, 0x2c, 0x7a, 0x18, 0x1f,
0x9c, 0xd0, 0x5f, 0x36, 0xc8, 0x18, 0xe1, 0xec, 0x9e, 0xc0, 0xf2, 0xd8, 0xa6, 0x11, 0x3a, 0x36,
0xf8, 0x02, 0xd8, 0xa6, 0x4f, 0x37, 0xa6, 0xe9, 0x81, 0xe8, 0x53, 0x9e, 0x04, 0x44, 0x70, 0x95,
0x73, 0xe1, 0x4a, 0x0e, 0x43, 0x5d, 0x68, 0x19, 0xae, 0x33, 0x1a, 0x61, 0xa3, 0xe7, 0x05, 0xa8,
0x2a, 0xf9, 0x50, 0xf1, 0x71, 0x02, 0xd5, 0x5d, 0x38, 0x9d, 0xa4, 0xb4, 0x6b, 0x90, 0xb8, 0x90,
0x48, 0x96, 0xec, 0x13, 0xba, 0x05, 0xcb, 0x69, 0xf8, 0x2a, 0x85, 0x4f, 0x7f, 0x40, 0xef, 0x03,
0x4a, 0x90, 0x4a, 0xc0, 0x6b, 0x0c, 0x3c, 0x4e, 0x0c, 0x07, 0xa7, 0xc9, 0x69, 0x1c, 0x1c, 0x18,
0x38, 0xff, 0x12, 0x01, 0xef, 0x12, 0xef, 0x1a, 0x03, 0xf7, 0xda, 0xf5, 0x7c, 0x1b, 0x11, 0x47,
0xe6, 0xa9, 0xbf, 0xa7, 0xc0, 0xca, 0x73, 0xdd, 0xef, 0xef, 0x6f, 0x0c, 0xb9, 0x80, 0xce, 0xa1,
0xe0, 0x1f, 0x41, 0xed, 0x90, 0x0b, 0x63, 0x60, 0xc5, 0x2f, 0x4b, 0x08, 0x8a, 0x8a, 0xbd, 0x16,
0x8e, 0x20, 0x09, 0xd1, 0x99, 0x47, 0x91, 0xc4, 0xf0, 0x0d, 0x98, 0x9a, 0x29, 0x19, 0xad, 0xfa,
0x12, 0x80, 0x13, 0xb7, 0xe9, 0x0d, 0x66, 0xa0, 0xeb, 0x43, 0x58, 0xe0, 0xd8, 0xb8, 0x2d, 0x99,
0xc6, 0xb0, 0x00, 0x5c, 0xfd, 0x71, 0x05, 0xea, 0x91, 0x0f, 0xa8, 0x09, 0x05, 0x61, 0x24, 0x0a,
0x92, 0xd5, 0x15, 0xa6, 0xe7, 0x50, 0xc5, 0x74, 0x0e, 0x75, 0x1d, 0x9a, 0x26, 0x75, 0xde, 0x3d,
0xce, 0x15, 0x1a, 0x2b, 0xd7, 0xb4, 0x45, 0xd6, 0xcb, 0x45, 0x04, 0x5d, 0x82, 0xba, 0x3d, 0x1e,
0xf6, 0x9c, 0xbd, 0x9e, 0xeb, 0x1c, 0x79, 0x3c, 0x19, 0xab, 0xd9, 0xe3, 0xe1, 0xf7, 0xf7, 0x34,
0xe7, 0xc8, 0x0b, 0xe3, 0xfd, 0xca, 0x09, 0xe3, 0xfd, 0x4b, 0x50, 0x1f, 0xea, 0x2f, 0x09, 0xd6,
0x9e, 0x3d, 0x1e, 0xd2, 0x3c, 0xad, 0xa8, 0xd5, 0x86, 0xfa, 0x4b, 0xcd, 0x39, 0x7a, 0x3a, 0x1e,
0xa2, 0x55, 0x68, 0x59, 0xba, 0xe7, 0xf7, 0xa2, 0x89, 0x5e, 0x95, 0x26, 0x7a, 0x4d, 0xd2, 0xff,
0x49, 0x98, 0xec, 0xa5, 0x33, 0x87, 0xda, 0x6c, 0x99, 0x83, 0x31, 0xb4, 0x42, 0x1c, 0x90, 0x2b,
0x73, 0x30, 0x86, 0x96, 0xc0, 0xf0, 0x21, 0x2c, 0xec, 0xd2, 0x40, 0x28, 0x4b, 0x45, 0x1f, 0x91,
0x18, 0x88, 0xc5, 0x4b, 0x5a, 0x00, 0x8e, 0xbe, 0x03, 0x35, 0xea, 0x7f, 0xe8, 0xd8, 0x46, 0xae,
0xb1, 0xe1, 0x00, 0x32, 0xda, 0xc0, 0x96, 0xaf, 0xd3, 0xd1, 0x8b, 0xf9, 0x46, 0x8b, 0x01, 0xc4,
0x3e, 0xf6, 0x5d, 0xac, 0xfb, 0xd8, 0x58, 0x3b, 0x5e, 0x77, 0x86, 0x23, 0x9d, 0x8a, 0x50, 0xbb,
0x49, 0x43, 0x78, 0xd9, 0x27, 0xf4, 0x0e, 0x34, 0xfb, 0xa2, 0xf5, 0xc8, 0x75, 0x86, 0xed, 0x25,
0xaa, 0x3d, 0x89, 0x5e, 0x74, 0x11, 0x20, 0xb0, 0x8c, 0xba, 0xdf, 0x6e, 0x51, 0xde, 0xd5, 0x78,
0xcf, 0x43, 0x5a, 0xbd, 0x31, 0xbd, 0x1e, 0xab, 0x93, 0x98, 0xf6, 0xa0, 0xbd, 0x4c, 0x67, 0xac,
0x07, 0x85, 0x15, 0xd3, 0x1e, 0xa0, 0xb3, 0xb0, 0x60, 0x7a, 0xbd, 0x3d, 0xfd, 0x00, 0xb7, 0x11,
0xfd, 0x5a, 0x31, 0xbd, 0x47, 0xfa, 0x01, 0x56, 0xbf, 0x80, 0x33, 0xa1, 0x4c, 0x45, 0x98, 0x98,
0x16, 0x05, 0x65, 0x06, 0x51, 0xc8, 0x8e, 0x7c, 0x7f, 0x5e, 0x82, 0x95, 0x6d, 0xfd, 0x10, 0xbf,
0xfe, 0x20, 0x3b, 0x97, 0x1d, 0x7b, 0x02, 0xcb, 0x34, 0xae, 0xbe, 0x17, 0xa1, 0x27, 0xc3, 0x85,
0x47, 0xa5, 0x20, 0x3d, 0x10, 0x7d, 0x97, 0x84, 0x1d, 0xb8, 0x7f, 0xb0, 0x45, 0x72, 0x94, 0xc0,
0x7d, 0x5f, 0x94, 0xe0, 0x59, 0x17, 0x50, 0x5a, 0x74, 0x04, 0xda, 0x82, 0xa5, 0x38, 0x07, 0x02,
0xc7, 0x7d, 0x23, 0x33, 0x81, 0x0d, 0x77, 0x5f, 0x6b, 0xc6, 0x98, 0xe1, 0xa1, 0x36, 0x2c, 0x70,
0xaf, 0x4b, 0x8d, 0x44, 0x55, 0x0b, 0x9a, 0x68, 0x0b, 0x4e, 0xb3, 0x15, 0x6c, 0x73, 0x5d, 0x60,
0x8b, 0xaf, 0xe6, 0x5a, 0xbc, 0x6c, 0x68, 0x5c, 0x95, 0x6a, 0x27, 0x55, 0xa5, 0x36, 0x2c, 0x70,
0xf1, 0xa6, 0xd6, 0xa3, 0xaa, 0x05, 0x4d, 0xc2, 0xe6, 0x50, 0xd0, 0xeb, 0xf4, 0x5b, 0xd8, 0xa1,
0xfe, 0x8e, 0x02, 0x10, 0xee, 0xe7, 0x94, 0x02, 0xcb, 0xb7, 0xa0, 0x2a, 0x84, 0x3b, 0x57, 0x8e,
0x28, 0xc0, 0x93, 0xb6, 0xbc, 0x98, 0xb0, 0xe5, 0xea, 0x3f, 0x2b, 0xd0, 0xd8, 0x20, 0xab, 0x79,
0xe2, 0x0c, 0xa8, 0xe7, 0xb9, 0x0e, 0x4d, 0x17, 0xf7, 0x1d, 0xd7, 0xe8, 0x61, 0xdb, 0x77, 0x4d,
0xcc, 0x92, 0xf3, 0x92, 0xb6, 0xc8, 0x7a, 0x3f, 0x61, 0x9d, 0x04, 0x8c, 0x98, 0x67, 0xcf, 0xd7,
0x87, 0xa3, 0xde, 0x1e, 0x31, 0x08, 0x05, 0x06, 0x26, 0x7a, 0xa9, 0x3d, 0x78, 0x1b, 0x1a, 0x21,
0x98, 0xef, 0xd0, 0xf9, 0x4b, 0x5a, 0x5d, 0xf4, 0xed, 0x38, 0xe8, 0x1a, 0x34, 0xe9, 0x76, 0xf6,
0x2c, 0x67, 0xd0, 0x23, 0x29, 0x1f, 0x77, 0x4a, 0x0d, 0x83, 0x93, 0x45, 0xd8, 0x14, 0x87, 0xf2,
0xcc, 0x2f, 0x30, 0x77, 0x4b, 0x02, 0x6a, 0xdb, 0xfc, 0x02, 0xab, 0xbf, 0xa5, 0xc0, 0x22, 0xf7,
0x62, 0xdb, 0xa2, 0xf8, 0x4d, 0xab, 0x95, 0x2c, 0xdd, 0xa6, 0xbf, 0xd1, 0xb7, 0xe3, 0xf5, 0xaa,
0x6b, 0x52, 0x51, 0xa7, 0x48, 0x68, 0xec, 0x14, 0x73, 0x61, 0x79, 0xf2, 0xbd, 0x2f, 0xc9, 0x9e,
0xea, 0xbe, 0xfe, 0xd4, 0x31, 0x58, 0xf9, 0xac, 0x0d, 0x0b, 0xba, 0x61, 0xb8, 0xd8, 0xf3, 0x38,
0x1d, 0x41, 0x93, 0x7c, 0x39, 0xc4, 0xae, 0x17, 0x30, 0xb6, 0xa8, 0x05, 0x4d, 0xf4, 0x1d, 0xa8,
0x8a, 0x60, 0x8b, 0xd5, 0x29, 0xae, 0x4c, 0xa6, 0x93, 0x67, 0x27, 0x62, 0x84, 0xfa, 0x0f, 0x05,
0x68, 0x72, 0x4d, 0x5b, 0xe3, 0x0e, 0x27, 0x5b, 0xc4, 0xd6, 0xa0, 0xb1, 0x17, 0x4a, 0x78, 0x56,
0x75, 0x25, 0xaa, 0x08, 0xb1, 0x31, 0xd3, 0x64, 0x2d, 0xee, 0xf2, 0x4a, 0x73, 0xb9, 0xbc, 0xf2,
0x49, 0xf5, 0x34, 0x1d, 0xfa, 0x54, 0x24, 0xa1, 0x8f, 0xfa, 0x2b, 0x50, 0x8f, 0x20, 0xa0, 0x76,
0x88, 0x15, 0x30, 0xf8, 0x8e, 0x05, 0x4d, 0x74, 0x3f, 0x74, 0xfc, 0x6c, 0xab, 0xce, 0x49, 0x68,
0x49, 0xf8, 0x7c, 0xf5, 0x9f, 0x14, 0xa8, 0x70, 0xcc, 0x97, 0xa1, 0xce, 0xf5, 0x8b, 0x86, 0x42,
0x0c, 0x3b, 0xf0, 0x2e, 0x12, 0x0b, 0xbd, 0x3a, 0x05, 0x3b, 0x07, 0xd5, 0x84, 0x6a, 0x2d, 0x70,
0xe3, 0x17, 0x7c, 0x8a, 0xe8, 0x13, 0xf9, 0x44, 0x54, 0x09, 0x9d, 0x81, 0xb2, 0xe5, 0x0c, 0xc4,
0xe1, 0x06, 0x6b, 0xa8, 0x5f, 0x29, 0xb4, 0x16, 0xad, 0xe1, 0xbe, 0x73, 0x88, 0xdd, 0xe3, 0xf9,
0xcb, 0x79, 0x0f, 0x22, 0x62, 0x9e, 0x33, 0xa7, 0x10, 0x03, 0xd0, 0x83, 0x90, 0x09, 0x45, 0x59,
0xd6, 0x1f, 0x75, 0x38, 0x5c, 0x48, 0x43, 0x66, 0xfc, 0x89, 0x42, 0x0b, 0x93, 0xf1, 0xa5, 0xcc,
0xea, 0xd3, 0x5f, 0x49, 0x7c, 0xae, 0xfe, 0x5c, 0x81, 0x4e, 0x58, 0x56, 0xf0, 0xd6, 0x8e, 0xe7,
0x2d, 0xf6, 0xbf, 0x9a, 0xb4, 0xe1, 0x5b, 0xa2, 0x2e, 0x4d, 0x94, 0x36, 0x57, 0xc0, 0x1f, 0x54,
0xa5, 0x6d, 0x5a, 0xa1, 0x4c, 0x2f, 0x68, 0x1e, 0x91, 0xe9, 0x40, 0x55, 0xe4, 0xc5, 0xac, 0x36,
0x2d, 0xda, 0x44, 0xc3, 0xce, 0x3d, 0xc6, 0xfe, 0xa3, 0x78, 0x6d, 0xe1, 0x4d, 0x6f, 0x60, 0xb4,
0x5e, 0xbe, 0xcf, 0xeb, 0xe5, 0xa5, 0x44, 0xbd, 0x9c, 0xf7, 0xab, 0x43, 0x2a, 0x02, 0xa9, 0x05,
0xbc, 0xae, 0x0d, 0xfb, 0x5d, 0x05, 0xda, 0x7c, 0x16, 0x3a, 0x27, 0x89, 0xf9, 0x2d, 0xec, 0x63,
0xe3, 0xeb, 0xce, 0x80, 0xff, 0xa2, 0x00, 0xad, 0xa8, 0xd7, 0xa5, 0x8e, 0xf3, 0x1b, 0x50, 0xa6,
0x05, 0x04, 0x4e, 0xc1, 0x54, 0xd3, 0xc0, 0xa0, 0x89, 0xd9, 0xa6, 0x01, 0xe5, 0x8e, 0x17, 0x78,
0x55, 0xde, 0x0c, 0x5d, 0x7f, 0xf1, 0xe4, 0xae, 0xff, 0x02, 0xd4, 0x88, 0x59, 0x75, 0xc6, 0x04,
0x2f, 0x3b, 0xc4, 0x0c, 0x3b, 0xd0, 0x47, 0x50, 0x61, 0x57, 0x13, 0xf8, 0x19, 0xd2, 0xf5, 0x38,
0x6a, 0x7e, 0x6d, 0x21, 0x52, 0x03, 0xa6, 0x1d, 0x1a, 0x1f, 0x44, 0x78, 0x34, 0x72, 0x9d, 0x01,
0x8d, 0x11, 0x88, 0xc5, 0x2d, 0x6b, 0xa2, 0xad, 0xfe, 0x22, 0xac, 0x84, 0xa9, 0x18, 0x23, 0x69,
0x56, 0x81, 0x56, 0xff, 0x4d, 0x81, 0xd3, 0xdb, 0xc7, 0x76, 0x3f, 0xa9, 0x1a, 0x2b, 0x50, 0x19,
0x59, 0x7a, 0x58, 0x99, 0xe4, 0x2d, 0x7a, 0xea, 0xcb, 0xe6, 0xc6, 0x06, 0xf1, 0x2f, 0x6c, 0x3f,
0xeb, 0xa2, 0x6f, 0xc7, 0x99, 0xea, 0xf6, 0xaf, 0x8b, 0xdc, 0x11, 0x1b, 0xcc, 0x93, 0xb1, 0xca,
0xcb, 0xa2, 0xe8, 0xa5, 0x9e, 0xec, 0x23, 0x00, 0xea, 0xec, 0x7b, 0x27, 0x71, 0xf0, 0x74, 0xc4,
0x13, 0x62, 0xce, 0x7f, 0x56, 0x80, 0x76, 0x64, 0x97, 0xbe, 0xee, 0xd8, 0x67, 0x42, 0x5e, 0x52,
0x7c, 0x45, 0x79, 0x49, 0x69, 0xfe, 0x78, 0xa7, 0x2c, 0x8b, 0x77, 0x7e, 0xa3, 0x08, 0xcd, 0x70,
0xd7, 0xb6, 0x2c, 0xdd, 0x9e, 0x28, 0x09, 0xdb, 0xd0, 0xf4, 0x62, 0xbb, 0xca, 0xf7, 0xe9, 0x3d,
0x99, 0x0e, 0x4d, 0x60, 0x84, 0x96, 0x40, 0x81, 0x2e, 0x52, 0xa6, 0xbb, 0x3e, 0xab, 0xf5, 0xb0,
0xe0, 0xa5, 0xc6, 0x94, 0xd5, 0x1c, 0x62, 0x74, 0x0b, 0x10, 0xd7, 0xb0, 0x9e, 0x69, 0xf7, 0x3c,
0xdc, 0x77, 0x6c, 0x83, 0xe9, 0x5e, 0x59, 0x6b, 0xf1, 0x2f, 0x5d, 0x7b, 0x9b, 0xf5, 0xa3, 0x6f,
0x40, 0xc9, 0x3f, 0x1e, 0xb1, 0x48, 0xa6, 0x29, 0x8d, 0x05, 0x42, 0xba, 0x76, 0x8e, 0x47, 0x58,
0xa3, 0xe0, 0xc1, 0xed, 0x14, 0xdf, 0xd5, 0x0f, 0x79, 0x58, 0x58, 0xd2, 0x22, 0x3d, 0xc4, 0x9a,
0x04, 0x7b, 0xb8, 0xc0, 0xc2, 0x27, 0xde, 0x64, 0x92, 0x1d, 0x28, 0x74, 0xcf, 0xf7, 0x2d, 0x5a,
0xad, 0xa2, 0x92, 0x1d, 0xf4, 0xee, 0xf8, 0x16, 0x59, 0xa4, 0xef, 0xf8, 0xba, 0xc5, 0xf4, 0xa3,
0xc6, 0x2d, 0x07, 0xe9, 0xa1, 0x29, 0xd8, 0xbf, 0x12, 0xcb, 0x27, 0x08, 0xd3, 0xb0, 0x37, 0xb6,
0x26, 0xeb, 0x63, 0x76, 0xf1, 0x60, 0x9a, 0x2a, 0x7e, 0x17, 0xea, 0x5c, 0x2a, 0x4e, 0x20, 0x55,
0xc0, 0x86, 0x3c, 0xc9, 0x10, 0xf3, 0xf2, 0x2b, 0x12, 0xf3, 0xca, 0x0c, 0xe9, 0xb7, 0x9c, 0x37,
0xea, 0x4f, 0x14, 0x78, 0x2b, 0x65, 0x35, 0x33, 0xb7, 0x36, 0x3b, 0x2d, 0xe4, 0xd6, 0x34, 0x89,
0x92, 0xfb, 0x86, 0x07, 0x50, 0x71, 0x29, 0x76, 0x7e, 0x22, 0x73, 0x35, 0x53, 0xf8, 0x18, 0x21,
0x1a, 0x1f, 0xa2, 0xfe, 0xa9, 0x02, 0x67, 0xd3, 0xa4, 0xce, 0xe1, 0xf0, 0xd7, 0x60, 0x81, 0xa1,
0x0e, 0x74, 0x74, 0x35, 0x5b, 0x47, 0xc3, 0xcd, 0xd1, 0x82, 0x81, 0xea, 0x36, 0xac, 0x04, 0x71,
0x41, 0xb8, 0xf5, 0x9b, 0xd8, 0xd7, 0x33, 0x92, 0xa2, 0xcb, 0x50, 0x67, 0xd1, 0x35, 0x4b, 0x36,
0xd8, 0x01, 0x16, 0xec, 0x8a, 0x5a, 0x93, 0xfa, 0x5f, 0x0a, 0x9c, 0xa1, 0x8e, 0x35, 0x79, 0x1a,
0x91, 0xe7, 0x78, 0x4c, 0x15, 0x17, 0x90, 0x9e, 0xea, 0x43, 0x7e, 0x49, 0xa2, 0xa6, 0xc5, 0xfa,
0x50, 0x37, 0x5d, 0x8a, 0x92, 0x26, 0xcf, 0xe1, 0x79, 0x20, 0x49, 0xd4, 0xe9, 0x71, 0x60, 0xb2,
0x06, 0x15, 0x3a, 0xf4, 0xd2, 0x0c, 0x0e, 0x5d, 0x7d, 0x02, 0x6f, 0x25, 0x56, 0x3a, 0x07, 0x47,
0xd5, 0xbf, 0x51, 0x08, 0x3b, 0x62, 0x97, 0x4d, 0x66, 0x0f, 0x6a, 0x2f, 0x8a, 0x63, 0x90, 0x9e,
0x69, 0x24, 0x8d, 0x88, 0x81, 0x3e, 0x86, 0x9a, 0x8d, 0x8f, 0x7a, 0xd1, 0x38, 0x29, 0x47, 0xc4,
0x5f, 0xb5, 0xf1, 0x11, 0xfd, 0xa5, 0x3e, 0x85, 0xb3, 0x29, 0x52, 0xe7, 0x59, 0xfb, 0x3f, 0x2a,
0x70, 0x6e, 0xc3, 0x75, 0x46, 0x9f, 0x99, 0xae, 0x3f, 0xd6, 0xad, 0xf8, 0x49, 0xeb, 0x0c, 0xcb,
0xcf, 0x71, 0x91, 0xed, 0xd3, 0x48, 0xc4, 0xcc, 0xe4, 0xe7, 0x96, 0x44, 0x83, 0xd2, 0x44, 0xf1,
0x45, 0x47, 0xe2, 0xeb, 0xff, 0x28, 0xca, 0x88, 0xe7, 0x70, 0x53, 0xe2, 0x92, 0x3c, 0xc9, 0x87,
0xb4, 0x14, 0x5c, 0x9c, 0xb5, 0x14, 0x3c, 0xc1, 0xbc, 0x97, 0x5e, 0x91, 0x79, 0x3f, 0x71, 0xd5,
0x66, 0x1d, 0xe2, 0x65, 0x7a, 0xea, 0x9d, 0x4f, 0x5a, 0xda, 0xff, 0x08, 0x20, 0xac, 0x56, 0xf3,
0xcb, 0x81, 0x53, 0x30, 0x44, 0x06, 0x10, 0x1e, 0x09, 0x07, 0xca, 0xfd, 0x7b, 0xa4, 0x7e, 0xfa,
0x03, 0xe8, 0xc8, 0x64, 0x73, 0x1e, 0x79, 0xff, 0x59, 0x01, 0xa0, 0x2b, 0xae, 0x92, 0xce, 0xe6,
0x01, 0xae, 0x42, 0x24, 0x06, 0x09, 0xb5, 0x3c, 0x2a, 0x3b, 0x06, 0x51, 0x04, 0x91, 0xa5, 0x12,
0x98, 0x54, 0xe6, 0x6a, 0x50, 0x3c, 0x11, 0x5d, 0x61, 0xa2, 0x90, 0x34, 0xba, 0xe7, 0xa1, 0xe6,
0x3a, 0x47, 0x3d, 0xa2, 0x5c, 0x46, 0x70, 0x57, 0xd6, 0x75, 0x8e, 0x88, 0xca, 0x19, 0xe8, 0x2c,
0x2c, 0xf8, 0xba, 0x77, 0x40, 0xf0, 0xb3, 0x4a, 0x52, 0x85, 0x34, 0xbb, 0x06, 0x3a, 0x03, 0xe5,
0x3d, 0xd3, 0xc2, 0xec, 0x58, 0xbe, 0xa6, 0xb1, 0x06, 0xfa, 0x66, 0x70, 0xbd, 0xab, 0x9a, 0xfb,
0x1a, 0x07, 0x85, 0x57, 0xbf, 0x52, 0x60, 0x29, 0xdc, 0x35, 0x6a, 0x76, 0x88, 0x25, 0xa3, 0x56,
0x6c, 0xdd, 0x31, 0x98, 0x81, 0x68, 0x4e, 0xf0, 0x03, 0x6c, 0x20, 0xb3, 0x55, 0xe1, 0x90, 0xac,
0xc4, 0x99, 0xac, 0x8b, 0x2c, 0xda, 0x34, 0x82, 0x9b, 0xdf, 0x15, 0xd7, 0x39, 0xea, 0x1a, 0x62,
0x37, 0xd8, 0x45, 0x58, 0x96, 0x26, 0x92, 0xdd, 0x58, 0xa7, 0x77, 0x61, 0xaf, 0xc2, 0x22, 0x76,
0x5d, 0xc7, 0xed, 0x0d, 0xb1, 0xe7, 0xe9, 0x03, 0xcc, 0xa3, 0xf2, 0x06, 0xed, 0xdc, 0x64, 0x7d,
0xea, 0x9f, 0x97, 0xa0, 0x19, 0x2e, 0x25, 0x38, 0x0f, 0x36, 0x8d, 0xe0, 0x3c, 0xd8, 0x24, 0xac,
0x03, 0x97, 0x19, 0x40, 0xc1, 0xdc, 0xb5, 0x42, 0x5b, 0xd1, 0x6a, 0xbc, 0xb7, 0x6b, 0x10, 0x67,
0x4c, 0x54, 0xcb, 0x76, 0x0c, 0x1c, 0x32, 0x17, 0x82, 0x2e, 0xce, 0xdb, 0x98, 0x8c, 0x94, 0x72,
0xc8, 0x48, 0x39, 0x87, 0x8c, 0x54, 0x24, 0x32, 0xb2, 0x02, 0x95, 0xdd, 0x71, 0xff, 0x00, 0xfb,
0x3c, 0x4e, 0xe3, 0xad, 0xb8, 0xec, 0x54, 0x13, 0xb2, 0x23, 0x44, 0xa4, 0x16, 0x15, 0x91, 0xf3,
0x50, 0x63, 0x47, 0x94, 0x3d, 0xdf, 0xa3, 0x87, 0x2e, 0x45, 0xad, 0xca, 0x3a, 0x76, 0x3c, 0xf4,
0x61, 0x10, 0xc4, 0xd5, 0xa9, 0xb2, 0xa8, 0x12, 0x5b, 0x93, 0x90, 0x92, 0x20, 0x84, 0xbb, 0x01,
0x4b, 0x91, 0xed, 0xa0, 0x9e, 0xa1, 0x41, 0x49, 0x8d, 0xc4, 0xf8, 0xd4, 0x39, 0x5c, 0x87, 0x66,
0xb8, 0x25, 0x14, 0x6e, 0x91, 0xa5, 0x56, 0xa2, 0x97, 0x82, 0x09, 0x49, 0x6e, 0x9e, 0x4c, 0x92,
0xd1, 0x39, 0xa8, 0xf2, 0x9c, 0xc8, 0x6b, 0x2f, 0xc5, 0xca, 0x17, 0xea, 0x8f, 0x00, 0x85, 0xd4,
0xcf, 0x17, 0x23, 0x26, 0xc4, 0xa3, 0x90, 0x14, 0x0f, 0xf5, 0x6f, 0x15, 0x58, 0x8e, 0x4e, 0x36,
0xab, 0xbb, 0xfd, 0x18, 0xea, 0xec, 0xd8, 0xab, 0x47, 0x14, 0x5f, 0x7e, 0x7e, 0x95, 0xe0, 0x8b,
0x06, 0xe1, 0x55, 0x7a, 0x22, 0x5e, 0x47, 0x8e, 0x7b, 0x60, 0xda, 0x83, 0x1e, 0xa1, 0x2c, 0x50,
0xb7, 0x06, 0xef, 0x7c, 0x4a, 0xfa, 0xd4, 0x3f, 0x50, 0xe0, 0xd2, 0xb3, 0x91, 0xa1, 0xfb, 0x38,
0x12, 0x77, 0xcc, 0x7b, 0xa3, 0x4d, 0x5c, 0x29, 0x2b, 0x64, 0x70, 0x30, 0x32, 0x9f, 0xc7, 0xaf,
0x94, 0x91, 0x68, 0x8d, 0x53, 0x93, 0xba, 0x03, 0x3a, 0x3b, 0x35, 0x1d, 0xa8, 0x1e, 0x72, 0x74,
0xc1, 0xe3, 0x80, 0xa0, 0x1d, 0x3b, 0x20, 0x2c, 0x9e, 0xe8, 0x80, 0x50, 0xdd, 0x84, 0x73, 0x1a,
0xf6, 0xb0, 0x6d, 0xc4, 0x16, 0x32, 0x73, 0x7d, 0x69, 0x04, 0x1d, 0x19, 0xba, 0x79, 0x24, 0x95,
0x85, 0xab, 0x3d, 0x97, 0xa0, 0xf5, 0xb9, 0x1d, 0x26, 0x51, 0x12, 0x9d, 0xc7, 0x57, 0xff, 0xae,
0x00, 0x67, 0x1f, 0x1a, 0x06, 0x37, 0xe1, 0x3c, 0x00, 0x7b, 0x5d, 0xb1, 0x71, 0x32, 0x76, 0x2c,
0xa6, 0x63, 0xc7, 0x57, 0x65, 0x56, 0xb9, 0x83, 0xb1, 0xc7, 0xc3, 0xc0, 0x71, 0xba, 0xec, 0x96,
0xcc, 0x03, 0x7e, 0x8c, 0x46, 0x72, 0x78, 0xea, 0x3c, 0xa7, 0x87, 0x54, 0xd5, 0xa0, 0x4e, 0xa6,
0x8e, 0xa0, 0x9d, 0xde, 0xac, 0x39, 0xed, 0x48, 0xb0, 0x23, 0x23, 0x87, 0xd5, 0x5b, 0x1b, 0x24,
0x7e, 0xa2, 0x5d, 0x5b, 0x8e, 0xa7, 0xfe, 0x4f, 0x01, 0xda, 0xdb, 0xfa, 0x21, 0xfe, 0xff, 0xc3,
0xa0, 0xcf, 0xe1, 0x8c, 0xa7, 0x1f, 0xe2, 0x5e, 0x24, 0x17, 0xee, 0xb9, 0xf8, 0x05, 0x0f, 0x3d,
0xdf, 0x95, 0x55, 0xc4, 0xa5, 0x77, 0x4b, 0xb4, 0x65, 0x2f, 0xd6, 0xaf, 0xe1, 0x17, 0xe8, 0x1d,
0x58, 0x8a, 0x5e, 0x59, 0x22, 0xa4, 0x55, 0xe9, 0x96, 0x2f, 0x46, 0xae, 0x25, 0x75, 0x0d, 0xf5,
0x05, 0x5c, 0x78, 0x66, 0x7b, 0xd8, 0xef, 0x86, 0x57, 0x6b, 0xe6, 0xcc, 0x1a, 0x2f, 0x43, 0x3d,
0xdc, 0xf8, 0xd4, 0xab, 0x00, 0xc3, 0x53, 0x1d, 0xe8, 0x6c, 0xea, 0xee, 0x41, 0x50, 0x59, 0xde,
0x60, 0xf7, 0x20, 0x5e, 0xe3, 0x84, 0x7b, 0xe2, 0x46, 0x90, 0x86, 0xf7, 0xb0, 0x8b, 0xed, 0x3e,
0x7e, 0xe2, 0xf4, 0x0f, 0x48, 0xac, 0xe1, 0xb3, 0x87, 0x59, 0x4a, 0x24, 0xe2, 0xdc, 0x88, 0xbc,
0xbb, 0x2a, 0xc4, 0xde, 0x5d, 0x4d, 0x79, 0xc7, 0xa7, 0xfe, 0xb4, 0x00, 0x2b, 0x0f, 0x2d, 0x1f,
0xbb, 0x61, 0xb2, 0x7f, 0x92, 0xba, 0x45, 0x58, 0x48, 0x28, 0xcc, 0x72, 0x32, 0x90, 0xbc, 0x1f,
0x5d, 0x4c, 0xdf, 0x8f, 0x96, 0x95, 0x3d, 0x4a, 0x33, 0x96, 0x3d, 0x1e, 0x02, 0x8c, 0x5c, 0x67,
0x84, 0x5d, 0xdf, 0xc4, 0x41, 0xc6, 0x96, 0x23, 0x76, 0x89, 0x0c, 0x52, 0x3f, 0x87, 0xd6, 0xe3,
0xfe, 0xba, 0x63, 0xef, 0x99, 0xee, 0x30, 0xd8, 0xa8, 0x94, 0xd2, 0x29, 0x39, 0x94, 0xae, 0x90,
0x52, 0x3a, 0xd5, 0x84, 0xe5, 0x08, 0xee, 0x39, 0x0d, 0xd7, 0xa0, 0xdf, 0xdb, 0x33, 0x6d, 0x93,
0xde, 0x33, 0x2a, 0xd0, 0xd8, 0x13, 0x06, 0xfd, 0x47, 0xbc, 0xe7, 0xe6, 0xc7, 0xe2, 0x4a, 0xe6,
0xce, 0xf1, 0x08, 0xa3, 0x05, 0x28, 0x3e, 0xc5, 0x47, 0xad, 0x53, 0x08, 0xa0, 0xf2, 0xd4, 0x71,
0x87, 0xba, 0xd5, 0x52, 0x50, 0x1d, 0x16, 0xf8, 0x51, 0x5d, 0xab, 0x80, 0x16, 0xa1, 0xb6, 0x1e,
0x1c, 0x69, 0xb4, 0x8a, 0x37, 0xff, 0x52, 0x81, 0xe5, 0xd4, 0x61, 0x12, 0x6a, 0x02, 0x3c, 0xb3,
0xfb, 0xfc, 0x94, 0xad, 0x75, 0x0a, 0x35, 0xa0, 0x1a, 0x9c, 0xb9, 0x31, 0x7c, 0x3b, 0x0e, 0x85,
0x6e, 0x15, 0x50, 0x0b, 0x1a, 0x6c, 0xe0, 0xb8, 0xdf, 0xc7, 0x9e, 0xd7, 0x2a, 0x8a, 0x9e, 0x47,
0xba, 0x69, 0x8d, 0x5d, 0xdc, 0x2a, 0x91, 0x39, 0x77, 0x1c, 0x0d, 0x5b, 0x58, 0xf7, 0x70, 0xab,
0x8c, 0x10, 0x34, 0x79, 0x23, 0x18, 0x54, 0x89, 0xf4, 0x05, 0xc3, 0x16, 0x6e, 0x3e, 0x8f, 0x96,
0xfd, 0xe9, 0xf2, 0xce, 0xc2, 0xe9, 0x67, 0xb6, 0x81, 0xf7, 0x4c, 0x1b, 0x1b, 0xe1, 0xa7, 0xd6,
0x29, 0x74, 0x1a, 0x96, 0x36, 0xb1, 0x3b, 0xc0, 0x91, 0xce, 0x02, 0x5a, 0x86, 0xc5, 0x4d, 0xf3,
0x65, 0xa4, 0xab, 0xa8, 0x96, 0xaa, 0x4a, 0x4b, 0xb9, 0xf7, 0xdf, 0x2a, 0xd4, 0x88, 0x6c, 0xad,
0x3b, 0x8e, 0x6b, 0x20, 0x0b, 0x10, 0x7d, 0xf8, 0x30, 0x1c, 0x39, 0xb6, 0x78, 0x24, 0x85, 0x6e,
0x27, 0x62, 0x13, 0xd6, 0x48, 0x03, 0x72, 0xd9, 0xe9, 0x5c, 0x93, 0xc2, 0x27, 0x80, 0xd5, 0x53,
0x68, 0x48, 0x67, 0xdb, 0x31, 0x87, 0x78, 0xc7, 0xec, 0x1f, 0x04, 0xb1, 0xd1, 0xdd, 0x09, 0x2f,
0x4d, 0xd2, 0xa0, 0xc1, 0x7c, 0x57, 0xa5, 0xf3, 0xb1, 0x97, 0x29, 0x81, 0xcc, 0xa9, 0xa7, 0xd0,
0x0b, 0x38, 0xf3, 0x18, 0x47, 0x02, 0xcd, 0x60, 0xc2, 0x7b, 0x93, 0x27, 0x4c, 0x01, 0x9f, 0x70,
0xca, 0x27, 0x50, 0xa6, 0xe2, 0x86, 0x64, 0x27, 0xa1, 0xd1, 0x17, 0xce, 0x9d, 0x2b, 0x93, 0x01,
0x04, 0xb6, 0x1f, 0xc1, 0x52, 0xe2, 0xed, 0x23, 0x92, 0x39, 0x27, 0xf9, 0x2b, 0xd6, 0xce, 0xcd,
0x3c, 0xa0, 0x62, 0xae, 0x01, 0x34, 0xe3, 0x0f, 0x26, 0xd0, 0x6a, 0x8e, 0x67, 0x57, 0x6c, 0xa6,
0x77, 0x73, 0x3f, 0xd0, 0xa2, 0x42, 0xd0, 0x4a, 0xbe, 0xca, 0x43, 0x37, 0x33, 0x11, 0xc4, 0x85,
0xed, 0xbd, 0x5c, 0xb0, 0x62, 0xba, 0x63, 0x2a, 0x04, 0xa9, 0x27, 0x51, 0x49, 0x19, 0x0f, 0xd0,
0x4c, 0x7a, 0xab, 0xd5, 0xb9, 0x93, 0x1b, 0x5e, 0x4c, 0xfd, 0x9b, 0xec, 0x2e, 0x8e, 0xec, 0x59,
0x11, 0xfa, 0x40, 0x8e, 0x2e, 0xe3, 0x3d, 0x54, 0xe7, 0xde, 0x49, 0x86, 0x08, 0x22, 0x7e, 0x9d,
0x5e, 0xa2, 0x91, 0x3c, 0xcc, 0x49, 0xea, 0x5d, 0x80, 0x6f, 0xf2, 0x9b, 0xa3, 0xce, 0x07, 0x27,
0x18, 0x21, 0x08, 0x70, 0x92, 0xcf, 0x1e, 0x03, 0x35, 0xbc, 0x33, 0x55, 0x6a, 0x66, 0xd3, 0xc1,
0x1f, 0xc2, 0x52, 0x22, 0x5c, 0x43, 0xf9, 0x43, 0xba, 0x4e, 0x96, 0x6b, 0x62, 0x2a, 0x99, 0xb8,
0x93, 0x84, 0x26, 0x48, 0xbf, 0xe4, 0xde, 0x52, 0xe7, 0x66, 0x1e, 0x50, 0xb1, 0x10, 0x8f, 0x9a,
0xcb, 0xc4, 0x4d, 0x13, 0x74, 0x4b, 0x8e, 0x43, 0x7e, 0xa3, 0xa6, 0xf3, 0x7e, 0x4e, 0x68, 0x31,
0xe9, 0x21, 0x9c, 0x96, 0x5c, 0x08, 0x42, 0xef, 0x67, 0x32, 0x2b, 0x79, 0x13, 0xaa, 0x73, 0x3b,
0x2f, 0x78, 0xc4, 0x58, 0xb7, 0x02, 0xba, 0x1e, 0x5a, 0x16, 0x73, 0xc5, 0xb7, 0x26, 0xf9, 0xa1,
0x18, 0xd8, 0x84, 0xa5, 0x4e, 0x84, 0x16, 0x53, 0xfe, 0x2a, 0xa0, 0xed, 0x7d, 0xe7, 0x88, 0x06,
0x2b, 0x83, 0xb1, 0xab, 0xb3, 0xf8, 0x6a, 0x92, 0x3b, 0x4a, 0x83, 0x4e, 0x50, 0x8b, 0xcc, 0x11,
0x62, 0xf2, 0x1e, 0xc0, 0x63, 0xec, 0x6f, 0x62, 0xdf, 0x25, 0xba, 0xf8, 0xce, 0x24, 0xda, 0x39,
0x40, 0x30, 0xd5, 0x8d, 0xa9, 0x70, 0xd1, 0x0d, 0xdd, 0xd4, 0xed, 0xb1, 0x6e, 0x45, 0x5e, 0x09,
0xc8, 0x37, 0x34, 0x09, 0x96, 0xbd, 0xa1, 0x69, 0x68, 0x31, 0xe5, 0x91, 0x88, 0x26, 0x22, 0xe7,
0x96, 0xd9, 0xd1, 0x44, 0xfa, 0xce, 0x4c, 0xd2, 0xd2, 0x66, 0xc0, 0x8b, 0x89, 0xbf, 0x54, 0xe8,
0x35, 0xb6, 0x04, 0xc0, 0x73, 0xd3, 0xdf, 0xdf, 0xb2, 0x74, 0xdb, 0xcb, 0x43, 0x02, 0x05, 0x3c,
0x01, 0x09, 0x1c, 0x5e, 0x90, 0x60, 0xc0, 0x62, 0xec, 0x38, 0x11, 0xc9, 0xee, 0xd6, 0xcb, 0x8e,
0x56, 0x3b, 0xab, 0xd3, 0x01, 0xc5, 0x2c, 0xfb, 0xb0, 0x18, 0x08, 0x34, 0xdb, 0xdc, 0x77, 0x33,
0x85, 0x3e, 0xb6, 0xaf, 0x37, 0xf3, 0x80, 0x46, 0x8d, 0x4f, 0xfa, 0xdc, 0x04, 0xe5, 0x3b, 0x65,
0xcb, 0x32, 0x3e, 0x93, 0x0f, 0x63, 0x98, 0x75, 0x4d, 0x9c, 0x4c, 0xca, 0x4d, 0xb7, 0xf4, 0xa0,
0x55, 0x6a, 0x5d, 0x27, 0x1c, 0x74, 0xaa, 0xa7, 0xd0, 0x73, 0xa8, 0xf0, 0x7f, 0x0b, 0xb9, 0x96,
0x5d, 0xeb, 0xe4, 0xd8, 0xaf, 0x4f, 0x81, 0x12, 0x88, 0x0f, 0xe0, 0xec, 0x84, 0x4a, 0xa7, 0xd4,
0xeb, 0x67, 0x57, 0x45, 0xa7, 0xf9, 0x23, 0x31, 0x59, 0xaa, 0x90, 0x99, 0x31, 0xd9, 0xa4, 0xa2,
0xe7, 0xb4, 0xc9, 0x7a, 0xb0, 0x9c, 0x2a, 0x14, 0xa1, 0xf7, 0x26, 0xf8, 0x56, 0x59, 0x39, 0x69,
0xda, 0x04, 0x03, 0x78, 0x4b, 0x5a, 0x14, 0x91, 0xc6, 0x0a, 0x59, 0xe5, 0x93, 0x69, 0x13, 0xf5,
0xe1, 0xb4, 0xa4, 0x14, 0x22, 0xf5, 0x72, 0x93, 0x4b, 0x26, 0xd3, 0x26, 0xd9, 0x83, 0xce, 0x9a,
0xeb, 0xe8, 0x46, 0x5f, 0xf7, 0x7c, 0x5a, 0x9e, 0x20, 0x89, 0x5b, 0x10, 0xac, 0xc9, 0x23, 0x79,
0x69, 0x11, 0x63, 0xda, 0x3c, 0xbb, 0x50, 0xa7, 0xac, 0x64, 0xff, 0xe8, 0x80, 0xe4, 0x3e, 0x22,
0x02, 0x31, 0xc1, 0xf0, 0xc8, 0x00, 0x85, 0x50, 0xef, 0x40, 0x7d, 0x9d, 0x1e, 0xe1, 0x74, 0x6d,
0x03, 0xbf, 0x4c, 0xfa, 0x2b, 0xfa, 0xac, 0xf5, 0x76, 0x04, 0x20, 0xf7, 0x0e, 0x2d, 0xd2, 0x18,
0xda, 0xc0, 0x2f, 0x19, 0x9f, 0x57, 0x65, 0x78, 0x63, 0x20, 0x13, 0x72, 0x0e, 0x29, 0x64, 0xc4,
0xd3, 0x9f, 0x89, 0x46, 0x96, 0x62, 0xba, 0x3b, 0x13, 0x90, 0xa4, 0x20, 0x83, 0x59, 0xef, 0xe6,
0x1f, 0x10, 0xf5, 0x0c, 0x01, 0x5d, 0x5d, 0x7a, 0x7e, 0x74, 0x23, 0x8b, 0xf4, 0x68, 0xb8, 0xb8,
0x3a, 0x1d, 0x50, 0xcc, 0xb2, 0x05, 0x35, 0x22, 0x9d, 0x8c, 0x3d, 0xd7, 0x64, 0x03, 0xc5, 0xe7,
0xfc, 0xcc, 0xd9, 0xc0, 0x5e, 0xdf, 0x35, 0x77, 0x39, 0xd3, 0xa5, 0xe4, 0xc4, 0x40, 0x32, 0x99,
0x93, 0x80, 0x14, 0x94, 0xff, 0x1a, 0x4d, 0x10, 0x68, 0xef, 0xda, 0xd8, 0xb4, 0x8c, 0x2d, 0x7e,
0xad, 0x16, 0xdd, 0xcd, 0x5a, 0x7e, 0x0c, 0x74, 0x62, 0x24, 0x96, 0x31, 0x42, 0xcc, 0xff, 0xcb,
0x50, 0x13, 0x15, 0x2b, 0x24, 0xbb, 0x17, 0x96, 0xac, 0x95, 0x75, 0xae, 0x65, 0x03, 0x05, 0x98,
0xef, 0x7d, 0x55, 0x83, 0x6a, 0xf0, 0xce, 0xe8, 0x6b, 0x2e, 0xb5, 0xbc, 0x81, 0xda, 0xc7, 0x0f,
0x61, 0x29, 0xf1, 0x94, 0x5d, 0x6a, 0xe3, 0xe4, 0xcf, 0xdd, 0xa7, 0x09, 0xe3, 0x73, 0xfe, 0x4f,
0x6b, 0x22, 0x0d, 0xba, 0x31, 0xa9, 0x7e, 0x92, 0xcc, 0x80, 0xa6, 0x20, 0xfe, 0xbf, 0x9d, 0x04,
0x3c, 0x05, 0x88, 0x84, 0xff, 0xd9, 0x37, 0x6e, 0x49, 0x44, 0x3b, 0x6d, 0xb7, 0x86, 0xd2, 0x08,
0xff, 0xdd, 0x3c, 0xb7, 0x17, 0x27, 0xc7, 0x68, 0x93, 0xe3, 0xfa, 0x67, 0xd0, 0x88, 0xde, 0x85,
0x47, 0xd2, 0xff, 0xf5, 0x4a, 0x5f, 0x96, 0x9f, 0xb6, 0x8a, 0xcd, 0x13, 0x86, 0x7e, 0x53, 0xd0,
0x79, 0x80, 0xd2, 0x47, 0xaa, 0xd2, 0x50, 0x79, 0xe2, 0x41, 0xae, 0x34, 0x54, 0x9e, 0x7c, 0x4e,
0xcb, 0xca, 0x68, 0xc9, 0x73, 0x42, 0x69, 0x19, 0x6d, 0xc2, 0xc9, 0xab, 0xb4, 0x8c, 0x36, 0xe9,
0xe0, 0x51, 0x3d, 0xb5, 0x76, 0xff, 0xf3, 0x0f, 0x06, 0xa6, 0xbf, 0x3f, 0xde, 0x25, 0xab, 0xbf,
0xc3, 0x86, 0xbe, 0x6f, 0x3a, 0xfc, 0xd7, 0x9d, 0x40, 0xdc, 0xef, 0x50, 0x6c, 0x77, 0x08, 0xb6,
0xd1, 0xee, 0x6e, 0x85, 0xb6, 0xee, 0xff, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xa7, 0x3e,
0xfa, 0x65, 0x52, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -5187,6 +5188,7 @@ type DataCoordClient interface {
GetRecoveryInfo(ctx context.Context, in *GetRecoveryInfoRequest, opts ...grpc.CallOption) (*GetRecoveryInfoResponse, error)
GetFlushedSegments(ctx context.Context, in *GetFlushedSegmentsRequest, opts ...grpc.CallOption) (*GetFlushedSegmentsResponse, error)
GetSegmentsByStates(ctx context.Context, in *GetSegmentsByStatesRequest, opts ...grpc.CallOption) (*GetSegmentsByStatesResponse, error)
GetFlushAllState(ctx context.Context, in *milvuspb.GetFlushAllStateRequest, opts ...grpc.CallOption) (*milvuspb.GetFlushAllStateResponse, error)
ShowConfigurations(ctx context.Context, in *internalpb.ShowConfigurationsRequest, opts ...grpc.CallOption) (*internalpb.ShowConfigurationsResponse, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
GetMetrics(ctx context.Context, in *milvuspb.GetMetricsRequest, opts ...grpc.CallOption) (*milvuspb.GetMetricsResponse, error)
@ -5361,6 +5363,15 @@ func (c *dataCoordClient) GetSegmentsByStates(ctx context.Context, in *GetSegmen
return out, nil
}
func (c *dataCoordClient) GetFlushAllState(ctx context.Context, in *milvuspb.GetFlushAllStateRequest, opts ...grpc.CallOption) (*milvuspb.GetFlushAllStateResponse, error) {
out := new(milvuspb.GetFlushAllStateResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataCoord/GetFlushAllState", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *dataCoordClient) ShowConfigurations(ctx context.Context, in *internalpb.ShowConfigurationsRequest, opts ...grpc.CallOption) (*internalpb.ShowConfigurationsResponse, error) {
out := new(internalpb.ShowConfigurationsResponse)
err := c.cc.Invoke(ctx, "/milvus.proto.data.DataCoord/ShowConfigurations", in, out, opts...)
@ -5603,6 +5614,7 @@ type DataCoordServer interface {
GetRecoveryInfo(context.Context, *GetRecoveryInfoRequest) (*GetRecoveryInfoResponse, error)
GetFlushedSegments(context.Context, *GetFlushedSegmentsRequest) (*GetFlushedSegmentsResponse, error)
GetSegmentsByStates(context.Context, *GetSegmentsByStatesRequest) (*GetSegmentsByStatesResponse, error)
GetFlushAllState(context.Context, *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error)
ShowConfigurations(context.Context, *internalpb.ShowConfigurationsRequest) (*internalpb.ShowConfigurationsResponse, error)
// https://wiki.lfaidata.foundation/display/MIL/MEP+8+--+Add+metrics+for+proxy
GetMetrics(context.Context, *milvuspb.GetMetricsRequest) (*milvuspb.GetMetricsResponse, error)
@ -5683,6 +5695,9 @@ func (*UnimplementedDataCoordServer) GetFlushedSegments(ctx context.Context, req
func (*UnimplementedDataCoordServer) GetSegmentsByStates(ctx context.Context, req *GetSegmentsByStatesRequest) (*GetSegmentsByStatesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetSegmentsByStates not implemented")
}
func (*UnimplementedDataCoordServer) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetFlushAllState not implemented")
}
func (*UnimplementedDataCoordServer) ShowConfigurations(ctx context.Context, req *internalpb.ShowConfigurationsRequest) (*internalpb.ShowConfigurationsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ShowConfigurations not implemented")
}
@ -6033,6 +6048,24 @@ func _DataCoord_GetSegmentsByStates_Handler(srv interface{}, ctx context.Context
return interceptor(ctx, in, info, handler)
}
func _DataCoord_GetFlushAllState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(milvuspb.GetFlushAllStateRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(DataCoordServer).GetFlushAllState(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/milvus.proto.data.DataCoord/GetFlushAllState",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(DataCoordServer).GetFlushAllState(ctx, req.(*milvuspb.GetFlushAllStateRequest))
}
return interceptor(ctx, in, info, handler)
}
func _DataCoord_ShowConfigurations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(internalpb.ShowConfigurationsRequest)
if err := dec(in); err != nil {
@ -6547,6 +6580,10 @@ var _DataCoord_serviceDesc = grpc.ServiceDesc{
MethodName: "GetSegmentsByStates",
Handler: _DataCoord_GetSegmentsByStates_Handler,
},
{
MethodName: "GetFlushAllState",
Handler: _DataCoord_GetFlushAllState_Handler,
},
{
MethodName: "ShowConfigurations",
Handler: _DataCoord_ShowConfigurations_Handler,

View File

@ -258,6 +258,10 @@ func (coord *DataCoordMock) GetFlushState(ctx context.Context, req *milvuspb.Get
return &milvuspb.GetFlushStateResponse{}, nil
}
func (coord *DataCoordMock) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
return &milvuspb.GetFlushAllStateResponse{}, nil
}
func (coord *DataCoordMock) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest) (*datapb.DropVirtualChannelResponse, error) {
return &datapb.DropVirtualChannelResponse{}, nil
}

View File

@ -31,6 +31,7 @@ import (
"golang.org/x/sync/errgroup"
"github.com/milvus-io/milvus-proto/go-api/commonpb"
"github.com/milvus-io/milvus-proto/go-api/federpb"
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus-proto/go-api/msgpb"
"github.com/milvus-io/milvus-proto/go-api/schemapb"
@ -53,6 +54,7 @@ import (
"github.com/milvus-io/milvus/internal/util/paramtable"
"github.com/milvus-io/milvus/internal/util/ratelimitutil"
"github.com/milvus-io/milvus/internal/util/timerecord"
"github.com/milvus-io/milvus/internal/util/tsoutil"
"github.com/milvus-io/milvus/internal/util/typeutil"
)
@ -2740,6 +2742,14 @@ func (node *Proxy) CreateAlias(ctx context.Context, request *milvuspb.CreateAlia
return cat.result, nil
}
func (node *Proxy) DescribeAlias(ctx context.Context, request *milvuspb.DescribeAliasRequest) (*milvuspb.DescribeAliasResponse, error) {
panic("TODO: implement me")
}
func (node *Proxy) ListAliases(ctx context.Context, request *milvuspb.ListAliasesRequest) (*milvuspb.ListAliasesResponse, error) {
panic("TODO: implement me")
}
// DropAlias alter the alias of collection.
func (node *Proxy) DropAlias(ctx context.Context, request *milvuspb.DropAliasRequest) (*commonpb.Status, error) {
if !node.checkHealthy() {
@ -2968,6 +2978,71 @@ func (node *Proxy) CalcDistance(ctx context.Context, request *milvuspb.CalcDista
return task.Execute(ctx, request)
}
// FlushAll notifies Proxy to flush all collection's DML messages.
func (node *Proxy) FlushAll(ctx context.Context, _ *milvuspb.FlushAllRequest) (*milvuspb.FlushAllResponse, error) {
ctx, sp := otel.Tracer(typeutil.ProxyRole).Start(ctx, "Proxy-FlushAll")
defer sp.End()
resp := &milvuspb.FlushAllResponse{
Status: &commonpb.Status{ErrorCode: commonpb.ErrorCode_UnexpectedError},
}
if !node.checkHealthy() {
resp.Status.Reason = "proxy is not healthy"
return resp, nil
}
log.Info(rpcReceived("FlushAll"))
// Flush all collections to accelerate the flushAll progress
showColRsp, err := node.ShowCollections(ctx, &milvuspb.ShowCollectionsRequest{
Base: commonpbutil.NewMsgBase(commonpbutil.WithMsgType(commonpb.MsgType_ShowCollections)),
})
if err != nil {
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
}
log.Warn("FlushAll failed", zap.String("err", err.Error()))
return resp, nil
}
if showColRsp.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success {
log.Warn("FlushAll failed", zap.String("err", showColRsp.GetStatus().GetReason()))
resp.Status = showColRsp.GetStatus()
return resp, nil
}
flushRsp, err := node.Flush(ctx, &milvuspb.FlushRequest{
Base: commonpbutil.NewMsgBase(commonpbutil.WithMsgType(commonpb.MsgType_Flush)),
CollectionNames: showColRsp.GetCollectionNames(),
})
if err != nil {
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
}
log.Warn("FlushAll failed", zap.String("err", err.Error()))
return resp, nil
}
if flushRsp.GetStatus().GetErrorCode() != commonpb.ErrorCode_Success {
log.Warn("FlushAll failed", zap.String("err", flushRsp.GetStatus().GetReason()))
resp.Status = flushRsp.GetStatus()
return resp, nil
}
// allocate current ts as FlushAllTs
ts, err := node.tsoAllocator.AllocOne(ctx)
if err != nil {
log.Warn("FlushAll failed", zap.Error(err))
resp.Status.Reason = err.Error()
return resp, nil
}
resp.FlushAllTs = ts
resp.Status.ErrorCode = commonpb.ErrorCode_Success
log.Info(rpcDone("FlushAll"), zap.Uint64("FlushAllTs", ts),
zap.Time("FlushAllTime", tsoutil.PhysicalTime(ts)))
return resp, nil
}
// GetDdChannel returns the used channel for dd operations.
func (node *Proxy) GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error) {
panic("implement me")
@ -3566,6 +3641,35 @@ func (node *Proxy) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStat
return resp, err
}
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
func (node *Proxy) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error) {
ctx, sp := otel.Tracer(typeutil.ProxyRole).Start(ctx, "Proxy-GetFlushAllState")
defer sp.End()
log := log.Ctx(ctx).With(zap.Uint64("FlushAllTs", req.GetFlushAllTs()),
zap.Time("FlushAllTime", tsoutil.PhysicalTime(req.GetFlushAllTs())))
log.Debug("receive GetFlushAllState request")
var err error
resp := &milvuspb.GetFlushAllStateResponse{}
if !node.checkHealthy() {
resp.Status = unhealthyStatus()
log.Warn("GetFlushAllState failed, closed server")
return resp, nil
}
resp, err = node.dataCoord.GetFlushAllState(ctx, req)
if err != nil {
resp.Status = &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: err.Error(),
}
log.Warn("GetFlushAllState failed", zap.String("err", err.Error()))
return resp, nil
}
log.Debug("GetFlushAllState done", zap.Bool("flushed", resp.GetFlushed()))
return resp, err
}
// checkHealthy checks proxy state is Healthy
func (node *Proxy) checkHealthy() bool {
code := node.stateCode.Load().(commonpb.StateCode)
@ -4846,3 +4950,11 @@ func (node *Proxy) DescribeResourceGroup(ctx context.Context, request *milvuspb.
metrics.ProxyReqLatency.WithLabelValues(strconv.FormatInt(paramtable.GetNodeID(), 10), method).Observe(float64(tr.ElapseSpan().Milliseconds()))
return t.result, nil
}
func (node *Proxy) ListIndexedSegment(ctx context.Context, request *federpb.ListIndexedSegmentRequest) (*federpb.ListIndexedSegmentResponse, error) {
panic("TODO: implement me")
}
func (node *Proxy) DescribeSegmentIndexData(ctx context.Context, request *federpb.DescribeSegmentIndexDataRequest) (*federpb.DescribeSegmentIndexDataResponse, error) {
panic("TODO: implement me")
}

View File

@ -28,12 +28,14 @@ import (
"github.com/milvus-io/milvus-proto/go-api/milvuspb"
"github.com/milvus-io/milvus/internal/log"
"github.com/milvus-io/milvus/internal/mocks"
"github.com/milvus-io/milvus/internal/proto/datapb"
"github.com/milvus-io/milvus/internal/proto/proxypb"
"github.com/milvus-io/milvus/internal/proto/querypb"
"github.com/milvus-io/milvus/internal/types"
"github.com/milvus-io/milvus/internal/util/dependency"
"github.com/milvus-io/milvus/internal/util/paramtable"
"github.com/milvus-io/milvus/internal/util/sessionutil"
"github.com/milvus-io/milvus/internal/util/typeutil"
)
func TestProxy_InvalidateCollectionMetaCache_remove_stream(t *testing.T) {
@ -354,3 +356,134 @@ func TestProxy_InvalidResourceGroupName(t *testing.T) {
assert.Equal(t, resp.ErrorCode, commonpb.ErrorCode_IllegalArgument)
})
}
func TestProxy_FlushAll(t *testing.T) {
factory := dependency.NewDefaultFactory(true)
ctx := context.Background()
node, err := NewProxy(ctx, factory)
assert.NoError(t, err)
node.stateCode.Store(commonpb.StateCode_Healthy)
node.tsoAllocator = &timestampAllocator{
tso: newMockTimestampAllocatorInterface(),
}
node.sched, err = newTaskScheduler(ctx, node.tsoAllocator, node.factory)
assert.NoError(t, err)
err = node.sched.Start()
assert.NoError(t, err)
defer node.sched.Close()
node.dataCoord = mocks.NewDataCoord(t)
node.rootCoord = mocks.NewRootCoord(t)
// set expectations
cache := newMockCache()
getIDFunc := func(ctx context.Context, collectionName string) (typeutil.UniqueID, error) {
return UniqueID(0), nil
}
cache.getIDFunc = getIDFunc
globalMetaCache = cache
successStatus := &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success}
node.dataCoord.(*mocks.DataCoord).EXPECT().Flush(mock.Anything, mock.Anything).
Return(&datapb.FlushResponse{Status: successStatus}, nil).Maybe()
node.rootCoord.(*mocks.RootCoord).EXPECT().ShowCollections(mock.Anything, mock.Anything).
Return(&milvuspb.ShowCollectionsResponse{Status: successStatus, CollectionNames: []string{"col-0"}}, nil).Maybe()
t.Run("FlushAll", func(t *testing.T) {
resp, err := node.FlushAll(ctx, &milvuspb.FlushAllRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_Success)
})
t.Run("FlushAll failed, server is abnormal", func(t *testing.T) {
node.stateCode.Store(commonpb.StateCode_Abnormal)
resp, err := node.FlushAll(ctx, &milvuspb.FlushAllRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
node.stateCode.Store(commonpb.StateCode_Healthy)
})
t.Run("FlushAll failed, get id failed", func(t *testing.T) {
globalMetaCache.(*mockCache).getIDFunc = func(ctx context.Context, collectionName string) (typeutil.UniqueID, error) {
return 0, errors.New("mock error")
}
resp, err := node.FlushAll(ctx, &milvuspb.FlushAllRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
globalMetaCache.(*mockCache).getIDFunc = getIDFunc
})
t.Run("FlushAll failed, DataCoord flush failed", func(t *testing.T) {
node.dataCoord.(*mocks.DataCoord).ExpectedCalls = nil
node.dataCoord.(*mocks.DataCoord).EXPECT().Flush(mock.Anything, mock.Anything).
Return(&datapb.FlushResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: "mock err",
},
}, nil).Maybe()
resp, err := node.FlushAll(ctx, &milvuspb.FlushAllRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
})
t.Run("FlushAll failed, RootCoord showCollections failed", func(t *testing.T) {
node.rootCoord.(*mocks.RootCoord).ExpectedCalls = nil
node.rootCoord.(*mocks.RootCoord).EXPECT().ShowCollections(mock.Anything, mock.Anything).
Return(&milvuspb.ShowCollectionsResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: "mock err",
},
}, nil).Maybe()
resp, err := node.FlushAll(ctx, &milvuspb.FlushAllRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
})
}
func TestProxy_GetFlushAllState(t *testing.T) {
factory := dependency.NewDefaultFactory(true)
ctx := context.Background()
node, err := NewProxy(ctx, factory)
assert.NoError(t, err)
node.stateCode.Store(commonpb.StateCode_Healthy)
node.tsoAllocator = &timestampAllocator{
tso: newMockTimestampAllocatorInterface(),
}
node.dataCoord = mocks.NewDataCoord(t)
node.rootCoord = mocks.NewRootCoord(t)
// set expectations
successStatus := &commonpb.Status{ErrorCode: commonpb.ErrorCode_Success}
node.dataCoord.(*mocks.DataCoord).EXPECT().GetFlushAllState(mock.Anything, mock.Anything).
Return(&milvuspb.GetFlushAllStateResponse{Status: successStatus}, nil).Maybe()
t.Run("GetFlushAllState success", func(t *testing.T) {
resp, err := node.GetFlushAllState(ctx, &milvuspb.GetFlushAllStateRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_Success)
})
t.Run("GetFlushAllState failed, server is abnormal", func(t *testing.T) {
node.stateCode.Store(commonpb.StateCode_Abnormal)
resp, err := node.GetFlushAllState(ctx, &milvuspb.GetFlushAllStateRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
node.stateCode.Store(commonpb.StateCode_Healthy)
})
t.Run("DataCoord GetFlushAllState failed", func(t *testing.T) {
node.dataCoord.(*mocks.DataCoord).ExpectedCalls = nil
node.dataCoord.(*mocks.DataCoord).EXPECT().GetFlushAllState(mock.Anything, mock.Anything).
Return(&milvuspb.GetFlushAllStateResponse{
Status: &commonpb.Status{
ErrorCode: commonpb.ErrorCode_UnexpectedError,
Reason: "mock err",
},
}, nil)
resp, err := node.GetFlushAllState(ctx, &milvuspb.GetFlushAllStateRequest{})
assert.NoError(t, err)
assert.Equal(t, resp.GetStatus().GetErrorCode(), commonpb.ErrorCode_UnexpectedError)
})
}

View File

@ -291,6 +291,8 @@ type DataCoord interface {
WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest) (*datapb.WatchChannelsResponse, error)
// GetFlushState gets the flush state of multiple segments
GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateRequest) (*milvuspb.GetFlushStateResponse, error)
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error)
// SetSegmentState updates a segment's state explicitly.
SetSegmentState(ctx context.Context, req *datapb.SetSegmentStateRequest) (*datapb.SetSegmentStateResponse, error)
@ -1169,6 +1171,16 @@ type ProxyComponent interface {
// Return generic error when specified vectors not found or float/binary vectors mismatch, otherwise return nil
CalcDistance(ctx context.Context, request *milvuspb.CalcDistanceRequest) (*milvuspb.CalcDistanceResults, error)
// FlushAll notifies Proxy to flush all collection's DML messages, including those in message stream.
//
// ctx is the context to control request deadline and cancellation
//
// The `Status` in response struct `FlushAllResponse` indicates if this operation is processed successfully or fail cause;
// The `FlushAllTs` field in the `FlushAllResponse` response struct is used to check the flushAll state at the
// `GetFlushAllState` interface. `GetFlushAllState` would check if all DML messages before `FlushAllTs` have been flushed.
// error is always nil
FlushAll(ctx context.Context, request *milvuspb.FlushAllRequest) (*milvuspb.FlushAllResponse, error)
// Not yet implemented
GetDdChannel(ctx context.Context, request *internalpb.GetDdChannelRequest) (*milvuspb.StringResponse, error)
@ -1250,6 +1262,8 @@ type ProxyComponent interface {
GetCompactionStateWithPlans(ctx context.Context, req *milvuspb.GetCompactionPlansRequest) (*milvuspb.GetCompactionPlansResponse, error)
// GetFlushState gets the flush state of multiple segments
GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateRequest) (*milvuspb.GetFlushStateResponse, error)
// GetFlushAllState checks if all DML messages before `FlushAllTs` have been flushed.
GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest) (*milvuspb.GetFlushAllStateResponse, error)
// Import data files(json, numpy, etc.) on MinIO/S3 storage, read and parse them into sealed segments
//

View File

@ -131,10 +131,15 @@ func (m *GrpcDataCoordClient) GetCompactionStateWithPlans(ctx context.Context, r
func (m *GrpcDataCoordClient) WatchChannels(ctx context.Context, req *datapb.WatchChannelsRequest, opts ...grpc.CallOption) (*datapb.WatchChannelsResponse, error) {
return &datapb.WatchChannelsResponse{}, m.Err
}
func (m *GrpcDataCoordClient) GetFlushState(ctx context.Context, req *milvuspb.GetFlushStateRequest, opts ...grpc.CallOption) (*milvuspb.GetFlushStateResponse, error) {
return &milvuspb.GetFlushStateResponse{}, m.Err
}
func (m *GrpcDataCoordClient) GetFlushAllState(ctx context.Context, req *milvuspb.GetFlushAllStateRequest, opts ...grpc.CallOption) (*milvuspb.GetFlushAllStateResponse, error) {
return &milvuspb.GetFlushAllStateResponse{}, m.Err
}
func (m *GrpcDataCoordClient) DropVirtualChannel(ctx context.Context, req *datapb.DropVirtualChannelRequest, opts ...grpc.CallOption) (*datapb.DropVirtualChannelResponse, error) {
return &datapb.DropVirtualChannelResponse{}, m.Err
}