diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 47a79da..3c20d8f 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -35,7 +35,7 @@ jobs: uses: golangci/golangci-lint-action@v3 with: # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version - version: v1.49 + version: v1.55.2 # Optional: working directory, useful for monorepos # working-directory: somedir diff --git a/.golangci.yml b/.golangci.yml index 8cf223d..5698ddb 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,27 +1,86 @@ run: + go: "1.21" skip-dirs: - bin - configs - deployments - docs - scripts - - internal/core build-tags: - "WKAFKA" + skip-files: + - main.go linters: disable-all: true enable: - - typecheck - - goimports - - misspell + - gosimple - govet - ineffassign - - gosimple + - staticcheck + - decorder + - gofmt + - goimports - gosec - revive + - unconvert + - misspell + - typecheck + - durationcheck + - gci + - whitespace + - gofumpt + - gocritic linters-settings: + gci: + sections: + - standard + - default + - prefix(github.com/milvus-io) + custom-order: true + gofumpt: + lang-version: "1.18" + module-path: github.com/milvus-io + goimports: + local-prefixes: github.com/milvus-io + revive: + rules: + - name: unused-parameter + disabled: true + - name: var-naming + severity: warning + disabled: false + arguments: + - ["ID"] # Allow list + - name: context-as-argument + severity: warning + disabled: false + arguments: + - allowTypesBefore: "*testing.T" + - name: datarace + severity: warning + disabled: false + - name: duplicated-imports + severity: warning + disabled: false + - name: waitgroup-by-value + severity: warning + disabled: false + - name: indent-error-flow + severity: warning + disabled: false + arguments: + - "preserveScope" + - name: range-val-in-closure + severity: warning + disabled: false + - name: range-val-address + severity: warning + disabled: false + - name: string-of-int + severity: warning + disabled: false misspell: locale: US gocritic: @@ -42,6 +101,8 @@ issues: - which can be annoying to use # Binds to all network interfaces - G102 + # Use of unsafe calls should be audited + - G103 # Errors unhandled - G104 # file/folder Permission @@ -49,17 +110,22 @@ issues: - G302 # Potential file inclusion via variable - G304 - # Deferring unsafe method like *os.File Close + # Deferring unsafe method like *os.File Close - G307 + # TLS MinVersion too low + - G402 # Use of weak random number generator math/rand - G404 - # Exclude copylocks - - copylocks + # Unused parameters + - SA1019 + # defer return errors + - SA5001 + # Maximum issues count per one linter. Set to 0 to disable. Default is 50. max-issues-per-linter: 0 # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same-issues: 0 service: - golangci-lint-version: 1.27.0 # use the fixed version to not introduce new linters unexpectedly - + # use the fixed version to not introduce new linters unexpectedly + golangci-lint-version: 1.55.2 diff --git a/Makefile b/Makefile index 8977dd7..378c109 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,21 @@ GO ?= go -all: static-check birdwatcher +INSTALL_PATH := $(PWD)/bin +GOLANGCI_LINT_VERSION := 1.55.2 +GOLANGCI_LINT_OUTPUT := $(shell $(INSTALL_PATH)/golangci-lint --version 2>/dev/null) +INSTALL_GOLANGCI_LINT := $(findstring $(GOLANGCI_LINT_VERSION), $(GOLANGCI_LINT_OUTPUT)) + +# gci +GCI_VERSION := 0.11.2 +GCI_OUTPUT := $(shell $(INSTALL_PATH)/gci --version 2>/dev/null) +INSTALL_GCI := $(findstring $(GCI_VERSION),$(GCI_OUTPUT)) + + +GOFUMPT_VERSION := 0.5.0 +GOFUMPT_OUTPUT := $(shell $(INSTALL_PATH)/gofumpt --version 2>/dev/null) +INSTALL_GOFUMPT := $(findstring $(GOFUMPT_VERSION),$(GOFUMPT_OUTPUT)) + +all: static-check birdwatcher birdwatcher: @echo "Compiling birdwatcher" @@ -12,7 +27,35 @@ birdwatcher_wkafka: @mkdir -p bin @CGO_ENABLED=1 go build -o bin/birdwatcher_wkafka -tags WKAFKA main.go -static-check: +getdeps: + @mkdir -p $(INSTALL_PATH) + @if [ -z "$(INSTALL_GOLANGCI_LINT)" ]; then \ + echo "Installing golangci-lint into ./bin/" && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(INSTALL_PATH) v${GOLANGCI_LINT_VERSION} ; \ + else \ + echo "golangci-lint v@$(GOLANGCI_LINT_VERSION) already installed"; \ + fi + +static-check: getdeps @echo "Running static-check" - @golangci-lint cache clean - @golangci-lint run --timeout=10m --config ./.golangci.yml ./... + @$(INSTALL_PATH)/golangci-lint cache clean + @$(INSTALL_PATH)/golangci-lint run --timeout=10m --config ./.golangci.yml ./... + +lint-fix: getdeps + @mkdir -p $(INSTALL_PATH) + @if [ -z "$(INSTALL_GCI)" ]; then \ + echo "Installing gci v$(GCI_VERSION) to ./bin/" && GOBIN=$(INSTALL_PATH) go install github.com/daixiang0/gci@v$(GCI_VERSION); \ + else \ + echo "gci v$(GCI_VERSION) already installed"; \ + fi + @if [ -z "$(INSTALL_GOFUMPT)" ]; then \ + echo "Installing gofumpt v$(GOFUMPT_VERSION) to ./bin/" && GOBIN=$(INSTALL_PATH) go install mvdan.cc/gofumpt@v$(GOFUMPT_VERSION); \ + else \ + echo "gofumpt v$(GOFUMPT_VERSION) already installed"; \ + fi + @echo "Running gofumpt fix" + @$(INSTALL_PATH)/gofumpt -l -w ./ + @echo "Running gci fix" + @$(INSTALL_PATH)/gci write ./ --skip-generated -s standard -s default -s "prefix(github.com/milvus-io)" --custom-order + @echo "Running golangci-lint auto-fix" + @$(INSTALL_PATH)/golangci-lint cache clean + @$(INSTALL_PATH)/golangci-lint run --fix --timeout=30m --config ./.golangci.yml; diff --git a/bapps/go_prompt.go b/bapps/go_prompt.go index 7acfd86..84c0770 100644 --- a/bapps/go_prompt.go +++ b/bapps/go_prompt.go @@ -10,10 +10,11 @@ import ( "time" "github.com/c-bata/go-prompt" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/configs" "github.com/milvus-io/birdwatcher/history" "github.com/milvus-io/birdwatcher/states" - "github.com/samber/lo" ) // PromptApp wraps go-prompt as application. @@ -151,7 +152,6 @@ func (a *PromptApp) promptExecute(in string) { // completeInput auto-complete logic entry. func (a *PromptApp) completeInput(d prompt.Document) []prompt.Suggest { - input := d.CurrentLineBeforeCursor() if a.sugguestHistory { return a.historySuggestions(input) diff --git a/bapps/olc.go b/bapps/olc.go index db4a948..993940d 100644 --- a/bapps/olc.go +++ b/bapps/olc.go @@ -5,8 +5,9 @@ import ( "os" "strings" - "github.com/milvus-io/birdwatcher/states" "github.com/samber/lo" + + "github.com/milvus-io/birdwatcher/states" ) type olcApp struct { diff --git a/bapps/promptui.go b/bapps/promptui.go index 4885218..dc08163 100644 --- a/bapps/promptui.go +++ b/bapps/promptui.go @@ -4,6 +4,7 @@ import ( "errors" "github.com/manifoldco/promptui" + "github.com/milvus-io/birdwatcher/states" ) diff --git a/bapps/webserver.go b/bapps/webserver.go index c5adb33..2ef9868 100644 --- a/bapps/webserver.go +++ b/bapps/webserver.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/gin-gonic/gin" + "github.com/milvus-io/birdwatcher/common" "github.com/milvus-io/birdwatcher/configs" "github.com/milvus-io/birdwatcher/framework" @@ -103,7 +104,7 @@ func (app *WebServerApp) parseMethod(r *gin.Engine, mt reflect.Method, name stri } } - //fmt.Println(mt.Name) + // fmt.Println(mt.Name) cp := reflect.New(paramType.Elem()).Interface().(framework.CmdParam) fUse, _ := states.GetCmdFromFlag(cp) if len(use) == 0 { @@ -124,13 +125,11 @@ func (app *WebServerApp) parseMethod(r *gin.Engine, mt reflect.Method, name stri // fmt.Printf("path: /%s\n", lastKw) r.GET(fmt.Sprintf("/%s", lastKw), func(c *gin.Context) { - info := &InstanceInfo{} c.ShouldBind(info) start := states.Start(app.config) s, err := start.Process(fmt.Sprintf("connect --etcd=%s --rootPath=%s", info.EtcdAddr, info.RootPath)) - if err != nil { c.Error(err) return diff --git a/configs/config.go b/configs/config.go index 947f4f0..12f5c33 100644 --- a/configs/config.go +++ b/configs/config.go @@ -77,7 +77,6 @@ func (c *Config) createDefault() error { } file, err := os.Create(c.getConfigPath()) - if err != nil { return err } diff --git a/framework/resultset.go b/framework/resultset.go index 6ba4687..abc4fd2 100644 --- a/framework/resultset.go +++ b/framework/resultset.go @@ -9,14 +9,12 @@ const ( FormatTable ) -var ( - name2Format = map[string]Format{ - "default": FormatDefault, - "plain": FormatPlain, - "json": FormatJSON, - "table": FormatTable, - } -) +var name2Format = map[string]Format{ + "default": FormatDefault, + "plain": FormatPlain, + "json": FormatJSON, + "table": FormatTable, +} // ResultSet is the interface for command result set. type ResultSet interface { diff --git a/history/history.go b/history/history.go index 19c57ca..aeb72d1 100644 --- a/history/history.go +++ b/history/history.go @@ -39,7 +39,7 @@ func NewHistoryHelper(filePath string) *Helper { readFile.Close() } // open file and create if non-existent - hFile, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + hFile, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { fmt.Println("[WARN] failed to open history file", err.Error()) } diff --git a/main.go b/main.go index a4755b2..decf433 100644 --- a/main.go +++ b/main.go @@ -28,7 +28,7 @@ func main() { var appFactory func(config *configs.Config) bapps.BApp switch { - //Print current birdwatcher version + // Print current birdwatcher version case *printVersion: fmt.Println("Birdwatcher Version", common.Version) return @@ -41,7 +41,7 @@ func main() { default: defer handleExit() // open file and create if non-existent - file, err := os.OpenFile("bw_debug.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + file, err := os.OpenFile("bw_debug.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { log.Fatal(err) } diff --git a/models/collection.go b/models/collection.go index 2cbb5ae..a0eebf9 100644 --- a/models/collection.go +++ b/models/collection.go @@ -5,13 +5,14 @@ import ( "strings" "sync" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/etcdpb" "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" schemapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/schemapb" - "github.com/samber/lo" ) // Collection model for collection information. diff --git a/models/compaction_task.go b/models/compaction_task.go new file mode 100644 index 0000000..3e7e5ba --- /dev/null +++ b/models/compaction_task.go @@ -0,0 +1,66 @@ +package models + +import ( + "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" +) + +/* + PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` + TriggerID int64 `protobuf:"varint,2,opt,name=triggerID,proto3" json:"triggerID,omitempty"` + CollectionID int64 `protobuf:"varint,3,opt,name=collectionID,proto3" json:"collectionID,omitempty"` + PartitionID int64 `protobuf:"varint,4,opt,name=partitionID,proto3" json:"partitionID,omitempty"` + Channel string `protobuf:"bytes,5,opt,name=channel,proto3" json:"channel,omitempty"` + Type CompactionType `protobuf:"varint,6,opt,name=type,proto3,enum=milvus.proto.data.CompactionType" json:"type,omitempty"` + State CompactionTaskState `protobuf:"varint,7,opt,name=state,proto3,enum=milvus.proto.data.CompactionTaskState" json:"state,omitempty"` + FailReason string `protobuf:"bytes,8,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"` + StartTime int64 `protobuf:"varint,9,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime int64 `protobuf:"varint,10,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + TimeoutInSeconds int32 `protobuf:"varint,11,opt,name=timeout_in_seconds,json=timeoutInSeconds,proto3" json:"timeout_in_seconds,omitempty"` + RetryTimes int32 `protobuf:"varint,12,opt,name=retry_times,json=retryTimes,proto3" json:"retry_times,omitempty"` + CollectionTtl int64 `protobuf:"varint,13,opt,name=collection_ttl,json=collectionTtl,proto3" json:"collection_ttl,omitempty"` + TotalRows int64 `protobuf:"varint,14,opt,name=total_rows,json=totalRows,proto3" json:"total_rows,omitempty"` + InputSegments []int64 `protobuf:"varint,15,rep,packed,name=inputSegments,proto3" json:"inputSegments,omitempty"` + ResultSegments []int64 `protobuf:"varint,16,rep,packed,name=resultSegments,proto3" json:"resultSegments,omitempty"` + Pos *msgpb.MsgPosition `protobuf:"bytes,17,opt,name=pos,proto3" json:"pos,omitempty"` + NodeID int64 `protobuf:"varint,18,opt,name=nodeID,proto3" json:"nodeID,omitempty"` + Schema *schemapb.CollectionSchema `protobuf:"bytes,19,opt,name=schema,proto3" json:"schema,omitempty"` + ClusteringKeyField *schemapb.FieldSchema `protobuf:"bytes,20,opt,name=clustering_key_field,json=clusteringKeyField,proto3" json:"clustering_key_field,omitempty"` + MaxSegmentRows int64 `protobuf:"varint,21,opt,name=max_segment_rows,json=maxSegmentRows,proto3" json:"max_segment_rows,omitempty"` + PreferSegmentRows int64 `protobuf:"varint,22,opt,name=prefer_segment_rows,json=preferSegmentRows,proto3" j +*/ + +// CompactionTask model for collection compaction task information. +type CompactionTask struct { + *datapb.CompactionTask + // etcd collection key + key string +} + +func (ct *CompactionTask) Key() string { + return ct.key +} + +// CollectionHistory collection models with extra history data. +type CompactionTaskHistory struct { + CompactionTask + Ts int64 + Dropped bool +} + +//func (ct *CompactionTask) GetClusterKeyField() (FieldSchema, bool) { +// return ct.clusterFieldSchema, true +//} + +// NewCompactionTask parses compactionTask(proto v2.2) to models.CompactionTask +func NewCompactionTask(info *datapb.CompactionTask, key string) *CompactionTask { + ct := &CompactionTask{ + CompactionTask: info, + key: key, + } + // fs := NewFieldSchemaFromBase[*schemapbv2.FieldSchema, schemapbv2.DataType](info.GetClusteringKeyField()) + // fs.Properties = GetMapFromKVPairs(fieldSchema.GetTypeParams()) + // fs.IsDynamic = fieldSchema.GetIsDynamic() + // fs.IsPartitionKey = fieldSchema.GetIsPartitionKey() + // ct.clusterFieldSchema = fs + return ct +} diff --git a/models/segment.go b/models/segment.go index d6bb9f8..4939051 100644 --- a/models/segment.go +++ b/models/segment.go @@ -4,9 +4,10 @@ import ( "fmt" "sync" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" - "github.com/samber/lo" ) // Segment is the common model for segment information. diff --git a/mq/factory.go b/mq/factory.go index df529aa..7ed6608 100644 --- a/mq/factory.go +++ b/mq/factory.go @@ -8,6 +8,7 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/mq/ifc" "github.com/milvus-io/birdwatcher/mq/pulsar" ) diff --git a/mq/factory_wkafka.go b/mq/factory_wkafka.go index 9b85c1f..b08988d 100644 --- a/mq/factory_wkafka.go +++ b/mq/factory_wkafka.go @@ -8,6 +8,7 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/mq/ifc" "github.com/milvus-io/birdwatcher/mq/kafka" "github.com/milvus-io/birdwatcher/mq/pulsar" diff --git a/mq/ifc/msgstream.go b/mq/ifc/msgstream.go index 42bef23..6b17de9 100644 --- a/mq/ifc/msgstream.go +++ b/mq/ifc/msgstream.go @@ -12,5 +12,7 @@ type Consumer interface { Close() error } -var Endian = binary.LittleEndian -var DefaultPartitionIdx = int32(0) +var ( + Endian = binary.LittleEndian + DefaultPartitionIdx = int32(0) +) diff --git a/mq/kafka/kafka_test.go b/mq/kafka/kafka_test.go index 5102de2..f0c7aff 100644 --- a/mq/kafka/kafka_test.go +++ b/mq/kafka/kafka_test.go @@ -9,8 +9,9 @@ import ( "time" "github.com/confluentinc/confluent-kafka-go/kafka" - "github.com/milvus-io/birdwatcher/mq/ifc" "github.com/stretchr/testify/assert" + + "github.com/milvus-io/birdwatcher/mq/ifc" ) func TestConsumer(t *testing.T) { diff --git a/mq/msg.go b/mq/msg.go index bd7465b..4ac9d8f 100644 --- a/mq/msg.go +++ b/mq/msg.go @@ -18,11 +18,11 @@ package mq import ( "context" - "fmt" "github.com/cockroachdb/errors" "github.com/golang/protobuf/proto" + "github.com/milvus-io/birdwatcher/mq/ifc" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" diff --git a/mq/pulsar/pulsar_test.go b/mq/pulsar/pulsar_test.go index 93bf9fc..6404f93 100644 --- a/mq/pulsar/pulsar_test.go +++ b/mq/pulsar/pulsar_test.go @@ -8,8 +8,9 @@ import ( "time" "github.com/apache/pulsar-client-go/pulsar" - "github.com/milvus-io/birdwatcher/mq/ifc" "github.com/stretchr/testify/assert" + + "github.com/milvus-io/birdwatcher/mq/ifc" ) func TestConsumer(t *testing.T) { @@ -19,7 +20,6 @@ func TestConsumer(t *testing.T) { client, err := pulsar.NewClient(pulsar.ClientOptions{ URL: address, }) - if err != nil { t.Fatal(err) } diff --git a/mq/utils.go b/mq/utils.go index fef4093..e6f04fa 100644 --- a/mq/utils.go +++ b/mq/utils.go @@ -53,7 +53,7 @@ func GetSizeOfIDs(data *schemapb.IDs) int { case *schemapb.IDs_StrId: result = len(data.GetStrId().GetData()) default: - //TODO:: + // TODO:: } return result diff --git a/proto/v2.0/milvuspb/milvus.pb.go b/proto/v2.0/milvuspb/milvus.pb.go index 7b77145..702364e 100644 --- a/proto/v2.0/milvuspb/milvus.pb.go +++ b/proto/v2.0/milvuspb/milvus.pb.go @@ -27,7 +27,6 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package -// // This is for ShowCollectionsRequest type field. type ShowType int32 @@ -287,7 +286,7 @@ func (m *AlterAliasRequest) GetAlias() string { return "" } -//* +// * // Create collection in milvus type CreateCollectionRequest struct { // Not useful for now @@ -375,7 +374,7 @@ func (m *CreateCollectionRequest) GetConsistencyLevel() commonpb.ConsistencyLeve return commonpb.ConsistencyLevel_Strong } -//* +// * // Drop collection in milvus, also will drop data in collection. type DropCollectionRequest struct { // Not useful for now @@ -435,7 +434,7 @@ func (m *DropCollectionRequest) GetCollectionName() string { return "" } -//* +// * // Check collection exist in milvus or not. type HasCollectionRequest struct { // Not useful for now @@ -598,7 +597,7 @@ func (m *StringResponse) GetValue() string { return "" } -//* +// * // Get collection meta datas like: schema, collectionID, shards number ... type DescribeCollectionRequest struct { // Not useful for now @@ -676,7 +675,7 @@ func (m *DescribeCollectionRequest) GetTimeStamp() uint64 { return 0 } -//* +// * // DescribeCollection Response type DescribeCollectionResponse struct { // Contain error_code and reason @@ -817,7 +816,7 @@ func (m *DescribeCollectionResponse) GetCollectionName() string { return "" } -//* +// * // Load collection data into query nodes, then you can do vector search on this collection. type LoadCollectionRequest struct { // Not useful for now @@ -886,7 +885,7 @@ func (m *LoadCollectionRequest) GetReplicaNumber() int32 { return 0 } -//* +// * // Release collection data from query nodes, then you can't do vector search on this collection. type ReleaseCollectionRequest struct { // Not useful for now @@ -946,7 +945,7 @@ func (m *ReleaseCollectionRequest) GetCollectionName() string { return "" } -//* +// * // Get collection statistics like row_count. type GetCollectionStatisticsRequest struct { // Not useful for now @@ -1006,7 +1005,7 @@ func (m *GetCollectionStatisticsRequest) GetCollectionName() string { return "" } -//* +// * // Will return collection statistics in stats field like [{key:"row_count",value:"1"}] type GetCollectionStatisticsResponse struct { // Contain error_code and reason @@ -1057,7 +1056,6 @@ func (m *GetCollectionStatisticsResponse) GetStats() []*commonpb.KeyValuePair { return nil } -// // List collections type ShowCollectionsRequest struct { // Not useful for now @@ -1135,7 +1133,6 @@ func (m *ShowCollectionsRequest) GetCollectionNames() []string { return nil } -// // Return basic collection infos. type ShowCollectionsResponse struct { // Contain error_code and reason @@ -1231,7 +1228,6 @@ func (m *ShowCollectionsResponse) GetQueryServiceAvailable() []bool { return nil } -// // Create partition in created collection. type CreatePartitionRequest struct { // Not useful for now @@ -1300,7 +1296,6 @@ func (m *CreatePartitionRequest) GetPartitionName() string { return "" } -// // Drop partition in created collection. type DropPartitionRequest struct { // Not useful for now @@ -1369,7 +1364,6 @@ func (m *DropPartitionRequest) GetPartitionName() string { return "" } -// // Check if partition exist in collection or not. type HasPartitionRequest struct { // Not useful for now @@ -1438,7 +1432,6 @@ func (m *HasPartitionRequest) GetPartitionName() string { return "" } -// // Load specific partitions data of one collection into query nodes // Then you can get these data as result when you do vector search on this collection. type LoadPartitionsRequest struct { @@ -1517,7 +1510,6 @@ func (m *LoadPartitionsRequest) GetReplicaNumber() int32 { return 0 } -// // Release specific partitions data of one collection from query nodes. // Then you can not get these data as result when you do vector search on this collection. type ReleasePartitionsRequest struct { @@ -1587,7 +1579,6 @@ func (m *ReleasePartitionsRequest) GetPartitionNames() []string { return nil } -// // Get partition statistics like row_count. type GetPartitionStatisticsRequest struct { // Not useful for now @@ -1703,7 +1694,6 @@ func (m *GetPartitionStatisticsResponse) GetStats() []*commonpb.KeyValuePair { return nil } -// // List all partitions for particular collection type ShowPartitionsRequest struct { // Not useful for now @@ -1790,7 +1780,6 @@ func (m *ShowPartitionsRequest) GetType() ShowType { return ShowType_All } -// // List all partitions for particular collection response. // The returned datas are all rows, we can format to columns by therir index. type ShowPartitionsResponse struct { @@ -2106,7 +2095,6 @@ func (m *ShowSegmentsResponse) GetSegmentIDs() []int64 { return nil } -// // Create index for vector datas type CreateIndexRequest struct { // Not useful for now @@ -2193,7 +2181,6 @@ func (m *CreateIndexRequest) GetIndexName() string { return "" } -// // Get created index information. // Current release of Milvus only supports showing latest built index. type DescribeIndexRequest struct { @@ -2272,7 +2259,6 @@ func (m *DescribeIndexRequest) GetIndexName() string { return "" } -// // Index informations type IndexDescription struct { // Index name @@ -2341,7 +2327,6 @@ func (m *IndexDescription) GetFieldName() string { return "" } -// // Describe index response type DescribeIndexResponse struct { // Response status @@ -2392,8 +2377,7 @@ func (m *DescribeIndexResponse) GetIndexDescriptions() []*IndexDescription { return nil } -// -// Get index building progress +// Get index building progress type GetIndexBuildProgressRequest struct { // Not useful for now Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` @@ -4430,7 +4414,6 @@ func (m *GetMetricsResponse) GetComponentName() string { return "" } -// // Do load balancing operation from src_nodeID to dst_nodeID. type LoadBalanceRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` diff --git a/proto/v2.0/querypb/query_coord.pb.go b/proto/v2.0/querypb/query_coord.pb.go index fa791c7..d6295c8 100644 --- a/proto/v2.0/querypb/query_coord.pb.go +++ b/proto/v2.0/querypb/query_coord.pb.go @@ -162,7 +162,7 @@ func (LoadType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_aab7cc9a69ed26e8, []int{3} } -//--------------------QueryCoord grpc request and response proto------------------ +// --------------------QueryCoord grpc request and response proto------------------ type ShowCollectionsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` // Not useful for now @@ -1045,7 +1045,7 @@ func (m *ShardLeadersList) GetNodeAddrs() []string { return nil } -//-----------------query node grpc request and response proto---------------- +// -----------------query node grpc request and response proto---------------- type LoadMetaInfo struct { LoadType LoadType `protobuf:"varint,1,opt,name=load_type,json=loadType,proto3,enum=milvus.proto.query.LoadType" json:"load_type,omitempty"` CollectionID int64 `protobuf:"varint,2,opt,name=collectionID,proto3" json:"collectionID,omitempty"` @@ -1964,7 +1964,7 @@ func (m *ReplicaSegmentsInfo) GetSegmentIds() []int64 { return nil } -//----------------request auto triggered by QueryCoord----------------- +// ----------------request auto triggered by QueryCoord----------------- type HandoffSegmentsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` SegmentInfos []*SegmentInfo `protobuf:"bytes,2,rep,name=segmentInfos,proto3" json:"segmentInfos,omitempty"` @@ -2645,7 +2645,7 @@ func (m *UnsubscribeChannelInfo) GetCollectionChannels() []*UnsubscribeChannels return nil } -//---- synchronize messages proto between QueryCoord and QueryNode ----- +// ---- synchronize messages proto between QueryCoord and QueryNode ----- type SegmentChangeInfo struct { OnlineNodeID int64 `protobuf:"varint,1,opt,name=online_nodeID,json=onlineNodeID,proto3" json:"online_nodeID,omitempty"` OnlineSegments []*SegmentInfo `protobuf:"bytes,2,rep,name=online_segments,json=onlineSegments,proto3" json:"online_segments,omitempty"` diff --git a/proto/v2.0/schemapb/schema.pb.go b/proto/v2.0/schemapb/schema.pb.go index d4d3a37..da08e9d 100644 --- a/proto/v2.0/schemapb/schema.pb.go +++ b/proto/v2.0/schemapb/schema.pb.go @@ -21,7 +21,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package -//* +// * // @brief Field data type type DataType int32 @@ -78,7 +78,7 @@ func (DataType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_1c5fb4d8cc22d66a, []int{0} } -//* +// * // @brief Field schema type FieldSchema struct { FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` @@ -175,7 +175,7 @@ func (m *FieldSchema) GetAutoID() bool { return false } -//* +// * // @brief Collection schema type CollectionSchema struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` diff --git a/proto/v2.2/data_coord.proto b/proto/v2.2/data_coord.proto index 7f5e66a..58c044e 100644 --- a/proto/v2.2/data_coord.proto +++ b/proto/v2.2/data_coord.proto @@ -25,7 +25,7 @@ enum SegmentLevel { Legacy = 0; // zero value for legacy logic L0 = 1; // L0 segment, contains delta data for current channel L1 = 2; // L1 segment, normal segment, with no extra compaction attribute - L2 = 3; // L2 segemnt, segment with extra data distribution info + L2 = 3; // L2 segment, segment with extra data distribution info } service DataCoord { @@ -265,6 +265,7 @@ message VchannelInfo { repeated int64 indexed_segmentIds = 10; repeated SegmentInfo indexed_segments = 11; repeated int64 level_zero_segment_ids = 12; + map partition_stats_versions = 13; } message WatchDmChannelsRequest { @@ -321,6 +322,12 @@ message SegmentInfo { // so segments with Legacy level shall be treated as L1 segment SegmentLevel level = 20; int64 storage_version = 21; + + int64 partition_stats_version = 22; + // use in major compaction, if compaction fail, should revert segment level to last value + SegmentLevel last_level = 23; + // use in major compaction, if compaction fail, should revert partition stats version to last value + int64 last_partition_stats_version = 24; } message SegmentStartPosition { @@ -488,17 +495,24 @@ enum CompactionType { MinorCompaction = 5; MajorCompaction = 6; Level0DeleteCompaction = 7; + ClusteringCompaction = 8; } message CompactionStateRequest { common.MsgBase base = 1; + int64 planID = 2; } message SyncSegmentsRequest { + // Deprecated, after v2.4.3 int64 planID = 1; + // Deprecated, after v2.4.3 int64 compacted_to = 2; + // Deprecated, after v2.4.3 int64 num_of_rows = 3; + // Deprecated, after v2.4.3 repeated int64 compacted_from = 4; + // Deprecated, after v2.4.3 repeated FieldBinlog stats_logs = 5; string channel_name = 6; int64 partition_id = 7; @@ -519,13 +533,20 @@ message CompactionSegmentBinlogs { message CompactionPlan { int64 planID = 1; repeated CompactionSegmentBinlogs segmentBinlogs = 2; - uint64 start_time = 3; + int64 start_time = 3; int32 timeout_in_seconds = 4; CompactionType type = 5; uint64 timetravel = 6; string channel = 7; int64 collection_ttl = 8; int64 total_rows = 9; + schema.CollectionSchema schema = 10; + int64 clustering_key_field = 11; + int64 max_segment_rows = 12; + int64 prefer_segment_rows = 13; + string analyze_result_path = 14; + repeated int64 analyze_segment_ids = 15; + int32 state = 16; } message CompactionSegment { @@ -540,7 +561,7 @@ message CompactionSegment { message CompactionPlanResult { int64 planID = 1; - common.CompactionState state = 2; + CompactionTaskState state = 2; repeated CompactionSegment segments = 3; string channel = 4; CompactionType type = 5; @@ -755,6 +776,7 @@ message ImportSegmentInfo { int64 imported_rows = 2; repeated FieldBinlog binlogs = 3; repeated FieldBinlog statslogs = 4; + repeated FieldBinlog deltalogs = 5; } message QueryImportResponse { @@ -832,3 +854,43 @@ message GcControlRequest { GcCommand command = 2; repeated common.KeyValuePair params = 3; } + +enum CompactionTaskState { + unknown = 0; + executing = 1; + pipelining = 2; + completed = 3; + failed = 4; + timeout = 5; + analyzing = 6; + indexing = 7; + cleaned = 8; + meta_saved = 9; +} + +message CompactionTask{ + int64 planID = 1; + int64 triggerID = 2; + int64 collectionID = 3; + int64 partitionID = 4; + string channel = 5; + CompactionType type = 6; + CompactionTaskState state = 7; + string fail_reason = 8; + int64 start_time = 9; + int64 end_time = 10; + int32 timeout_in_seconds = 11; + int32 retry_times = 12; + int64 collection_ttl = 13; + int64 total_rows = 14; + repeated int64 inputSegments = 15; + repeated int64 resultSegments = 16; + msg.MsgPosition pos = 17; + int64 nodeID = 18; + schema.CollectionSchema schema = 19; + schema.FieldSchema clustering_key_field = 20; + int64 max_segment_rows = 21; + int64 prefer_segment_rows = 22; + int64 analyzeTaskID = 23; + int64 analyzeVersion = 24; +} diff --git a/proto/v2.2/datapb/data_coord.pb.go b/proto/v2.2/datapb/data_coord.pb.go index 5621101..b9049ec 100644 --- a/proto/v2.2/datapb/data_coord.pb.go +++ b/proto/v2.2/datapb/data_coord.pb.go @@ -146,6 +146,7 @@ const ( CompactionType_MinorCompaction CompactionType = 5 CompactionType_MajorCompaction CompactionType = 6 CompactionType_Level0DeleteCompaction CompactionType = 7 + CompactionType_ClusteringCompaction CompactionType = 8 ) var CompactionType_name = map[int32]string{ @@ -156,6 +157,7 @@ var CompactionType_name = map[int32]string{ 5: "MinorCompaction", 6: "MajorCompaction", 7: "Level0DeleteCompaction", + 8: "ClusteringCompaction", } var CompactionType_value = map[string]int32{ @@ -166,6 +168,7 @@ var CompactionType_value = map[string]int32{ "MinorCompaction": 5, "MajorCompaction": 6, "Level0DeleteCompaction": 7, + "ClusteringCompaction": 8, } func (x CompactionType) String() string { @@ -238,6 +241,55 @@ func (GcCommand) EnumDescriptor() ([]byte, []int) { return fileDescriptor_82cd95f524594f49, []int{5} } +type CompactionTaskState int32 + +const ( + CompactionTaskState_unknown CompactionTaskState = 0 + CompactionTaskState_executing CompactionTaskState = 1 + CompactionTaskState_pipelining CompactionTaskState = 2 + CompactionTaskState_completed CompactionTaskState = 3 + CompactionTaskState_failed CompactionTaskState = 4 + CompactionTaskState_timeout CompactionTaskState = 5 + CompactionTaskState_analyzing CompactionTaskState = 6 + CompactionTaskState_indexing CompactionTaskState = 7 + CompactionTaskState_cleaned CompactionTaskState = 8 + CompactionTaskState_meta_saved CompactionTaskState = 9 +) + +var CompactionTaskState_name = map[int32]string{ + 0: "unknown", + 1: "executing", + 2: "pipelining", + 3: "completed", + 4: "failed", + 5: "timeout", + 6: "analyzing", + 7: "indexing", + 8: "cleaned", + 9: "meta_saved", +} + +var CompactionTaskState_value = map[string]int32{ + "unknown": 0, + "executing": 1, + "pipelining": 2, + "completed": 3, + "failed": 4, + "timeout": 5, + "analyzing": 6, + "indexing": 7, + "cleaned": 8, + "meta_saved": 9, +} + +func (x CompactionTaskState) String() string { + return proto.EnumName(CompactionTaskState_name, int32(x)) +} + +func (CompactionTaskState) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_82cd95f524594f49, []int{6} +} + // TODO: import google/protobuf/empty.proto type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1388,21 +1440,22 @@ func (m *GetSegmentInfoChannelRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetSegmentInfoChannelRequest proto.InternalMessageInfo type VchannelInfo struct { - CollectionID int64 `protobuf:"varint,1,opt,name=collectionID,proto3" json:"collectionID,omitempty"` - ChannelName string `protobuf:"bytes,2,opt,name=channelName,proto3" json:"channelName,omitempty"` - SeekPosition *msgpb.MsgPosition `protobuf:"bytes,3,opt,name=seek_position,json=seekPosition,proto3" json:"seek_position,omitempty"` - UnflushedSegments []*SegmentInfo `protobuf:"bytes,4,rep,name=unflushedSegments,proto3" json:"unflushedSegments,omitempty"` - FlushedSegments []*SegmentInfo `protobuf:"bytes,5,rep,name=flushedSegments,proto3" json:"flushedSegments,omitempty"` - DroppedSegments []*SegmentInfo `protobuf:"bytes,6,rep,name=dropped_segments,json=droppedSegments,proto3" json:"dropped_segments,omitempty"` - UnflushedSegmentIds []int64 `protobuf:"varint,7,rep,packed,name=unflushedSegmentIds,proto3" json:"unflushedSegmentIds,omitempty"` - FlushedSegmentIds []int64 `protobuf:"varint,8,rep,packed,name=flushedSegmentIds,proto3" json:"flushedSegmentIds,omitempty"` - DroppedSegmentIds []int64 `protobuf:"varint,9,rep,packed,name=dropped_segmentIds,json=droppedSegmentIds,proto3" json:"dropped_segmentIds,omitempty"` - IndexedSegmentIds []int64 `protobuf:"varint,10,rep,packed,name=indexed_segmentIds,json=indexedSegmentIds,proto3" json:"indexed_segmentIds,omitempty"` - IndexedSegments []*SegmentInfo `protobuf:"bytes,11,rep,name=indexed_segments,json=indexedSegments,proto3" json:"indexed_segments,omitempty"` - LevelZeroSegmentIds []int64 `protobuf:"varint,12,rep,packed,name=level_zero_segment_ids,json=levelZeroSegmentIds,proto3" json:"level_zero_segment_ids,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + CollectionID int64 `protobuf:"varint,1,opt,name=collectionID,proto3" json:"collectionID,omitempty"` + ChannelName string `protobuf:"bytes,2,opt,name=channelName,proto3" json:"channelName,omitempty"` + SeekPosition *msgpb.MsgPosition `protobuf:"bytes,3,opt,name=seek_position,json=seekPosition,proto3" json:"seek_position,omitempty"` + UnflushedSegments []*SegmentInfo `protobuf:"bytes,4,rep,name=unflushedSegments,proto3" json:"unflushedSegments,omitempty"` + FlushedSegments []*SegmentInfo `protobuf:"bytes,5,rep,name=flushedSegments,proto3" json:"flushedSegments,omitempty"` + DroppedSegments []*SegmentInfo `protobuf:"bytes,6,rep,name=dropped_segments,json=droppedSegments,proto3" json:"dropped_segments,omitempty"` + UnflushedSegmentIds []int64 `protobuf:"varint,7,rep,packed,name=unflushedSegmentIds,proto3" json:"unflushedSegmentIds,omitempty"` + FlushedSegmentIds []int64 `protobuf:"varint,8,rep,packed,name=flushedSegmentIds,proto3" json:"flushedSegmentIds,omitempty"` + DroppedSegmentIds []int64 `protobuf:"varint,9,rep,packed,name=dropped_segmentIds,json=droppedSegmentIds,proto3" json:"dropped_segmentIds,omitempty"` + IndexedSegmentIds []int64 `protobuf:"varint,10,rep,packed,name=indexed_segmentIds,json=indexedSegmentIds,proto3" json:"indexed_segmentIds,omitempty"` + IndexedSegments []*SegmentInfo `protobuf:"bytes,11,rep,name=indexed_segments,json=indexedSegments,proto3" json:"indexed_segments,omitempty"` + LevelZeroSegmentIds []int64 `protobuf:"varint,12,rep,packed,name=level_zero_segment_ids,json=levelZeroSegmentIds,proto3" json:"level_zero_segment_ids,omitempty"` + PartitionStatsVersions map[int64]int64 `protobuf:"bytes,13,rep,name=partition_stats_versions,json=partitionStatsVersions,proto3" json:"partition_stats_versions,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *VchannelInfo) Reset() { *m = VchannelInfo{} } @@ -1514,6 +1567,13 @@ func (m *VchannelInfo) GetLevelZeroSegmentIds() []int64 { return nil } +func (m *VchannelInfo) GetPartitionStatsVersions() map[int64]int64 { + if m != nil { + return m.PartitionStatsVersions + } + return nil +} + type WatchDmChannelsRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` Vchannels []*VchannelInfo `protobuf:"bytes,2,rep,name=vchannels,proto3" json:"vchannels,omitempty"` @@ -1711,11 +1771,16 @@ type SegmentInfo struct { // Available value: Legacy, L0, L1, L2 // For legacy level, it represent old segment before segment level introduced // so segments with Legacy level shall be treated as L1 segment - Level SegmentLevel `protobuf:"varint,20,opt,name=level,proto3,enum=milvus.protov2.data.SegmentLevel" json:"level,omitempty"` - StorageVersion int64 `protobuf:"varint,21,opt,name=storage_version,json=storageVersion,proto3" json:"storage_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Level SegmentLevel `protobuf:"varint,20,opt,name=level,proto3,enum=milvus.protov2.data.SegmentLevel" json:"level,omitempty"` + StorageVersion int64 `protobuf:"varint,21,opt,name=storage_version,json=storageVersion,proto3" json:"storage_version,omitempty"` + PartitionStatsVersion int64 `protobuf:"varint,22,opt,name=partition_stats_version,json=partitionStatsVersion,proto3" json:"partition_stats_version,omitempty"` + // use in major compaction, if compaction fail, should revert segment level to last value + LastLevel SegmentLevel `protobuf:"varint,23,opt,name=last_level,json=lastLevel,proto3,enum=milvus.protov2.data.SegmentLevel" json:"last_level,omitempty"` + // use in major compaction, if compaction fail, should revert partition stats version to last value + LastPartitionStatsVersion int64 `protobuf:"varint,24,opt,name=last_partition_stats_version,json=lastPartitionStatsVersion,proto3" json:"last_partition_stats_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SegmentInfo) Reset() { *m = SegmentInfo{} } @@ -1890,6 +1955,27 @@ func (m *SegmentInfo) GetStorageVersion() int64 { return 0 } +func (m *SegmentInfo) GetPartitionStatsVersion() int64 { + if m != nil { + return m.PartitionStatsVersion + } + return 0 +} + +func (m *SegmentInfo) GetLastLevel() SegmentLevel { + if m != nil { + return m.LastLevel + } + return SegmentLevel_Legacy +} + +func (m *SegmentInfo) GetLastPartitionStatsVersion() int64 { + if m != nil { + return m.LastPartitionStatsVersion + } + return 0 +} + type SegmentStartPosition struct { StartPosition *msgpb.MsgPosition `protobuf:"bytes,1,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"` @@ -3121,6 +3207,7 @@ func (m *ChannelWatchInfo) GetOpID() int64 { type CompactionStateRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` + PlanID int64 `protobuf:"varint,2,opt,name=planID,proto3" json:"planID,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3158,11 +3245,23 @@ func (m *CompactionStateRequest) GetBase() *commonpb.MsgBase { return nil } +func (m *CompactionStateRequest) GetPlanID() int64 { + if m != nil { + return m.PlanID + } + return 0 +} + type SyncSegmentsRequest struct { - PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` - CompactedTo int64 `protobuf:"varint,2,opt,name=compacted_to,json=compactedTo,proto3" json:"compacted_to,omitempty"` - NumOfRows int64 `protobuf:"varint,3,opt,name=num_of_rows,json=numOfRows,proto3" json:"num_of_rows,omitempty"` - CompactedFrom []int64 `protobuf:"varint,4,rep,packed,name=compacted_from,json=compactedFrom,proto3" json:"compacted_from,omitempty"` + // Deprecated, after v2.4.3 + PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` + // Deprecated, after v2.4.3 + CompactedTo int64 `protobuf:"varint,2,opt,name=compacted_to,json=compactedTo,proto3" json:"compacted_to,omitempty"` + // Deprecated, after v2.4.3 + NumOfRows int64 `protobuf:"varint,3,opt,name=num_of_rows,json=numOfRows,proto3" json:"num_of_rows,omitempty"` + // Deprecated, after v2.4.3 + CompactedFrom []int64 `protobuf:"varint,4,rep,packed,name=compacted_from,json=compactedFrom,proto3" json:"compacted_from,omitempty"` + // Deprecated, after v2.4.3 StatsLogs []*FieldBinlog `protobuf:"bytes,5,rep,name=stats_logs,json=statsLogs,proto3" json:"stats_logs,omitempty"` ChannelName string `protobuf:"bytes,6,opt,name=channel_name,json=channelName,proto3" json:"channel_name,omitempty"` PartitionId int64 `protobuf:"varint,7,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"` @@ -3351,13 +3450,20 @@ func (m *CompactionSegmentBinlogs) GetPartitionID() int64 { type CompactionPlan struct { PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` SegmentBinlogs []*CompactionSegmentBinlogs `protobuf:"bytes,2,rep,name=segmentBinlogs,proto3" json:"segmentBinlogs,omitempty"` - StartTime uint64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + StartTime int64 `protobuf:"varint,3,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` TimeoutInSeconds int32 `protobuf:"varint,4,opt,name=timeout_in_seconds,json=timeoutInSeconds,proto3" json:"timeout_in_seconds,omitempty"` Type CompactionType `protobuf:"varint,5,opt,name=type,proto3,enum=milvus.protov2.data.CompactionType" json:"type,omitempty"` Timetravel uint64 `protobuf:"varint,6,opt,name=timetravel,proto3" json:"timetravel,omitempty"` Channel string `protobuf:"bytes,7,opt,name=channel,proto3" json:"channel,omitempty"` CollectionTtl int64 `protobuf:"varint,8,opt,name=collection_ttl,json=collectionTtl,proto3" json:"collection_ttl,omitempty"` TotalRows int64 `protobuf:"varint,9,opt,name=total_rows,json=totalRows,proto3" json:"total_rows,omitempty"` + Schema *schemapb.CollectionSchema `protobuf:"bytes,10,opt,name=schema,proto3" json:"schema,omitempty"` + ClusteringKeyField int64 `protobuf:"varint,11,opt,name=clustering_key_field,json=clusteringKeyField,proto3" json:"clustering_key_field,omitempty"` + MaxSegmentRows int64 `protobuf:"varint,12,opt,name=max_segment_rows,json=maxSegmentRows,proto3" json:"max_segment_rows,omitempty"` + PreferSegmentRows int64 `protobuf:"varint,13,opt,name=prefer_segment_rows,json=preferSegmentRows,proto3" json:"prefer_segment_rows,omitempty"` + AnalyzeResultPath string `protobuf:"bytes,14,opt,name=analyze_result_path,json=analyzeResultPath,proto3" json:"analyze_result_path,omitempty"` + AnalyzeSegmentIds []int64 `protobuf:"varint,15,rep,packed,name=analyze_segment_ids,json=analyzeSegmentIds,proto3" json:"analyze_segment_ids,omitempty"` + State int32 `protobuf:"varint,16,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3402,7 +3508,7 @@ func (m *CompactionPlan) GetSegmentBinlogs() []*CompactionSegmentBinlogs { return nil } -func (m *CompactionPlan) GetStartTime() uint64 { +func (m *CompactionPlan) GetStartTime() int64 { if m != nil { return m.StartTime } @@ -3451,6 +3557,55 @@ func (m *CompactionPlan) GetTotalRows() int64 { return 0 } +func (m *CompactionPlan) GetSchema() *schemapb.CollectionSchema { + if m != nil { + return m.Schema + } + return nil +} + +func (m *CompactionPlan) GetClusteringKeyField() int64 { + if m != nil { + return m.ClusteringKeyField + } + return 0 +} + +func (m *CompactionPlan) GetMaxSegmentRows() int64 { + if m != nil { + return m.MaxSegmentRows + } + return 0 +} + +func (m *CompactionPlan) GetPreferSegmentRows() int64 { + if m != nil { + return m.PreferSegmentRows + } + return 0 +} + +func (m *CompactionPlan) GetAnalyzeResultPath() string { + if m != nil { + return m.AnalyzeResultPath + } + return "" +} + +func (m *CompactionPlan) GetAnalyzeSegmentIds() []int64 { + if m != nil { + return m.AnalyzeSegmentIds + } + return nil +} + +func (m *CompactionPlan) GetState() int32 { + if m != nil { + return m.State + } + return 0 +} + type CompactionSegment struct { PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` SegmentID int64 `protobuf:"varint,2,opt,name=segmentID,proto3" json:"segmentID,omitempty"` @@ -3539,14 +3694,14 @@ func (m *CompactionSegment) GetChannel() string { } type CompactionPlanResult struct { - PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` - State commonpb.CompactionState `protobuf:"varint,2,opt,name=state,proto3,enum=milvus.protov2.common.CompactionState" json:"state,omitempty"` - Segments []*CompactionSegment `protobuf:"bytes,3,rep,name=segments,proto3" json:"segments,omitempty"` - Channel string `protobuf:"bytes,4,opt,name=channel,proto3" json:"channel,omitempty"` - Type CompactionType `protobuf:"varint,5,opt,name=type,proto3,enum=milvus.protov2.data.CompactionType" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` + State CompactionTaskState `protobuf:"varint,2,opt,name=state,proto3,enum=milvus.protov2.data.CompactionTaskState" json:"state,omitempty"` + Segments []*CompactionSegment `protobuf:"bytes,3,rep,name=segments,proto3" json:"segments,omitempty"` + Channel string `protobuf:"bytes,4,opt,name=channel,proto3" json:"channel,omitempty"` + Type CompactionType `protobuf:"varint,5,opt,name=type,proto3,enum=milvus.protov2.data.CompactionType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CompactionPlanResult) Reset() { *m = CompactionPlanResult{} } @@ -3581,11 +3736,11 @@ func (m *CompactionPlanResult) GetPlanID() int64 { return 0 } -func (m *CompactionPlanResult) GetState() commonpb.CompactionState { +func (m *CompactionPlanResult) GetState() CompactionTaskState { if m != nil { return m.State } - return commonpb.CompactionState_UndefiedState + return CompactionTaskState_unknown } func (m *CompactionPlanResult) GetSegments() []*CompactionSegment { @@ -5448,6 +5603,7 @@ type ImportSegmentInfo struct { ImportedRows int64 `protobuf:"varint,2,opt,name=imported_rows,json=importedRows,proto3" json:"imported_rows,omitempty"` Binlogs []*FieldBinlog `protobuf:"bytes,3,rep,name=binlogs,proto3" json:"binlogs,omitempty"` Statslogs []*FieldBinlog `protobuf:"bytes,4,rep,name=statslogs,proto3" json:"statslogs,omitempty"` + Deltalogs []*FieldBinlog `protobuf:"bytes,5,rep,name=deltalogs,proto3" json:"deltalogs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -5506,6 +5662,13 @@ func (m *ImportSegmentInfo) GetStatslogs() []*FieldBinlog { return nil } +func (m *ImportSegmentInfo) GetDeltalogs() []*FieldBinlog { + if m != nil { + return m.Deltalogs + } + return nil +} + type QueryImportResponse struct { Status *commonpb.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` TaskID int64 `protobuf:"varint,2,opt,name=taskID,proto3" json:"taskID,omitempty"` @@ -6044,6 +6207,229 @@ func (m *GcControlRequest) GetParams() []*commonpb.KeyValuePair { return nil } +type CompactionTask struct { + PlanID int64 `protobuf:"varint,1,opt,name=planID,proto3" json:"planID,omitempty"` + TriggerID int64 `protobuf:"varint,2,opt,name=triggerID,proto3" json:"triggerID,omitempty"` + CollectionID int64 `protobuf:"varint,3,opt,name=collectionID,proto3" json:"collectionID,omitempty"` + PartitionID int64 `protobuf:"varint,4,opt,name=partitionID,proto3" json:"partitionID,omitempty"` + Channel string `protobuf:"bytes,5,opt,name=channel,proto3" json:"channel,omitempty"` + Type CompactionType `protobuf:"varint,6,opt,name=type,proto3,enum=milvus.protov2.data.CompactionType" json:"type,omitempty"` + State CompactionTaskState `protobuf:"varint,7,opt,name=state,proto3,enum=milvus.protov2.data.CompactionTaskState" json:"state,omitempty"` + FailReason string `protobuf:"bytes,8,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"` + StartTime int64 `protobuf:"varint,9,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + EndTime int64 `protobuf:"varint,10,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"` + TimeoutInSeconds int32 `protobuf:"varint,11,opt,name=timeout_in_seconds,json=timeoutInSeconds,proto3" json:"timeout_in_seconds,omitempty"` + RetryTimes int32 `protobuf:"varint,12,opt,name=retry_times,json=retryTimes,proto3" json:"retry_times,omitempty"` + CollectionTtl int64 `protobuf:"varint,13,opt,name=collection_ttl,json=collectionTtl,proto3" json:"collection_ttl,omitempty"` + TotalRows int64 `protobuf:"varint,14,opt,name=total_rows,json=totalRows,proto3" json:"total_rows,omitempty"` + InputSegments []int64 `protobuf:"varint,15,rep,packed,name=inputSegments,proto3" json:"inputSegments,omitempty"` + ResultSegments []int64 `protobuf:"varint,16,rep,packed,name=resultSegments,proto3" json:"resultSegments,omitempty"` + Pos *msgpb.MsgPosition `protobuf:"bytes,17,opt,name=pos,proto3" json:"pos,omitempty"` + NodeID int64 `protobuf:"varint,18,opt,name=nodeID,proto3" json:"nodeID,omitempty"` + Schema *schemapb.CollectionSchema `protobuf:"bytes,19,opt,name=schema,proto3" json:"schema,omitempty"` + ClusteringKeyField *schemapb.FieldSchema `protobuf:"bytes,20,opt,name=clustering_key_field,json=clusteringKeyField,proto3" json:"clustering_key_field,omitempty"` + MaxSegmentRows int64 `protobuf:"varint,21,opt,name=max_segment_rows,json=maxSegmentRows,proto3" json:"max_segment_rows,omitempty"` + PreferSegmentRows int64 `protobuf:"varint,22,opt,name=prefer_segment_rows,json=preferSegmentRows,proto3" json:"prefer_segment_rows,omitempty"` + AnalyzeTaskID int64 `protobuf:"varint,23,opt,name=analyzeTaskID,proto3" json:"analyzeTaskID,omitempty"` + AnalyzeVersion int64 `protobuf:"varint,24,opt,name=analyzeVersion,proto3" json:"analyzeVersion,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *CompactionTask) Reset() { *m = CompactionTask{} } +func (m *CompactionTask) String() string { return proto.CompactTextString(m) } +func (*CompactionTask) ProtoMessage() {} +func (*CompactionTask) Descriptor() ([]byte, []int) { + return fileDescriptor_82cd95f524594f49, []int{88} +} + +func (m *CompactionTask) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_CompactionTask.Unmarshal(m, b) +} +func (m *CompactionTask) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_CompactionTask.Marshal(b, m, deterministic) +} +func (m *CompactionTask) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompactionTask.Merge(m, src) +} +func (m *CompactionTask) XXX_Size() int { + return xxx_messageInfo_CompactionTask.Size(m) +} +func (m *CompactionTask) XXX_DiscardUnknown() { + xxx_messageInfo_CompactionTask.DiscardUnknown(m) +} + +var xxx_messageInfo_CompactionTask proto.InternalMessageInfo + +func (m *CompactionTask) GetPlanID() int64 { + if m != nil { + return m.PlanID + } + return 0 +} + +func (m *CompactionTask) GetTriggerID() int64 { + if m != nil { + return m.TriggerID + } + return 0 +} + +func (m *CompactionTask) GetCollectionID() int64 { + if m != nil { + return m.CollectionID + } + return 0 +} + +func (m *CompactionTask) GetPartitionID() int64 { + if m != nil { + return m.PartitionID + } + return 0 +} + +func (m *CompactionTask) GetChannel() string { + if m != nil { + return m.Channel + } + return "" +} + +func (m *CompactionTask) GetType() CompactionType { + if m != nil { + return m.Type + } + return CompactionType_UndefinedCompaction +} + +func (m *CompactionTask) GetState() CompactionTaskState { + if m != nil { + return m.State + } + return CompactionTaskState_unknown +} + +func (m *CompactionTask) GetFailReason() string { + if m != nil { + return m.FailReason + } + return "" +} + +func (m *CompactionTask) GetStartTime() int64 { + if m != nil { + return m.StartTime + } + return 0 +} + +func (m *CompactionTask) GetEndTime() int64 { + if m != nil { + return m.EndTime + } + return 0 +} + +func (m *CompactionTask) GetTimeoutInSeconds() int32 { + if m != nil { + return m.TimeoutInSeconds + } + return 0 +} + +func (m *CompactionTask) GetRetryTimes() int32 { + if m != nil { + return m.RetryTimes + } + return 0 +} + +func (m *CompactionTask) GetCollectionTtl() int64 { + if m != nil { + return m.CollectionTtl + } + return 0 +} + +func (m *CompactionTask) GetTotalRows() int64 { + if m != nil { + return m.TotalRows + } + return 0 +} + +func (m *CompactionTask) GetInputSegments() []int64 { + if m != nil { + return m.InputSegments + } + return nil +} + +func (m *CompactionTask) GetResultSegments() []int64 { + if m != nil { + return m.ResultSegments + } + return nil +} + +func (m *CompactionTask) GetPos() *msgpb.MsgPosition { + if m != nil { + return m.Pos + } + return nil +} + +func (m *CompactionTask) GetNodeID() int64 { + if m != nil { + return m.NodeID + } + return 0 +} + +func (m *CompactionTask) GetSchema() *schemapb.CollectionSchema { + if m != nil { + return m.Schema + } + return nil +} + +func (m *CompactionTask) GetClusteringKeyField() *schemapb.FieldSchema { + if m != nil { + return m.ClusteringKeyField + } + return nil +} + +func (m *CompactionTask) GetMaxSegmentRows() int64 { + if m != nil { + return m.MaxSegmentRows + } + return 0 +} + +func (m *CompactionTask) GetPreferSegmentRows() int64 { + if m != nil { + return m.PreferSegmentRows + } + return 0 +} + +func (m *CompactionTask) GetAnalyzeTaskID() int64 { + if m != nil { + return m.AnalyzeTaskID + } + return 0 +} + +func (m *CompactionTask) GetAnalyzeVersion() int64 { + if m != nil { + return m.AnalyzeVersion + } + return 0 +} + func init() { proto.RegisterEnum("milvus.protov2.data.SegmentType", SegmentType_name, SegmentType_value) proto.RegisterEnum("milvus.protov2.data.SegmentLevel", SegmentLevel_name, SegmentLevel_value) @@ -6051,6 +6437,7 @@ func init() { proto.RegisterEnum("milvus.protov2.data.CompactionType", CompactionType_name, CompactionType_value) proto.RegisterEnum("milvus.protov2.data.ImportTaskStateV2", ImportTaskStateV2_name, ImportTaskStateV2_value) proto.RegisterEnum("milvus.protov2.data.GcCommand", GcCommand_name, GcCommand_value) + proto.RegisterEnum("milvus.protov2.data.CompactionTaskState", CompactionTaskState_name, CompactionTaskState_value) proto.RegisterType((*Empty)(nil), "milvus.protov2.data.Empty") proto.RegisterType((*FlushRequest)(nil), "milvus.protov2.data.FlushRequest") proto.RegisterType((*FlushResponse)(nil), "milvus.protov2.data.FlushResponse") @@ -6074,6 +6461,7 @@ func init() { proto.RegisterType((*GetPartitionStatisticsResponse)(nil), "milvus.protov2.data.GetPartitionStatisticsResponse") proto.RegisterType((*GetSegmentInfoChannelRequest)(nil), "milvus.protov2.data.GetSegmentInfoChannelRequest") proto.RegisterType((*VchannelInfo)(nil), "milvus.protov2.data.VchannelInfo") + proto.RegisterMapType((map[int64]int64)(nil), "milvus.protov2.data.VchannelInfo.PartitionStatsVersionsEntry") proto.RegisterType((*WatchDmChannelsRequest)(nil), "milvus.protov2.data.WatchDmChannelsRequest") proto.RegisterType((*FlushSegmentsRequest)(nil), "milvus.protov2.data.FlushSegmentsRequest") proto.RegisterType((*SegmentMsg)(nil), "milvus.protov2.data.SegmentMsg") @@ -6144,379 +6532,411 @@ func init() { proto.RegisterType((*PreImportTask)(nil), "milvus.protov2.data.PreImportTask") proto.RegisterType((*ImportTaskV2)(nil), "milvus.protov2.data.ImportTaskV2") proto.RegisterType((*GcControlRequest)(nil), "milvus.protov2.data.GcControlRequest") + proto.RegisterType((*CompactionTask)(nil), "milvus.protov2.data.CompactionTask") } func init() { proto.RegisterFile("data_coord.proto", fileDescriptor_82cd95f524594f49) } var fileDescriptor_82cd95f524594f49 = []byte{ - // 5863 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3d, 0x5b, 0x8f, 0x24, 0xd7, - 0x59, 0x5b, 0x7d, 0xef, 0xaf, 0x7b, 0x7a, 0x7a, 0xce, 0x8c, 0x67, 0xdb, 0xed, 0xbd, 0xb9, 0x1c, - 0xaf, 0x77, 0x37, 0xf6, 0xae, 0xdd, 0xce, 0x92, 0xc4, 0x8e, 0xe3, 0x78, 0x67, 0xbc, 0xce, 0xd8, - 0xbb, 0xeb, 0xa1, 0x66, 0x76, 0x12, 0x02, 0x4a, 0xab, 0xa6, 0xeb, 0x4c, 0x4f, 0x79, 0xaa, 0xab, - 0xda, 0x55, 0xd5, 0xbb, 0x3b, 0x26, 0x80, 0x70, 0x2e, 0xa0, 0x28, 0x08, 0x14, 0x2e, 0x81, 0x57, - 0x1e, 0x82, 0x84, 0x02, 0x48, 0x20, 0x41, 0x24, 0x04, 0x12, 0x0a, 0x12, 0x48, 0x48, 0x20, 0xc1, - 0x0b, 0xe2, 0x09, 0x1e, 0x10, 0xbf, 0x80, 0xe7, 0xa0, 0x73, 0xa9, 0x53, 0xa7, 0x6e, 0xdd, 0xd5, - 0xd3, 0xb3, 0x59, 0xa1, 0x3c, 0x4d, 0xd7, 0xa9, 0xef, 0x3b, 0x97, 0xef, 0x7c, 0xf7, 0xf3, 0x9d, - 0x1a, 0x68, 0x1b, 0xba, 0xaf, 0xf7, 0x07, 0x8e, 0xe3, 0x1a, 0xd7, 0xc7, 0xae, 0xe3, 0x3b, 0x68, - 0x75, 0x64, 0x5a, 0x0f, 0x26, 0x1e, 0x7b, 0x7a, 0xd0, 0xbb, 0x4e, 0x00, 0xba, 0xcd, 0x81, 0x33, - 0x1a, 0x39, 0x36, 0x6b, 0xec, 0xb6, 0x4c, 0xdb, 0xc7, 0xae, 0xad, 0x5b, 0xfc, 0xb9, 0x29, 0xa3, - 0x74, 0x9b, 0xde, 0xe0, 0x10, 0x8f, 0x74, 0xfe, 0x54, 0x1f, 0x79, 0x43, 0xfe, 0x73, 0xc5, 0xb4, - 0x0d, 0xfc, 0x48, 0x1e, 0x4c, 0xad, 0x42, 0xf9, 0xed, 0xd1, 0xd8, 0x3f, 0x56, 0xff, 0x52, 0x81, - 0xe6, 0x6d, 0x6b, 0xe2, 0x1d, 0x6a, 0xf8, 0xc3, 0x09, 0xf6, 0x7c, 0xd4, 0x83, 0xd2, 0xbe, 0xee, - 0xe1, 0x8e, 0x72, 0x49, 0xb9, 0xd2, 0xe8, 0x5d, 0xb8, 0x1e, 0x9b, 0x15, 0x9f, 0xcf, 0x5d, 0x6f, - 0x78, 0x4b, 0xf7, 0xb0, 0x46, 0x61, 0x11, 0x82, 0x92, 0xb1, 0xbf, 0xb5, 0xd9, 0x29, 0x5c, 0x52, - 0xae, 0x14, 0x35, 0xfa, 0x1b, 0x5d, 0x00, 0xf0, 0xf0, 0x70, 0x84, 0x6d, 0x7f, 0x6b, 0xd3, 0xeb, - 0x14, 0x2f, 0x15, 0xaf, 0x14, 0x35, 0xa9, 0x05, 0xa9, 0xd0, 0x1c, 0x38, 0x96, 0x85, 0x07, 0xbe, - 0xe9, 0xd8, 0x5b, 0x9b, 0x9d, 0x12, 0xc5, 0x8d, 0xb4, 0xa1, 0x2e, 0xd4, 0x4c, 0x6f, 0x6b, 0x34, - 0x76, 0x5c, 0xbf, 0x53, 0xbe, 0xa4, 0x5c, 0xa9, 0x69, 0xe2, 0x59, 0xfd, 0x61, 0x11, 0x96, 0xf8, - 0xc4, 0xbd, 0xb1, 0x63, 0x7b, 0x18, 0xdd, 0x84, 0x8a, 0xe7, 0xeb, 0xfe, 0xc4, 0xe3, 0x73, 0x3f, - 0x9f, 0x31, 0xf7, 0x1d, 0x0a, 0xa4, 0x71, 0xe0, 0xd4, 0xc9, 0xc7, 0x27, 0x57, 0x4c, 0x99, 0x5c, - 0x74, 0x81, 0xa5, 0xc4, 0x02, 0xaf, 0xc0, 0xf2, 0x01, 0x99, 0xdf, 0x4e, 0x08, 0x54, 0xa6, 0x40, - 0xf1, 0x66, 0xd2, 0x93, 0x6f, 0x8e, 0xf0, 0xfb, 0x07, 0x3b, 0x58, 0xb7, 0x3a, 0x15, 0x3a, 0x96, - 0xd4, 0x82, 0x9e, 0x86, 0x1a, 0x45, 0xe9, 0xfb, 0x5e, 0xa7, 0x7a, 0x49, 0xb9, 0x52, 0xd2, 0xaa, - 0xf4, 0x79, 0xd7, 0x43, 0x3b, 0xd0, 0x18, 0x1c, 0xea, 0xb6, 0x8d, 0xad, 0xfe, 0x60, 0xec, 0x75, - 0x6a, 0x97, 0x8a, 0x57, 0x1a, 0xbd, 0xde, 0xf5, 0x14, 0x56, 0xba, 0x1e, 0x21, 0xd6, 0xf5, 0x0d, - 0x86, 0xb5, 0x31, 0xf6, 0xde, 0xb6, 0x7d, 0xf7, 0x58, 0x83, 0x81, 0x68, 0xe8, 0x7e, 0x15, 0x96, - 0x63, 0xaf, 0x51, 0x1b, 0x8a, 0x47, 0xf8, 0x98, 0x12, 0xb6, 0xae, 0x91, 0x9f, 0xe8, 0x26, 0x94, - 0x1f, 0xe8, 0xd6, 0x04, 0x53, 0xba, 0x35, 0x7a, 0x17, 0xe3, 0x63, 0x12, 0xf6, 0xbb, 0xeb, 0x0d, - 0xb7, 0x1d, 0xcf, 0x24, 0x04, 0xd3, 0x18, 0xf4, 0x6b, 0x85, 0xcf, 0x28, 0xea, 0xaf, 0x2a, 0xb0, - 0x46, 0x67, 0xc3, 0x47, 0xf1, 0x16, 0xe1, 0x3d, 0x99, 0x38, 0x85, 0x28, 0x71, 0xba, 0x50, 0xe3, - 0xab, 0x62, 0x0c, 0x58, 0xd7, 0xc4, 0xb3, 0xfa, 0xed, 0x02, 0xb4, 0xc5, 0x16, 0x04, 0xe3, 0xaf, - 0x41, 0x79, 0xe0, 0x4c, 0x6c, 0x9f, 0x4e, 0x60, 0x49, 0x63, 0x0f, 0xe8, 0x59, 0x68, 0x06, 0x34, - 0xb6, 0xf5, 0x11, 0x5b, 0x70, 0x5d, 0x0b, 0xe8, 0x7e, 0x4f, 0x1f, 0xe1, 0x5c, 0xfc, 0x72, 0x09, - 0x1a, 0x63, 0xdd, 0xf5, 0xcd, 0x08, 0xbf, 0xcb, 0x4d, 0xd3, 0xd8, 0x9d, 0x8c, 0x60, 0xd2, 0x5f, - 0xbb, 0xba, 0x77, 0xb4, 0xb5, 0xc9, 0xb9, 0x24, 0xd2, 0x86, 0x3e, 0x0d, 0x65, 0x0b, 0x3f, 0xc0, - 0x16, 0x65, 0x92, 0x56, 0xef, 0xd9, 0x54, 0x36, 0xe0, 0x8b, 0xbe, 0x43, 0x00, 0x35, 0x06, 0xaf, - 0xfe, 0xa1, 0x02, 0xeb, 0x6f, 0x79, 0x9e, 0x39, 0xb4, 0x13, 0x24, 0x59, 0x87, 0x8a, 0xed, 0x18, - 0x78, 0x6b, 0x93, 0xd2, 0xa4, 0xa8, 0xf1, 0x27, 0xf4, 0x0c, 0xd4, 0xc7, 0x18, 0xbb, 0x7d, 0xd7, - 0xb1, 0x02, 0x8a, 0xd4, 0x48, 0x83, 0xe6, 0x58, 0x18, 0xed, 0xc0, 0x8a, 0x17, 0xeb, 0x88, 0xed, - 0x40, 0xa3, 0xf7, 0xfc, 0xb4, 0x49, 0x09, 0x68, 0x2d, 0x89, 0xaf, 0x7e, 0x5c, 0x80, 0x55, 0x01, - 0xc7, 0x66, 0x4b, 0x7e, 0x93, 0x4d, 0xf3, 0xf0, 0x50, 0x4c, 0x90, 0x3d, 0xe4, 0xd9, 0x34, 0xb1, - 0xdb, 0x45, 0x79, 0xb7, 0xf3, 0xe8, 0xa5, 0xd8, 0x56, 0x96, 0x93, 0x5b, 0x79, 0x11, 0x1a, 0xf8, - 0xd1, 0xd8, 0x74, 0x71, 0x9f, 0xc8, 0x31, 0xdd, 0xad, 0x92, 0x06, 0xac, 0x69, 0xd7, 0x1c, 0xc9, - 0xca, 0xaa, 0x3a, 0x87, 0xb2, 0x52, 0xbf, 0xaf, 0xc0, 0xd9, 0xc4, 0x4e, 0x71, 0xfd, 0xb7, 0x0b, - 0x6d, 0xba, 0xf6, 0x90, 0x36, 0x44, 0x13, 0x12, 0xa2, 0x5f, 0x99, 0x4e, 0xf4, 0x10, 0x41, 0x4b, - 0xf4, 0x20, 0x4d, 0xb4, 0x30, 0xcf, 0x44, 0x47, 0x70, 0xf6, 0x1d, 0xec, 0xf3, 0x21, 0xc8, 0x3b, - 0xbc, 0x90, 0x94, 0x47, 0x95, 0x6d, 0x21, 0xae, 0x6c, 0xd5, 0x3f, 0x0d, 0xc5, 0x99, 0x0e, 0xb6, - 0x65, 0x1f, 0x38, 0xe8, 0x1c, 0xd4, 0x05, 0x08, 0xe7, 0x8e, 0xb0, 0x01, 0x7d, 0x16, 0xca, 0x64, - 0xae, 0x8c, 0x35, 0x5a, 0xbd, 0xe7, 0xb2, 0xd6, 0x25, 0xf5, 0xaa, 0x31, 0x0c, 0x74, 0x1b, 0x5a, - 0x9e, 0xaf, 0xbb, 0x7e, 0x7f, 0xcc, 0xb5, 0x1b, 0x65, 0xa1, 0x1c, 0x4a, 0x70, 0x89, 0xa2, 0x05, - 0x8f, 0xe8, 0x16, 0x34, 0xb1, 0x6d, 0x84, 0xbd, 0x94, 0xf2, 0xf5, 0xd2, 0xc0, 0xb6, 0x21, 0xfa, - 0x08, 0xf7, 0xa7, 0x3c, 0xcf, 0xfe, 0xfc, 0x96, 0x02, 0x9d, 0xe4, 0x06, 0x2d, 0x66, 0x49, 0xdf, - 0x60, 0x68, 0x98, 0x6d, 0xd0, 0x0c, 0x59, 0x17, 0xdb, 0xa4, 0x71, 0x24, 0xf5, 0x7b, 0x0a, 0x3c, - 0x15, 0x4e, 0x89, 0xbe, 0x7a, 0x7c, 0x1c, 0x83, 0xae, 0x41, 0xdb, 0xb4, 0x07, 0xd6, 0xc4, 0xc0, - 0xf7, 0xed, 0x2f, 0x62, 0xdd, 0xf2, 0x0f, 0x8f, 0xe9, 0x2e, 0xd6, 0xb4, 0x44, 0xbb, 0xfa, 0x5f, - 0x05, 0x58, 0x8f, 0xcf, 0x6c, 0x31, 0x52, 0xfd, 0x0c, 0x94, 0x4d, 0xfb, 0xc0, 0x09, 0x28, 0x75, - 0x69, 0xaa, 0x80, 0x92, 0xf1, 0x18, 0x38, 0xfa, 0x10, 0x90, 0xb0, 0xf7, 0x87, 0x78, 0x70, 0x34, - 0x76, 0x4c, 0xaa, 0xc0, 0x48, 0x27, 0xb7, 0x52, 0x3b, 0x49, 0x9f, 0xb7, 0xb0, 0xff, 0xa2, 0x13, - 0xe6, 0x06, 0xac, 0x0c, 0xe2, 0xed, 0x5d, 0x0c, 0xeb, 0xe9, 0xc0, 0xa7, 0xeb, 0x14, 0x38, 0xf0, - 0xcc, 0x3b, 0xd8, 0xdf, 0xb2, 0x3d, 0xec, 0xfa, 0xb7, 0x4c, 0xdb, 0x72, 0x86, 0xdb, 0xba, 0x7f, - 0xb8, 0x90, 0xd2, 0x88, 0xc8, 0x7f, 0x21, 0x26, 0xff, 0xea, 0x0f, 0x14, 0x38, 0x97, 0x3e, 0x22, - 0xdf, 0xda, 0x2e, 0xd4, 0x0e, 0x4c, 0x6c, 0x19, 0x84, 0x7f, 0x14, 0xca, 0x3f, 0xe2, 0x99, 0x28, - 0x8f, 0x31, 0x01, 0xe6, 0xfb, 0x97, 0x50, 0x1e, 0xc2, 0x51, 0xdf, 0xf1, 0x5d, 0xd3, 0x1e, 0xde, - 0x31, 0x3d, 0x5f, 0x63, 0x18, 0x12, 0xc7, 0x14, 0xe7, 0x11, 0xd8, 0xef, 0x28, 0x70, 0xe1, 0x1d, - 0xec, 0x6f, 0x08, 0x3b, 0x44, 0xde, 0x9b, 0x9e, 0x6f, 0x0e, 0xbc, 0xd3, 0x76, 0xdd, 0x73, 0x78, - 0x33, 0xea, 0x6f, 0x2b, 0x70, 0x31, 0x73, 0x3a, 0x9c, 0x80, 0x5c, 0xc3, 0x06, 0x56, 0x28, 0x4b, - 0xc3, 0xbe, 0x87, 0x8f, 0xf7, 0x08, 0x1b, 0x6c, 0xeb, 0xa6, 0xcb, 0x34, 0xec, 0x89, 0xad, 0xce, - 0x9f, 0x29, 0x70, 0xfe, 0x1d, 0xec, 0x6f, 0x07, 0x96, 0xf8, 0x89, 0xd2, 0x88, 0xc0, 0x48, 0x3e, - 0x41, 0x10, 0x23, 0x44, 0xda, 0xd4, 0xef, 0xb2, 0x6d, 0x4d, 0x9d, 0xf1, 0x13, 0x23, 0xe3, 0x05, - 0x2a, 0x19, 0x92, 0xda, 0xe0, 0x0a, 0x80, 0x13, 0x51, 0xfd, 0x51, 0x19, 0x9a, 0x7b, 0x5c, 0x53, - 0x50, 0x4b, 0x1b, 0xa7, 0x86, 0x92, 0xee, 0x34, 0x49, 0xde, 0x57, 0x9a, 0x43, 0xb6, 0x09, 0x4b, - 0x1e, 0xc6, 0x47, 0x73, 0x5b, 0xd5, 0x26, 0xc1, 0x12, 0x06, 0xf1, 0x1e, 0xac, 0x4c, 0x6c, 0x1a, - 0x02, 0x60, 0x83, 0x2f, 0x81, 0x91, 0x3e, 0x8f, 0x9a, 0x4d, 0xa2, 0xa2, 0x77, 0x79, 0x1c, 0x27, - 0xf5, 0x56, 0xce, 0xd9, 0x5b, 0x1c, 0x11, 0xbd, 0x07, 0x6d, 0xc3, 0x75, 0xc6, 0x63, 0x6c, 0xf4, - 0xbd, 0xa0, 0xb3, 0x4a, 0xde, 0xce, 0x38, 0xa6, 0xe8, 0xec, 0x65, 0x58, 0x8d, 0xcf, 0x76, 0xcb, - 0x20, 0xfe, 0x24, 0xe1, 0xb2, 0xb4, 0x57, 0xe8, 0x45, 0x58, 0x49, 0xc2, 0xd7, 0x28, 0x7c, 0xf2, - 0x05, 0x7a, 0x09, 0x50, 0x6c, 0xb2, 0x04, 0xbc, 0xce, 0xc0, 0xa3, 0x93, 0xe1, 0xe0, 0x34, 0xcf, - 0x10, 0x05, 0x07, 0x06, 0xce, 0xdf, 0x48, 0xe0, 0xef, 0x11, 0xfb, 0x1b, 0x01, 0xf7, 0x3a, 0x8d, - 0xbc, 0xa4, 0x88, 0x76, 0xe7, 0xa1, 0x57, 0x61, 0x9d, 0x46, 0x32, 0xfd, 0x8f, 0xb0, 0xeb, 0x04, - 0xfd, 0xf5, 0x4d, 0xc3, 0xeb, 0x34, 0x19, 0x35, 0xe8, 0xdb, 0xaf, 0x60, 0xd7, 0x09, 0x67, 0xa0, - 0xfe, 0x86, 0x02, 0xeb, 0x5f, 0xd2, 0xfd, 0xc1, 0xe1, 0xe6, 0xe8, 0x34, 0x02, 0xd1, 0x37, 0xa1, - 0xfe, 0x40, 0x84, 0x9b, 0xcc, 0x2c, 0xa4, 0x47, 0x60, 0xb2, 0xe4, 0x68, 0x21, 0x8e, 0xfa, 0xf7, - 0x41, 0x58, 0x1c, 0x2c, 0xeb, 0x49, 0xe8, 0xac, 0x59, 0x59, 0x8d, 0x98, 0x14, 0x97, 0x13, 0x52, - 0xac, 0x7e, 0x0d, 0x80, 0x2f, 0xe0, 0xae, 0x37, 0x3c, 0xd1, 0xdc, 0x5f, 0x83, 0x2a, 0x1f, 0x91, - 0xab, 0xad, 0xd9, 0x1c, 0x11, 0x20, 0xa8, 0x3f, 0xa8, 0x42, 0x43, 0x7a, 0x81, 0x5a, 0x50, 0x10, - 0xfa, 0xa8, 0x90, 0x42, 0x83, 0xc2, 0xec, 0xf0, 0xae, 0x98, 0x0c, 0xef, 0x9e, 0x87, 0x96, 0x49, - 0xfd, 0x86, 0x3e, 0x5f, 0x39, 0x75, 0xdd, 0xeb, 0xda, 0x12, 0x6b, 0xe5, 0xec, 0x84, 0x2e, 0x40, - 0xc3, 0x9e, 0x8c, 0xfa, 0xce, 0x41, 0xdf, 0x75, 0x1e, 0x7a, 0x3c, 0x4e, 0xac, 0xdb, 0x93, 0xd1, - 0xfb, 0x07, 0x9a, 0xf3, 0xd0, 0x0b, 0x43, 0x90, 0xca, 0xdc, 0x21, 0xc8, 0x05, 0x68, 0x8c, 0xf4, - 0x47, 0xa4, 0xdf, 0xbe, 0x3d, 0x19, 0xd1, 0x20, 0xb2, 0xa8, 0xd5, 0x47, 0xfa, 0x23, 0xcd, 0x79, - 0x78, 0x6f, 0x32, 0x42, 0x57, 0xa0, 0x6d, 0xe9, 0x9e, 0xdf, 0x97, 0xa3, 0xd0, 0x1a, 0x8d, 0x42, - 0x5b, 0xa4, 0xfd, 0xed, 0x30, 0x12, 0x4d, 0x06, 0x33, 0xf5, 0x93, 0x06, 0x33, 0xc6, 0xc8, 0x0a, - 0x7b, 0x81, 0x9c, 0xc1, 0x8c, 0x31, 0xb2, 0x44, 0x1f, 0xaf, 0x41, 0x75, 0x9f, 0x7a, 0x62, 0xd3, - 0x75, 0xc1, 0x6d, 0xe2, 0x86, 0x31, 0x97, 0x4d, 0x0b, 0x10, 0xd0, 0xe7, 0xa1, 0x4e, 0x8d, 0x1e, - 0xc5, 0x6e, 0xe6, 0xc4, 0x0e, 0x51, 0x08, 0xbe, 0x81, 0x2d, 0x5f, 0xa7, 0xf8, 0x4b, 0x79, 0xf1, - 0x05, 0x0a, 0x51, 0xc7, 0x03, 0x17, 0xeb, 0x3e, 0x36, 0x6e, 0x1d, 0x6f, 0x38, 0xa3, 0xb1, 0x4e, - 0xd9, 0xa9, 0xd3, 0xa2, 0x31, 0x45, 0xda, 0x2b, 0x74, 0x19, 0x5a, 0x03, 0xf1, 0x74, 0xdb, 0x75, - 0x46, 0x9d, 0x65, 0x2a, 0x6f, 0xb1, 0x56, 0x74, 0x1e, 0x20, 0x50, 0xc4, 0xba, 0xdf, 0x69, 0xd3, - 0x5d, 0xac, 0xf3, 0x96, 0xb7, 0x68, 0x7e, 0xca, 0xf4, 0xfa, 0x2c, 0x13, 0x64, 0xda, 0xc3, 0xce, - 0x0a, 0x1d, 0xb1, 0x11, 0xa4, 0x8e, 0x4c, 0x7b, 0x88, 0xce, 0x42, 0xd5, 0xf4, 0xfa, 0x07, 0xfa, - 0x11, 0xee, 0x20, 0xfa, 0xb6, 0x62, 0x7a, 0xb7, 0xf5, 0x23, 0xea, 0x22, 0xf3, 0xc1, 0xb0, 0xd1, - 0x59, 0xa5, 0xaf, 0xc2, 0x86, 0x30, 0xa1, 0xb4, 0x36, 0x5f, 0x42, 0x09, 0xbd, 0x00, 0xcb, 0x9e, - 0xef, 0xb8, 0xfa, 0x10, 0xf7, 0x1f, 0x60, 0xd7, 0x23, 0x74, 0x78, 0x8a, 0x72, 0x68, 0x8b, 0x37, - 0xef, 0xb1, 0x56, 0xf5, 0x6b, 0xb0, 0x16, 0x72, 0xb7, 0xc4, 0x4c, 0x49, 0xa6, 0x54, 0x4e, 0xc4, - 0x94, 0xd3, 0x43, 0x80, 0x1f, 0x97, 0x61, 0x7d, 0x47, 0x7f, 0x80, 0x7f, 0x12, 0xf1, 0x46, 0x2e, - 0xed, 0x7b, 0x0f, 0x56, 0x68, 0x88, 0xd1, 0x93, 0x66, 0x34, 0xd5, 0x77, 0x91, 0x79, 0x31, 0x89, - 0x8a, 0xde, 0x22, 0xda, 0x1a, 0x0f, 0x8e, 0xb6, 0x49, 0xd0, 0x16, 0xf8, 0x2d, 0x17, 0x53, 0x7b, - 0xda, 0x10, 0x70, 0x9a, 0x8c, 0x83, 0x34, 0xb2, 0x95, 0xf2, 0x4e, 0x04, 0x1e, 0xcb, 0xd5, 0x19, - 0xd1, 0x7d, 0xb8, 0x0b, 0x5a, 0x2b, 0xb2, 0x29, 0x1e, 0xea, 0x40, 0x95, 0xbb, 0x1b, 0x54, 0x71, - 0xd5, 0xb4, 0xe0, 0x11, 0x69, 0xb0, 0xca, 0x56, 0xb1, 0xc3, 0xe5, 0x92, 0x91, 0xa0, 0x96, 0x93, - 0x04, 0x69, 0xc8, 0x51, 0xc1, 0xae, 0xcf, 0x2f, 0xd8, 0x1d, 0xa8, 0x72, 0x61, 0xa3, 0x3a, 0xad, - 0xa6, 0x05, 0x8f, 0x64, 0xc3, 0x43, 0xb1, 0x6b, 0x30, 0xe9, 0x11, 0x0d, 0x04, 0x2f, 0xb0, 0x0e, - 0x4d, 0x6a, 0x1d, 0x82, 0x47, 0xaa, 0xaa, 0xf0, 0xb0, 0xcf, 0x64, 0x6b, 0x29, 0xaf, 0x6c, 0xd5, - 0x3c, 0x3c, 0xa4, 0xbf, 0xe2, 0x06, 0xaa, 0x95, 0x34, 0x50, 0x97, 0x21, 0x26, 0x69, 0x9d, 0xe5, - 0x54, 0xf9, 0xfb, 0x35, 0x05, 0x20, 0xdc, 0xf9, 0x19, 0x19, 0xb3, 0xd7, 0xa1, 0x26, 0xc4, 0x31, - 0x67, 0x80, 0x2f, 0x10, 0xe2, 0xb6, 0xb0, 0x18, 0xb3, 0x85, 0xea, 0x3f, 0x29, 0xd0, 0xdc, 0x24, - 0x34, 0xbf, 0xe3, 0x0c, 0xa9, 0xe5, 0x7e, 0x1e, 0x5a, 0x2e, 0x1e, 0x38, 0xae, 0xd1, 0xc7, 0xb6, - 0xef, 0x9a, 0x98, 0x65, 0x58, 0x4a, 0xda, 0x12, 0x6b, 0x7d, 0x9b, 0x35, 0x12, 0x30, 0x62, 0xdc, - 0x3c, 0x5f, 0x1f, 0x8d, 0xfb, 0x07, 0x44, 0x89, 0xb2, 0x53, 0x80, 0x25, 0xd1, 0x4a, 0x75, 0xe8, - 0xb3, 0xd0, 0x0c, 0xc1, 0x7c, 0x87, 0x8e, 0x5f, 0xd2, 0x1a, 0xa2, 0x6d, 0xd7, 0x41, 0x9f, 0x80, - 0x16, 0xdd, 0xf4, 0xbe, 0xe5, 0x0c, 0xfb, 0x24, 0x56, 0xe7, 0x46, 0xbd, 0x69, 0xf0, 0x69, 0x11, - 0x76, 0x8a, 0x42, 0x79, 0xe6, 0x47, 0x98, 0x9b, 0x75, 0x01, 0xb5, 0x63, 0x7e, 0x84, 0xd5, 0x6f, - 0x2a, 0xb0, 0xc4, 0xbd, 0x80, 0x1d, 0x71, 0xcc, 0x44, 0x13, 0xd1, 0x2c, 0x5b, 0x42, 0x7f, 0xa3, - 0xcf, 0x45, 0x53, 0x90, 0x97, 0x33, 0x04, 0x93, 0x76, 0x43, 0x3d, 0xd5, 0x88, 0x0b, 0x90, 0x27, - 0x4c, 0xff, 0x98, 0x50, 0x55, 0xf7, 0xf5, 0x7b, 0x8e, 0xc1, 0x72, 0xa2, 0x1d, 0xa8, 0xea, 0x86, - 0xe1, 0x62, 0xcf, 0xe3, 0x33, 0x09, 0x1e, 0xc9, 0x9b, 0x40, 0x57, 0x33, 0xdd, 0x15, 0x3c, 0xa2, - 0xcf, 0xc7, 0xce, 0x51, 0x1a, 0x3d, 0x75, 0xda, 0x4c, 0x79, 0x30, 0x19, 0x9e, 0xb5, 0xfc, 0x75, - 0x01, 0x5a, 0x9c, 0x93, 0x6f, 0x71, 0x63, 0x3d, 0x9d, 0xd1, 0x36, 0xa1, 0x79, 0x10, 0xca, 0xe2, - 0xf4, 0x24, 0x99, 0x2c, 0xb4, 0x11, 0xac, 0x59, 0x1c, 0x17, 0x75, 0x18, 0x4a, 0x0b, 0x3a, 0x0c, - 0xe5, 0xf9, 0xf5, 0x4a, 0xd2, 0x89, 0xac, 0xa4, 0x38, 0x91, 0xea, 0x57, 0xa1, 0x21, 0x75, 0x40, - 0x75, 0x27, 0xcb, 0x42, 0x71, 0xba, 0x05, 0x8f, 0xe8, 0x66, 0xe8, 0x3c, 0x31, 0x82, 0x3d, 0x93, - 0x3a, 0x9b, 0x98, 0xdf, 0xa4, 0xfe, 0xa7, 0x02, 0x15, 0xde, 0xf7, 0x45, 0x68, 0x70, 0x59, 0xa3, - 0x4e, 0x25, 0xeb, 0x1f, 0x78, 0x13, 0xf1, 0x2a, 0x4f, 0x4f, 0xd8, 0x9e, 0x86, 0x5a, 0x4c, 0xcc, - 0xaa, 0x5c, 0x61, 0x07, 0xaf, 0x24, 0xd9, 0x22, 0xaf, 0x88, 0x58, 0xa1, 0x35, 0x28, 0x5b, 0xce, - 0x50, 0x1c, 0x7f, 0xb1, 0x07, 0x32, 0xed, 0x11, 0x1e, 0x39, 0xee, 0x31, 0xc3, 0x61, 0xbe, 0x30, - 0xb0, 0x26, 0x2a, 0x8d, 0xff, 0xac, 0xd0, 0xd3, 0x08, 0x0d, 0x0f, 0x9c, 0x07, 0xd8, 0x3d, 0x3e, - 0x8d, 0x04, 0xee, 0x1b, 0x92, 0x4c, 0xe4, 0x0e, 0xf6, 0x04, 0x0a, 0x7a, 0x23, 0xdc, 0xab, 0x62, - 0x7a, 0x56, 0x47, 0xd6, 0xff, 0x9c, 0xa3, 0xc3, 0x3d, 0xfb, 0xae, 0x42, 0x13, 0xd2, 0xd1, 0x05, - 0x9d, 0xdc, 0x71, 0x39, 0x95, 0xa0, 0x48, 0xfd, 0x17, 0x05, 0x9e, 0xce, 0xa0, 0xf2, 0x5e, 0xef, - 0x09, 0xd1, 0xf9, 0x73, 0x50, 0x13, 0xd9, 0x85, 0x62, 0xce, 0xec, 0x82, 0xc0, 0x50, 0x7f, 0x8f, - 0x1d, 0x92, 0xa4, 0x90, 0x79, 0xaf, 0xf7, 0xd8, 0x08, 0x1d, 0xcf, 0x1a, 0x16, 0x53, 0xb2, 0x86, - 0xff, 0xa6, 0x40, 0x37, 0xcc, 0xd0, 0x79, 0xb7, 0x8e, 0x17, 0x3f, 0x61, 0x3b, 0x9d, 0xc0, 0xf8, - 0x75, 0x71, 0x04, 0x44, 0x14, 0x6a, 0xce, 0x90, 0x36, 0x38, 0x00, 0x1a, 0xd3, 0x23, 0x80, 0xe4, - 0xa2, 0x16, 0x93, 0xd4, 0xae, 0xc4, 0x02, 0xec, 0x18, 0x28, 0xdc, 0xe0, 0xbf, 0x63, 0x2c, 0x7b, - 0x3b, 0x9a, 0xa6, 0x7b, 0xf2, 0x64, 0x94, 0x0f, 0xa7, 0x0e, 0xf9, 0xe1, 0x54, 0x29, 0x76, 0x38, - 0xc5, 0xdb, 0x55, 0x87, 0xb2, 0x42, 0x62, 0x09, 0x8f, 0x8f, 0x68, 0xdf, 0x56, 0xa0, 0xc3, 0xc7, - 0x61, 0x55, 0x1c, 0xce, 0x68, 0x6c, 0x61, 0x1f, 0x1b, 0x4f, 0x22, 0xdf, 0xf3, 0xe7, 0x05, 0x68, - 0xcb, 0x1e, 0x12, 0x75, 0x72, 0x3e, 0x0d, 0x65, 0x9a, 0x56, 0xe3, 0xb3, 0xc8, 0xa1, 0x31, 0x18, - 0x3c, 0x31, 0xae, 0x34, 0x54, 0xd9, 0xf5, 0x02, 0x1f, 0x88, 0x3f, 0x86, 0xae, 0x5a, 0xf1, 0x24, - 0xae, 0xda, 0x39, 0xa8, 0x13, 0xe3, 0xe7, 0x4c, 0x48, 0xcf, 0xac, 0xa2, 0x20, 0x6c, 0x40, 0x6f, - 0x42, 0x85, 0x95, 0x6e, 0xf1, 0x23, 0xdc, 0x17, 0xe2, 0x9d, 0xf3, 0xc2, 0x2e, 0xe9, 0xb0, 0x85, - 0x36, 0x68, 0x1c, 0x8d, 0xec, 0xd6, 0xd8, 0x75, 0x86, 0xd4, 0xab, 0x23, 0x96, 0xb1, 0xac, 0x89, - 0x67, 0xe2, 0x77, 0x3a, 0xe3, 0xad, 0x4d, 0x6e, 0x15, 0xe9, 0x6f, 0xf5, 0x0e, 0xac, 0x87, 0x69, - 0x08, 0x36, 0xd1, 0x93, 0xb3, 0xbc, 0xfa, 0xa3, 0x02, 0xac, 0xee, 0x1c, 0xdb, 0x83, 0xb8, 0xf8, - 0xac, 0x43, 0x65, 0x6c, 0xe9, 0xe1, 0x71, 0x00, 0x7f, 0xa2, 0xa5, 0x19, 0x41, 0x8a, 0x81, 0x78, - 0x07, 0x8c, 0xd2, 0x0d, 0xd1, 0xb6, 0xeb, 0xcc, 0x74, 0xdd, 0x9e, 0x17, 0x99, 0x13, 0x6c, 0x30, - 0x3f, 0x84, 0x65, 0x2a, 0x97, 0x44, 0x2b, 0xf5, 0x43, 0xde, 0x04, 0xa0, 0xee, 0x5a, 0x7f, 0x3e, - 0x17, 0x8d, 0xe2, 0xdc, 0x21, 0x2e, 0x5a, 0xbc, 0x8a, 0xa4, 0x92, 0x3c, 0xb4, 0x78, 0x56, 0x52, - 0xd7, 0x7d, 0xd3, 0xe0, 0x74, 0x96, 0xa4, 0xd9, 0x40, 0xcf, 0xc1, 0x52, 0x28, 0xff, 0x04, 0xa6, - 0x96, 0x50, 0x0a, 0x86, 0xfa, 0xc3, 0x22, 0x74, 0xa4, 0x4d, 0xf9, 0xc9, 0xbb, 0xcb, 0x19, 0xa1, - 0x77, 0xf1, 0xd4, 0x42, 0xef, 0xd2, 0x69, 0xb8, 0xc8, 0xe5, 0xb4, 0x3c, 0xab, 0xc8, 0x53, 0x55, - 0xe6, 0xcc, 0x53, 0xc5, 0xb5, 0x75, 0x75, 0xb6, 0xb6, 0xae, 0x25, 0x1d, 0x9f, 0x6f, 0x16, 0xa1, - 0x15, 0x6e, 0xdd, 0xb6, 0xa5, 0xdb, 0x99, 0xbc, 0x7f, 0x1f, 0x5a, 0x5e, 0x64, 0x6b, 0xf9, 0x66, - 0xbd, 0x94, 0xae, 0x4f, 0x32, 0xf8, 0x41, 0x8b, 0x75, 0x82, 0xce, 0x53, 0x46, 0x77, 0x7d, 0x96, - 0xe7, 0x65, 0xee, 0x76, 0x9d, 0xa9, 0x2e, 0x73, 0x84, 0xd1, 0x8b, 0x80, 0xb8, 0xb6, 0xe9, 0x9b, - 0x76, 0xdf, 0xc3, 0x03, 0xc7, 0x36, 0x98, 0x1e, 0x2a, 0x6b, 0x6d, 0xfe, 0x66, 0xcb, 0xde, 0x61, - 0xed, 0xe8, 0xd3, 0x50, 0xf2, 0x8f, 0xc7, 0xcc, 0xf7, 0x6e, 0x65, 0x38, 0xa6, 0xe1, 0xcc, 0x76, - 0x8f, 0xc7, 0x58, 0xa3, 0x08, 0x41, 0x1d, 0xa3, 0xef, 0xea, 0xc1, 0x5e, 0x94, 0x34, 0xa9, 0x45, - 0x4e, 0x88, 0x54, 0xa3, 0x09, 0x11, 0x2a, 0xcf, 0x42, 0x42, 0x7c, 0xdf, 0xe2, 0x64, 0x96, 0xe4, - 0x66, 0xd7, 0xb7, 0xc8, 0x32, 0x7d, 0xc7, 0xd7, 0x2d, 0xa6, 0x15, 0xea, 0x5c, 0x8f, 0x92, 0x16, - 0x9a, 0x42, 0xf8, 0x8f, 0x02, 0xac, 0x24, 0x48, 0x96, 0xb9, 0x15, 0xd3, 0xb3, 0x75, 0xb3, 0x34, - 0xd0, 0x5b, 0xd0, 0xe0, 0x9c, 0x39, 0x17, 0x6f, 0x03, 0x43, 0xba, 0x33, 0x45, 0xe0, 0xca, 0xa7, - 0x26, 0x70, 0x95, 0x13, 0xe5, 0xba, 0xd2, 0xb7, 0x48, 0xfd, 0x7a, 0x01, 0xd6, 0xa2, 0x4c, 0xae, - 0x61, 0x6f, 0x62, 0x65, 0xd3, 0x77, 0x56, 0x72, 0x83, 0xdb, 0x92, 0xb8, 0x21, 0xe2, 0x16, 0xf3, - 0x56, 0xc2, 0x71, 0xbf, 0x9c, 0x4f, 0x44, 0x42, 0x47, 0x45, 0x5e, 0x4c, 0x29, 0xca, 0x6f, 0x27, - 0x65, 0x71, 0xf5, 0x77, 0x15, 0x38, 0x9b, 0x30, 0x9d, 0x8b, 0xb9, 0x5a, 0x1b, 0x50, 0x75, 0x29, - 0x25, 0x03, 0x5d, 0x70, 0x75, 0xc6, 0x74, 0x42, 0xda, 0x6b, 0x01, 0xa6, 0xba, 0x03, 0xeb, 0x81, - 0x4b, 0x16, 0x6e, 0xec, 0x5d, 0xec, 0xeb, 0x53, 0xf2, 0x05, 0x17, 0xa1, 0xc1, 0xe2, 0x49, 0x16, - 0x85, 0xb3, 0x03, 0x79, 0xd8, 0x17, 0xe9, 0x63, 0xf5, 0x7b, 0x05, 0x58, 0xa3, 0xbe, 0x4c, 0xfc, - 0x78, 0x34, 0xcf, 0x71, 0xbf, 0x2a, 0x4c, 0x27, 0x31, 0x93, 0x6c, 0x6d, 0x75, 0x2d, 0xd2, 0x86, - 0xde, 0x4b, 0xe6, 0x96, 0x33, 0xf2, 0x4b, 0x61, 0x8d, 0xc3, 0xa6, 0xee, 0xeb, 0xb4, 0xc4, 0x21, - 0x9e, 0x54, 0x0e, 0xbd, 0xa8, 0xd2, 0xc9, 0xbc, 0xa8, 0xab, 0xd0, 0x66, 0xa7, 0x34, 0x7d, 0x91, - 0xa8, 0xa0, 0x0c, 0x52, 0xd2, 0x96, 0x59, 0xfb, 0x6e, 0xd0, 0xac, 0xde, 0x83, 0xa7, 0x62, 0x84, - 0x59, 0x88, 0x07, 0xd4, 0x3f, 0x51, 0xc8, 0xfe, 0x45, 0xaa, 0xf1, 0x16, 0x09, 0x42, 0xce, 0x8b, - 0x43, 0x5c, 0xe2, 0x6d, 0xc4, 0x74, 0x9b, 0x81, 0xbe, 0x00, 0x75, 0x1b, 0x3f, 0xec, 0xcb, 0xfe, - 0x6c, 0xae, 0x38, 0xad, 0x66, 0xe3, 0x87, 0xf4, 0x97, 0xba, 0x0d, 0x67, 0x13, 0xd3, 0x5d, 0x8c, - 0x02, 0x7f, 0xab, 0xc0, 0xd3, 0x9b, 0xae, 0x33, 0xde, 0x33, 0x5d, 0x7f, 0xa2, 0x5b, 0xd1, 0x82, - 0x93, 0x13, 0x11, 0x21, 0x47, 0x05, 0xf0, 0xbb, 0x09, 0x25, 0x73, 0x3d, 0x55, 0xf6, 0x92, 0x13, - 0x4b, 0x28, 0x1b, 0xf5, 0x7f, 0x8a, 0x69, 0x0b, 0x08, 0x8c, 0xd0, 0x74, 0x07, 0x2e, 0x4f, 0xd0, - 0x98, 0x7a, 0x34, 0x54, 0x3c, 0xf9, 0xd1, 0x50, 0x86, 0xf5, 0x29, 0x9d, 0x9a, 0xf5, 0x39, 0x41, - 0x46, 0xf4, 0x6d, 0x88, 0x1e, 0xdf, 0x51, 0x1f, 0x62, 0xfe, 0x43, 0xbf, 0x37, 0x01, 0xc2, 0x13, - 0x2c, 0x5e, 0x5f, 0x3d, 0xb3, 0x0f, 0x09, 0x85, 0xec, 0x96, 0xb0, 0xf4, 0xdc, 0x13, 0x91, 0x4e, - 0x2a, 0x76, 0xa0, 0x9b, 0xc6, 0xa9, 0x8b, 0xf1, 0xff, 0x6f, 0x2a, 0x70, 0xe1, 0xfe, 0xd8, 0xd0, - 0x7d, 0x2c, 0x49, 0xd5, 0xe2, 0xa5, 0x6b, 0xa2, 0x76, 0xac, 0x30, 0xb5, 0x76, 0x4c, 0x1a, 0xd3, - 0xe3, 0xb5, 0x63, 0xea, 0x8f, 0xc5, 0x8c, 0x12, 0xe5, 0x9f, 0x8b, 0xcc, 0xa8, 0x0b, 0xb5, 0x07, - 0xbc, 0xc3, 0xe0, 0xde, 0x40, 0xf0, 0x1c, 0x39, 0x60, 0x2a, 0xce, 0x7b, 0xc0, 0xb4, 0x0d, 0xab, - 0xc9, 0xd2, 0xd8, 0x80, 0xa1, 0x67, 0xf6, 0x83, 0x12, 0x85, 0xaf, 0x9e, 0xfa, 0x3e, 0x3c, 0xad, - 0x61, 0x0f, 0xdb, 0x46, 0x84, 0x3c, 0x0b, 0x44, 0xca, 0x2e, 0x74, 0xd3, 0x3a, 0x5c, 0xcc, 0x7f, - 0x60, 0xca, 0xbe, 0xef, 0x92, 0x8e, 0x7d, 0x9e, 0xac, 0x21, 0xba, 0x85, 0x8e, 0xe4, 0xab, 0x1f, - 0x42, 0xf7, 0xae, 0xee, 0x1e, 0x05, 0xc1, 0xf9, 0x26, 0x3b, 0xba, 0x5c, 0x64, 0x07, 0x2f, 0x42, - 0x43, 0xae, 0xb0, 0x8a, 0x95, 0x56, 0x1b, 0x9e, 0x7a, 0x20, 0x0e, 0xf5, 0x35, 0x7c, 0x80, 0x5d, - 0x6c, 0x0f, 0xf0, 0x1d, 0x67, 0x70, 0x44, 0x3c, 0x45, 0x9f, 0xdd, 0x5e, 0xe1, 0x9e, 0x22, 0x7b, - 0x92, 0xee, 0x98, 0x14, 0x22, 0x77, 0x4c, 0x66, 0x5c, 0x21, 0x53, 0xff, 0xbb, 0x00, 0xeb, 0x6f, - 0x59, 0x3e, 0x76, 0x43, 0x93, 0x3e, 0x8f, 0x87, 0x12, 0x3a, 0x0c, 0x85, 0x93, 0x39, 0x0c, 0x39, - 0x32, 0xb5, 0x69, 0x2e, 0x4e, 0xe9, 0xc4, 0x2e, 0xce, 0x06, 0xc0, 0xd8, 0x75, 0xc6, 0xd8, 0xf5, - 0x4d, 0x1c, 0x28, 0xd8, 0x5c, 0xe5, 0xa0, 0x12, 0x9a, 0xa8, 0x0c, 0xab, 0x48, 0x95, 0x61, 0xe7, - 0xa0, 0x1e, 0x08, 0x21, 0x2b, 0x20, 0xac, 0x6b, 0x61, 0x83, 0xfa, 0x15, 0x68, 0xbf, 0x33, 0xd8, - 0x70, 0xec, 0x03, 0xd3, 0x1d, 0x05, 0x04, 0x4e, 0xe4, 0x34, 0x92, 0x14, 0x36, 0x12, 0xb9, 0x91, - 0x42, 0x22, 0x37, 0xa2, 0x1e, 0xc1, 0x8a, 0xd4, 0xf7, 0x62, 0x92, 0x70, 0x11, 0x1a, 0xc3, 0x41, - 0xff, 0xc0, 0xb4, 0x4d, 0x5a, 0x5a, 0x50, 0xa0, 0x09, 0x53, 0x18, 0x0e, 0x6e, 0xf3, 0x16, 0xf5, - 0xd7, 0x15, 0x78, 0x46, 0xc3, 0x63, 0xc7, 0xf5, 0x83, 0x33, 0xd1, 0x5d, 0xff, 0xae, 0x37, 0x5c, - 0x48, 0xc3, 0xde, 0x84, 0xd2, 0xc8, 0x1b, 0x66, 0x1e, 0x4e, 0x10, 0x3d, 0x13, 0x19, 0x4c, 0xa3, - 0xe0, 0xea, 0x5f, 0x29, 0xb0, 0x16, 0xa4, 0x6d, 0x23, 0xfe, 0x5e, 0x94, 0xe9, 0x95, 0x44, 0x01, - 0xde, 0x94, 0xfb, 0x6e, 0x67, 0xa1, 0x6a, 0xec, 0x33, 0x67, 0xa7, 0x48, 0x35, 0x6b, 0xc5, 0xd8, - 0xa7, 0x7e, 0xce, 0x0b, 0xb0, 0x2c, 0x6d, 0x16, 0x05, 0x60, 0x01, 0x91, 0x14, 0x75, 0xa7, 0xde, - 0x63, 0x2b, 0xa7, 0x1c, 0x29, 0x7f, 0x09, 0x3a, 0x9c, 0x33, 0xde, 0x1f, 0x63, 0x57, 0xa7, 0x9c, - 0x19, 0x4c, 0xfe, 0xf5, 0xe0, 0x5a, 0x83, 0x32, 0xe5, 0x02, 0x48, 0x3c, 0x5d, 0xcb, 0xef, 0x36, - 0xa8, 0xff, 0xa0, 0xc0, 0xa5, 0x78, 0xcf, 0xdb, 0x3c, 0x8d, 0x79, 0x0a, 0x97, 0x3c, 0x69, 0x16, - 0xb4, 0x10, 0x66, 0x41, 0x17, 0x4c, 0xe9, 0xca, 0x39, 0xd7, 0x52, 0x34, 0xe7, 0xaa, 0x7e, 0xa7, - 0x08, 0xed, 0x6d, 0x17, 0xb3, 0xfa, 0xab, 0x80, 0x36, 0xe7, 0xa0, 0x3e, 0xb0, 0x26, 0x9e, 0x8f, - 0x5d, 0xae, 0x8f, 0xea, 0x5a, 0xd8, 0x80, 0xd6, 0xa0, 0xfc, 0x81, 0x13, 0x16, 0x6c, 0xb2, 0x07, - 0x49, 0x63, 0x16, 0x23, 0x1a, 0x33, 0xcf, 0x25, 0xb5, 0xb8, 0x76, 0x2a, 0xa7, 0x68, 0xa7, 0x73, - 0x72, 0xcd, 0x6a, 0x85, 0xcb, 0xbd, 0x38, 0x3c, 0x0b, 0x15, 0x64, 0xf5, 0x64, 0x0a, 0xf2, 0x76, - 0x70, 0x69, 0xb1, 0x7f, 0x60, 0x5a, 0x38, 0x28, 0xe3, 0xc9, 0xbe, 0x2c, 0xc1, 0x08, 0x76, 0xdb, - 0xb4, 0xb0, 0xd6, 0x30, 0xc5, 0x6f, 0x7a, 0x5a, 0xea, 0x8c, 0x99, 0xf2, 0xac, 0xe7, 0x57, 0x7a, - 0x01, 0x8e, 0x7a, 0x13, 0x1a, 0xfa, 0xc4, 0x77, 0xb6, 0x36, 0x35, 0xdd, 0x1e, 0xd2, 0x43, 0xe4, - 0x7d, 0x3c, 0x34, 0xed, 0xe0, 0xc2, 0x20, 0x7d, 0x40, 0x6d, 0x28, 0x62, 0x3b, 0x50, 0x51, 0xe4, - 0xa7, 0xea, 0xc2, 0x5a, 0x64, 0x07, 0xf3, 0xf9, 0xf2, 0xb1, 0x74, 0x61, 0x21, 0xf5, 0x9a, 0x67, - 0x40, 0x63, 0x2e, 0xa7, 0xe2, 0x59, 0xfd, 0xa3, 0x12, 0x2c, 0xfd, 0xd4, 0xb3, 0xcd, 0x67, 0xa1, - 0x3c, 0x37, 0xbf, 0x30, 0x8c, 0x05, 0x39, 0x05, 0xb5, 0xa0, 0xe0, 0x7b, 0xb4, 0xca, 0xab, 0xa4, - 0x15, 0x7c, 0x62, 0x70, 0x9b, 0x8c, 0x73, 0xfa, 0x2e, 0x61, 0x1d, 0x5a, 0xe3, 0x95, 0x15, 0xd3, - 0x48, 0x2c, 0xa6, 0x45, 0xf8, 0x6d, 0x17, 0xda, 0x2e, 0xdb, 0xcc, 0xb0, 0xd2, 0xbd, 0x39, 0x25, - 0xd3, 0x93, 0xc6, 0x74, 0xda, 0xb2, 0x1b, 0x79, 0xf6, 0xd4, 0x01, 0x3c, 0xf5, 0xb3, 0x13, 0xec, - 0x1e, 0x3f, 0x4e, 0x3d, 0xa3, 0xfe, 0x6f, 0x01, 0xd6, 0xc4, 0xd5, 0x14, 0x36, 0x0c, 0xf5, 0x59, - 0xd1, 0x00, 0x5a, 0xa1, 0x65, 0xa7, 0x19, 0x52, 0xa6, 0xf1, 0x3f, 0x97, 0xba, 0xa2, 0xb4, 0x2e, - 0xc2, 0x46, 0x12, 0x54, 0xb1, 0xdb, 0x67, 0x4b, 0x63, 0xb9, 0x0d, 0x8d, 0x61, 0x35, 0x1c, 0x84, - 0x7e, 0x2f, 0x81, 0xd6, 0x77, 0x30, 0x4b, 0xfb, 0x85, 0x13, 0x8c, 0x44, 0x0c, 0xf1, 0x8e, 0xf9, - 0x11, 0xe6, 0x77, 0xdd, 0xc6, 0xf1, 0xf6, 0xee, 0x17, 0x00, 0x25, 0xa7, 0x25, 0xdf, 0x73, 0x2b, - 0xb2, 0x7b, 0x6e, 0x6b, 0xf2, 0x3d, 0xb7, 0xa2, 0x74, 0x8d, 0xad, 0xbb, 0x09, 0xeb, 0xe9, 0xc3, - 0xcd, 0xd3, 0x8b, 0xfa, 0x8d, 0x22, 0x2c, 0x87, 0xcc, 0xcd, 0x48, 0xbe, 0x09, 0x0d, 0x49, 0x99, - 0x72, 0xf3, 0x97, 0x4b, 0x36, 0x20, 0xd4, 0xa5, 0xe8, 0x19, 0xa8, 0x13, 0xf4, 0x80, 0x92, 0x0a, - 0xbb, 0xd5, 0x66, 0x61, 0x5a, 0x5e, 0x13, 0xcd, 0xaf, 0x17, 0x63, 0xf9, 0x75, 0x74, 0x0d, 0x56, - 0xd8, 0x6b, 0xb9, 0xda, 0x86, 0xe9, 0x90, 0x65, 0xfa, 0xe2, 0xae, 0x28, 0xb9, 0x41, 0x5f, 0x86, - 0xe6, 0xa1, 0x4e, 0x9c, 0xae, 0x3e, 0x8b, 0x3f, 0x99, 0xb3, 0x7a, 0x73, 0x0a, 0xc3, 0x8b, 0x95, - 0x5e, 0xff, 0x22, 0x45, 0xa4, 0xbf, 0xd9, 0x4e, 0x35, 0x0e, 0xc3, 0x96, 0xae, 0x09, 0xed, 0x38, - 0x40, 0xca, 0x4d, 0xc4, 0x37, 0xa3, 0x37, 0x11, 0xaf, 0xe6, 0xe6, 0x16, 0x79, 0x1b, 0x7e, 0xbf, - 0x00, 0xeb, 0x71, 0x21, 0x5b, 0xcc, 0x0f, 0x09, 0x05, 0xad, 0x10, 0xd1, 0xcc, 0xb9, 0x7c, 0x91, - 0x2d, 0x71, 0xd9, 0x9f, 0x7a, 0x22, 0x7b, 0xbd, 0xc0, 0x17, 0x59, 0x87, 0x8a, 0x8b, 0x75, 0x8f, - 0xdf, 0x20, 0xae, 0x6b, 0xfc, 0x89, 0x5e, 0x8d, 0xb7, 0x1c, 0x3f, 0xb8, 0x79, 0xc0, 0x1e, 0x48, - 0x14, 0xc1, 0x58, 0x80, 0x6e, 0x0c, 0x3b, 0x24, 0xf8, 0x44, 0x9e, 0x8d, 0xd1, 0x28, 0xeb, 0xd0, - 0x9f, 0xea, 0x2f, 0x03, 0xa2, 0x94, 0x79, 0x7c, 0xc6, 0xea, 0x1c, 0xd4, 0x3f, 0x24, 0x23, 0xec, - 0x58, 0x8e, 0xcf, 0x8b, 0x1f, 0xc2, 0x06, 0xf5, 0x5f, 0x15, 0x58, 0xe1, 0xbb, 0x26, 0xdd, 0xf6, - 0x98, 0x6e, 0x9a, 0x9f, 0x83, 0x25, 0x26, 0x09, 0xd8, 0x60, 0x1c, 0x5e, 0x90, 0x3f, 0xa2, 0x80, - 0x0d, 0xca, 0xe4, 0xaf, 0xc5, 0x2b, 0xb3, 0x4e, 0x7a, 0x05, 0x61, 0xfe, 0x8a, 0x42, 0xf5, 0x8f, - 0x0b, 0xb0, 0x1a, 0xa1, 0xea, 0xff, 0x7f, 0x66, 0xfb, 0x32, 0xac, 0x71, 0xad, 0x15, 0xd8, 0xbe, - 0x3e, 0xf1, 0xf6, 0x39, 0xdb, 0x4d, 0x1b, 0x5a, 0x2e, 0xf7, 0x40, 0xa6, 0xdc, 0xe4, 0x91, 0x36, - 0xb5, 0x0f, 0x2b, 0x9b, 0xae, 0x33, 0x7e, 0x7c, 0xc6, 0xef, 0x5b, 0x65, 0xa8, 0xb3, 0xde, 0xdf, - 0x75, 0xf6, 0x43, 0x5c, 0x45, 0xc6, 0x3d, 0xe9, 0x35, 0xab, 0x79, 0x22, 0xb2, 0x27, 0xed, 0x8e, - 0x9d, 0x67, 0xc7, 0xba, 0xce, 0xc4, 0x27, 0x31, 0x27, 0xbb, 0x44, 0x24, 0x55, 0xaf, 0x9c, 0x07, - 0x18, 0x58, 0x58, 0xb7, 0x27, 0x63, 0xf2, 0xba, 0xce, 0x5e, 0xf3, 0x96, 0x5d, 0x7a, 0xe7, 0x90, - 0xbb, 0x2e, 0xd8, 0xd8, 0x34, 0xbd, 0x23, 0x62, 0x1d, 0xa8, 0x87, 0x55, 0xd4, 0x92, 0x2f, 0xd0, - 0x1b, 0x01, 0x6b, 0x36, 0x28, 0x6b, 0xbe, 0x30, 0xc3, 0xbc, 0xbd, 0xeb, 0xec, 0x47, 0x82, 0xb2, - 0x90, 0x37, 0x9b, 0x11, 0xde, 0xa4, 0xd9, 0x0a, 0x56, 0xa5, 0xc4, 0x8e, 0xc8, 0x97, 0x58, 0x65, - 0x77, 0xd0, 0x48, 0x4f, 0xc9, 0x85, 0xdb, 0xd9, 0x5a, 0xc4, 0xed, 0x5c, 0x3e, 0x81, 0xdb, 0x19, - 0x3d, 0xbe, 0x6f, 0x33, 0xb6, 0x15, 0xc7, 0xf7, 0xea, 0xef, 0x14, 0x60, 0x49, 0x58, 0x20, 0x22, - 0x91, 0x19, 0xcc, 0x98, 0x25, 0xef, 0x79, 0x18, 0x32, 0xcc, 0xc1, 0x55, 0x22, 0x39, 0x38, 0xa1, - 0x2b, 0xaa, 0x8b, 0xe9, 0x8a, 0x5a, 0x64, 0x3f, 0xa2, 0x26, 0x08, 0x4e, 0x66, 0x82, 0xfe, 0xbd, - 0x00, 0xcd, 0x70, 0xe4, 0xbd, 0xde, 0x63, 0xa0, 0xca, 0xac, 0xdb, 0x90, 0x21, 0xd5, 0xca, 0xe9, - 0x54, 0xab, 0x2c, 0x46, 0xb5, 0xea, 0x74, 0x2e, 0xae, 0xa5, 0x70, 0x71, 0x94, 0xb4, 0xf5, 0x93, - 0x91, 0xf6, 0x6f, 0x14, 0x9e, 0xf2, 0xf3, 0x5d, 0x67, 0xa1, 0x43, 0xb8, 0xcf, 0x40, 0x95, 0xb4, - 0xeb, 0x3c, 0xb2, 0x6e, 0x25, 0xd1, 0xd8, 0x47, 0x2a, 0x06, 0x1b, 0x0c, 0x4a, 0x0b, 0xc0, 0xd1, - 0xeb, 0x50, 0x19, 0xeb, 0xae, 0x3e, 0xca, 0x2c, 0x90, 0x4e, 0x93, 0x28, 0x8e, 0x72, 0xed, 0xf3, - 0xe2, 0x12, 0xe8, 0xee, 0xf1, 0x18, 0xa3, 0x2a, 0x14, 0xef, 0xe1, 0x87, 0xed, 0x33, 0x08, 0xa0, - 0x72, 0xcf, 0x71, 0x47, 0xba, 0xd5, 0x56, 0x50, 0x03, 0xaa, 0xbc, 0x68, 0xb2, 0x5d, 0x40, 0x4b, - 0x50, 0xdf, 0x08, 0x4a, 0xc7, 0xda, 0xc5, 0x6b, 0x3d, 0x68, 0xca, 0xe5, 0x42, 0x04, 0xef, 0x0e, - 0x1e, 0xea, 0x83, 0xe3, 0xf6, 0x19, 0x54, 0x81, 0xc2, 0x9d, 0x97, 0xdb, 0x0a, 0xfd, 0xfb, 0x4a, - 0xbb, 0x40, 0xff, 0xf6, 0xda, 0xc5, 0x6b, 0x7f, 0xa0, 0xc0, 0x4a, 0x22, 0x5b, 0x84, 0x5a, 0x00, - 0xf7, 0xed, 0x60, 0x83, 0xda, 0x67, 0x50, 0x13, 0x6a, 0x41, 0xbd, 0x24, 0x9b, 0xc3, 0xae, 0x43, - 0xa1, 0xdb, 0x05, 0xd4, 0x86, 0x26, 0x43, 0x9c, 0x0c, 0x06, 0xd8, 0xf3, 0xda, 0x45, 0xd1, 0x72, - 0x5b, 0x37, 0xad, 0x89, 0x8b, 0xdb, 0x25, 0x32, 0xcf, 0x5d, 0x47, 0xc3, 0x16, 0xd6, 0x3d, 0xdc, - 0x2e, 0x23, 0x04, 0x2d, 0xfe, 0x10, 0x20, 0x55, 0xa4, 0xb6, 0x00, 0xad, 0x7a, 0xed, 0x2f, 0x14, - 0xb9, 0x42, 0x89, 0xd2, 0xe4, 0x2c, 0xac, 0xde, 0xb7, 0x0d, 0x7c, 0x60, 0xda, 0xd8, 0x08, 0x5f, - 0xb5, 0xcf, 0xa0, 0x55, 0x58, 0xbe, 0x8b, 0xdd, 0x21, 0x96, 0x1a, 0x0b, 0x68, 0x05, 0x96, 0xee, - 0x9a, 0x8f, 0xa4, 0xa6, 0x22, 0x5a, 0x83, 0xf6, 0x8e, 0x69, 0x0f, 0x2d, 0x19, 0xb0, 0x44, 0xb1, - 0x4d, 0xdb, 0x71, 0xa5, 0xc6, 0x32, 0x6d, 0xd4, 0x3f, 0x88, 0x34, 0x56, 0x50, 0x17, 0xd6, 0x29, - 0x71, 0x5f, 0xde, 0xc4, 0x84, 0x1a, 0xd2, 0xbb, 0xaa, 0x5a, 0xaa, 0x29, 0x6d, 0xe5, 0xda, 0xfd, - 0xc0, 0xc5, 0x93, 0x64, 0x04, 0xd5, 0xa0, 0x74, 0xcf, 0xb1, 0x09, 0x29, 0x1b, 0x50, 0xdd, 0xc6, - 0xb6, 0x61, 0xda, 0xc3, 0xb6, 0x42, 0xe8, 0xbc, 0x25, 0xb2, 0x85, 0xed, 0x02, 0xd9, 0x31, 0xb2, - 0x7c, 0xb2, 0x9b, 0xc1, 0xe6, 0xd2, 0x1a, 0xd5, 0x76, 0xe9, 0xda, 0x55, 0xa8, 0x0b, 0x7e, 0x43, - 0x65, 0x50, 0xfa, 0xed, 0x33, 0xa8, 0x0e, 0xe5, 0x6d, 0x7d, 0xe2, 0x91, 0x3d, 0x01, 0xa8, 0x68, - 0xd8, 0x9b, 0x8c, 0x70, 0xbb, 0xd0, 0xfb, 0xfe, 0x55, 0xa8, 0x93, 0x28, 0x6e, 0xc3, 0x71, 0x5c, - 0x03, 0x8d, 0x01, 0xd1, 0x4f, 0x5e, 0x8c, 0xc6, 0x8e, 0x2d, 0x3e, 0x9a, 0x83, 0x5e, 0x4e, 0xa4, - 0x7c, 0xd9, 0x63, 0x12, 0x94, 0x0b, 0x52, 0xf7, 0x72, 0x06, 0x46, 0x0c, 0x5c, 0x3d, 0x83, 0x3e, - 0xa4, 0x23, 0x12, 0xb9, 0xde, 0x35, 0x07, 0x47, 0xc1, 0x31, 0x59, 0x2f, 0xd3, 0x32, 0x25, 0x81, - 0x83, 0x31, 0x9f, 0xcf, 0x18, 0x93, 0x7d, 0x9f, 0x24, 0xf0, 0x34, 0xd5, 0x33, 0x68, 0x42, 0xf3, - 0xd2, 0xe1, 0xe9, 0x63, 0x30, 0xe8, 0xa7, 0xa6, 0x0d, 0x9a, 0x00, 0x9f, 0x7b, 0xd8, 0x6d, 0x28, - 0x53, 0x69, 0x44, 0xcf, 0x4e, 0xfb, 0x78, 0x1d, 0xeb, 0x54, 0x9d, 0xfd, 0x7d, 0x3b, 0xf5, 0x0c, - 0xb2, 0x61, 0x39, 0xf6, 0xa5, 0x2c, 0xf4, 0xc9, 0x54, 0xc4, 0xf4, 0x2f, 0x9f, 0x75, 0x5f, 0xcc, - 0x07, 0x2c, 0xc6, 0x3b, 0x82, 0x56, 0xf4, 0xa3, 0x19, 0xe8, 0x5a, 0xae, 0x0f, 0xf2, 0xb0, 0xd1, - 0x3e, 0x39, 0xc7, 0xc7, 0x7b, 0x28, 0x63, 0xb4, 0xe3, 0x5f, 0x6f, 0x42, 0x2f, 0xce, 0xe8, 0x22, - 0xca, 0x84, 0x2f, 0xe5, 0x84, 0x16, 0x43, 0xfe, 0x12, 0x65, 0x8c, 0xc4, 0xe7, 0x72, 0x92, 0xfc, - 0x1f, 0x74, 0x94, 0xf5, 0x2d, 0x9f, 0xee, 0x2b, 0x73, 0x60, 0x88, 0xe1, 0xbf, 0xc5, 0xee, 0xf0, - 0xa4, 0x7d, 0x70, 0x06, 0xbd, 0x9a, 0xd5, 0xe1, 0x94, 0xaf, 0xe5, 0x74, 0x3f, 0x35, 0x1f, 0x92, - 0x98, 0xc8, 0xd7, 0xd9, 0xdd, 0x9b, 0x94, 0x2f, 0xb6, 0xa0, 0x5e, 0x56, 0x97, 0xd9, 0x1f, 0xa4, - 0xe9, 0xbe, 0x3a, 0x17, 0x8e, 0x98, 0x85, 0x17, 0xff, 0x56, 0x56, 0x20, 0xa7, 0xaf, 0xe4, 0x60, - 0xa4, 0x93, 0x0a, 0x69, 0x1f, 0x96, 0x63, 0xd7, 0xa5, 0x33, 0x44, 0x2a, 0xfd, 0x52, 0x75, 0x77, - 0x7a, 0xdc, 0xca, 0x64, 0x36, 0x76, 0xdf, 0x06, 0x65, 0x0a, 0x46, 0xca, 0xad, 0x9c, 0xee, 0x8b, - 0xf9, 0x80, 0xc5, 0x82, 0x7c, 0x58, 0x89, 0xbd, 0xdc, 0xeb, 0xa1, 0x97, 0xe6, 0x18, 0x71, 0xaf, - 0xd7, 0xbd, 0x3e, 0xcf, 0x98, 0x7b, 0x3d, 0xf5, 0x0c, 0x7a, 0x48, 0xb5, 0x7a, 0xec, 0xc6, 0x06, - 0xca, 0xec, 0x27, 0xfd, 0x76, 0x4a, 0xf7, 0x46, 0x6e, 0x78, 0xb1, 0xdc, 0x8f, 0x60, 0x35, 0xe5, - 0x82, 0x0d, 0xba, 0x31, 0x83, 0x65, 0xe2, 0xf7, 0x8b, 0xba, 0x2f, 0xe7, 0x47, 0x90, 0xec, 0x4a, - 0x3b, 0x98, 0xdb, 0x5b, 0x96, 0xc5, 0x9c, 0xa3, 0xeb, 0xd9, 0xa6, 0x33, 0x02, 0x98, 0xb9, 0xe4, - 0x4c, 0x78, 0x31, 0xec, 0xaf, 0x00, 0xda, 0x39, 0x74, 0x1e, 0xd2, 0x13, 0xe6, 0xe1, 0x84, 0x1f, - 0x57, 0x4e, 0xb1, 0xa0, 0x49, 0xe0, 0x4c, 0x41, 0x9d, 0x8a, 0x23, 0x26, 0x30, 0x00, 0x78, 0x07, - 0xfb, 0x77, 0xb1, 0xef, 0x12, 0x0d, 0x71, 0x25, 0x7b, 0x05, 0x1c, 0x24, 0x18, 0xee, 0x6a, 0x0e, - 0x48, 0x99, 0xb8, 0x77, 0x75, 0x7b, 0xa2, 0x5b, 0xd2, 0xd7, 0x25, 0xb2, 0x88, 0x1b, 0x07, 0x9c, - 0x45, 0xdc, 0x24, 0xbc, 0x18, 0xf6, 0x17, 0x85, 0x43, 0x24, 0xd5, 0xc3, 0xce, 0x72, 0x88, 0x92, - 0xb7, 0x4e, 0x92, 0x06, 0x61, 0x0a, 0x86, 0x18, 0xfc, 0x1b, 0x0a, 0xbd, 0x2e, 0x16, 0x03, 0xf8, - 0x92, 0xe9, 0x1f, 0x6e, 0x5b, 0xba, 0xed, 0xe5, 0x9b, 0x06, 0x05, 0x9d, 0x6b, 0x1a, 0x1c, 0x43, - 0x4c, 0xe3, 0x10, 0x96, 0x22, 0xa5, 0xa0, 0x28, 0x3d, 0xd5, 0x9c, 0x56, 0x47, 0xdb, 0xbd, 0x96, - 0x07, 0x54, 0x8c, 0xf4, 0x01, 0x2c, 0x45, 0x2a, 0x06, 0x32, 0x46, 0x4a, 0xab, 0x2a, 0x48, 0x2a, - 0xc6, 0x98, 0xe4, 0xc4, 0x89, 0xfb, 0x10, 0x50, 0xb2, 0xc6, 0x0d, 0xe5, 0xad, 0x8e, 0x9c, 0xae, - 0xa2, 0xb2, 0x8b, 0xe7, 0x98, 0x05, 0x88, 0x55, 0x96, 0x66, 0x99, 0x98, 0xd4, 0x72, 0xd9, 0x0c, - 0x0b, 0x90, 0x51, 0xac, 0xaa, 0x9e, 0x41, 0x0e, 0x9c, 0xcd, 0x28, 0xbb, 0xcb, 0xf0, 0x2a, 0xa6, - 0x17, 0xe9, 0xcd, 0x36, 0x71, 0x62, 0xc0, 0x44, 0x55, 0xdd, 0xd4, 0x01, 0xb3, 0x6a, 0xf0, 0x66, - 0x0f, 0x38, 0x84, 0xd5, 0x94, 0x02, 0xb0, 0x0c, 0xa5, 0x9f, 0x5d, 0x2a, 0x36, 0x7b, 0xa0, 0x0f, - 0xa0, 0x7b, 0xcb, 0x75, 0x74, 0x63, 0xa0, 0x7b, 0x3e, 0x2d, 0xcb, 0x22, 0x81, 0x65, 0xe0, 0x4a, - 0x65, 0xf9, 0xde, 0xa9, 0xe5, 0x5b, 0xb3, 0xc7, 0x3a, 0x80, 0x06, 0x25, 0x05, 0xfb, 0x42, 0x27, - 0xca, 0x52, 0x96, 0x12, 0x4c, 0xa6, 0xcc, 0xa5, 0x81, 0x0a, 0xf6, 0xf8, 0x32, 0x34, 0x36, 0x68, - 0xed, 0xf7, 0x96, 0x6d, 0xe0, 0x47, 0x49, 0xf5, 0x4d, 0x3f, 0x44, 0x76, 0x5d, 0x02, 0xc9, 0xbd, - 0x82, 0x3d, 0x00, 0xba, 0x78, 0xd6, 0xf1, 0x0b, 0xe9, 0x1d, 0x87, 0x10, 0x73, 0xec, 0xc2, 0x12, - 0xf5, 0xa4, 0x0d, 0xfc, 0x88, 0x89, 0xcf, 0xb5, 0xf4, 0xae, 0x23, 0x40, 0x99, 0x51, 0x48, 0x2a, - 0xac, 0x64, 0x5c, 0xd7, 0x64, 0xc7, 0x52, 0x0c, 0xf9, 0x4a, 0x66, 0x37, 0x09, 0xd8, 0x60, 0xe4, - 0xde, 0x3c, 0x28, 0xb2, 0xf2, 0x0d, 0xe6, 0xb6, 0x45, 0xbf, 0x8f, 0x7a, 0x75, 0xfa, 0x02, 0x64, - 0x5f, 0xf1, 0x5a, 0x1e, 0x50, 0x31, 0xd2, 0x2e, 0xd4, 0xe9, 0x69, 0x03, 0xdd, 0xad, 0xcb, 0xe9, - 0xa8, 0x02, 0x60, 0x9e, 0xcd, 0xda, 0xc4, 0xde, 0xc0, 0x35, 0xf7, 0x39, 0x83, 0x65, 0x4c, 0x2a, - 0x02, 0x34, 0x63, 0xb3, 0x62, 0xb0, 0x62, 0x05, 0xc7, 0xd4, 0x58, 0x0b, 0x32, 0x72, 0x25, 0x77, - 0x63, 0xf6, 0x8e, 0x47, 0x15, 0xdc, 0xcb, 0xf9, 0x11, 0xc4, 0xd0, 0x1f, 0xb3, 0x2f, 0xfb, 0x52, - 0x80, 0x5b, 0x13, 0xd3, 0x32, 0x82, 0x44, 0x0d, 0xea, 0x4d, 0xef, 0x2d, 0x02, 0x3c, 0xc5, 0x11, - 0x9b, 0x82, 0x23, 0x26, 0x61, 0x40, 0xe3, 0x8e, 0xe9, 0x31, 0x18, 0xec, 0x65, 0x89, 0xb2, 0x04, - 0x92, 0xe9, 0x89, 0xa5, 0x40, 0x8a, 0x51, 0x7e, 0x81, 0x25, 0x97, 0x68, 0x3d, 0x23, 0x7a, 0x3e, - 0x33, 0xd9, 0x29, 0xd7, 0x52, 0x76, 0x2f, 0xcf, 0x02, 0x13, 0xbd, 0x9b, 0xb0, 0x96, 0x56, 0xbf, - 0x98, 0x11, 0x83, 0x4f, 0x29, 0x75, 0x9c, 0xcd, 0x9a, 0x3b, 0x7c, 0x21, 0xbe, 0xeb, 0x58, 0xd3, - 0x16, 0x22, 0x65, 0x88, 0x67, 0x77, 0x8a, 0xa1, 0xc6, 0x32, 0x7a, 0x7b, 0xbd, 0xa4, 0x33, 0x11, - 0x3b, 0x5f, 0xe1, 0x9d, 0x6e, 0xf1, 0xd6, 0xee, 0x0b, 0x33, 0xe1, 0x05, 0x99, 0xbe, 0x46, 0xc3, - 0x3a, 0xd6, 0x2c, 0x58, 0xed, 0x95, 0x69, 0x09, 0xac, 0x28, 0xec, 0x14, 0xa5, 0x94, 0x8d, 0x22, - 0x46, 0x77, 0x39, 0xa3, 0xd1, 0xf7, 0x29, 0x6e, 0x84, 0xe8, 0x44, 0x82, 0x8a, 0x2f, 0xf6, 0xc5, - 0x7c, 0x48, 0xc1, 0x98, 0xbd, 0x7f, 0x6c, 0x41, 0x2d, 0xd8, 0xe8, 0x27, 0x90, 0xa7, 0x7c, 0x42, - 0x49, 0xc3, 0x3e, 0x2c, 0xc7, 0x3e, 0xe0, 0x99, 0xe1, 0x66, 0xa4, 0x7f, 0xe6, 0x73, 0x36, 0xbf, - 0xfe, 0x3c, 0xff, 0x1f, 0x23, 0x22, 0x48, 0xbf, 0x9a, 0x9d, 0x7a, 0x8c, 0xc7, 0xe7, 0x33, 0x3b, - 0xff, 0xe9, 0x08, 0x4d, 0x35, 0x00, 0x29, 0x28, 0x7d, 0x2e, 0xc7, 0xdd, 0xc6, 0xd9, 0x94, 0xfb, - 0x30, 0x35, 0xee, 0xfc, 0xe4, 0xac, 0x0b, 0xa2, 0xb3, 0xe3, 0x84, 0xec, 0x68, 0xf3, 0xe7, 0xa0, - 0x29, 0x7f, 0xe3, 0x00, 0x65, 0xfc, 0x4b, 0x85, 0xe4, 0x67, 0x10, 0x66, 0xaf, 0xe6, 0x21, 0xa0, - 0xe4, 0xad, 0x90, 0x8c, 0x58, 0x2b, 0xf3, 0x3e, 0x4a, 0x46, 0xac, 0x95, 0x7d, 0xdd, 0x44, 0xe2, - 0xee, 0x19, 0xa1, 0x6b, 0xda, 0xbf, 0x6a, 0x99, 0xbd, 0xaa, 0x43, 0x58, 0xbf, 0xe7, 0xf8, 0xe6, - 0xc1, 0x71, 0xbc, 0xa4, 0x3b, 0x23, 0xbf, 0x96, 0x55, 0x53, 0x9e, 0x47, 0x8e, 0xce, 0x53, 0xe7, - 0x3d, 0xab, 0x76, 0x1c, 0xe5, 0x2b, 0x43, 0xef, 0xde, 0xcc, 0x35, 0xaf, 0x14, 0x85, 0xbf, 0x03, - 0x75, 0x71, 0x3c, 0x9f, 0x31, 0x58, 0xbc, 0x4a, 0x73, 0xf6, 0xaa, 0xde, 0x97, 0x4c, 0xa5, 0x3a, - 0xbb, 0x4e, 0x74, 0x76, 0x87, 0x47, 0xd0, 0x8a, 0xd6, 0xb2, 0x65, 0x9c, 0x4f, 0xa4, 0x56, 0x95, - 0x66, 0x9c, 0x4f, 0xa4, 0x17, 0xc7, 0xa9, 0x67, 0xd0, 0x3e, 0x34, 0xa4, 0x42, 0xa6, 0x64, 0x78, - 0x13, 0x62, 0x47, 0x87, 0xb9, 0x32, 0x1b, 0x50, 0x8c, 0x71, 0x1f, 0x20, 0x2c, 0x00, 0x42, 0x97, - 0x33, 0x73, 0x0d, 0xf3, 0xd1, 0xe9, 0xd6, 0xab, 0x5f, 0x79, 0x65, 0x68, 0xfa, 0x87, 0x93, 0x7d, - 0xf2, 0xe6, 0x06, 0x03, 0x7e, 0xc9, 0x74, 0xf8, 0xaf, 0x1b, 0x81, 0x6a, 0xbd, 0x41, 0xf1, 0x6f, - 0x90, 0x51, 0xc6, 0xfb, 0xfb, 0x15, 0xfa, 0xf4, 0xea, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x3b, - 0x40, 0xd6, 0x24, 0xd7, 0x6b, 0x00, 0x00, + // 6367 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0xd9, 0x8f, 0x24, 0xc9, + 0x59, 0xf8, 0x64, 0xdd, 0xf5, 0xd5, 0xd1, 0xd5, 0xd1, 0xbd, 0x3d, 0x35, 0xb5, 0x73, 0x6d, 0xee, + 0xee, 0xec, 0xcc, 0x78, 0x77, 0x8e, 0x5a, 0x8f, 0x8f, 0x5d, 0xef, 0x35, 0xdd, 0x3b, 0xeb, 0xde, + 0x9d, 0x99, 0xed, 0x5f, 0x76, 0x4f, 0xdb, 0x3f, 0x83, 0x5c, 0xca, 0xae, 0x8c, 0xae, 0xce, 0xed, + 0xaa, 0xcc, 0xda, 0xcc, 0xac, 0x99, 0xe9, 0xc5, 0x80, 0x30, 0x3e, 0x90, 0x65, 0x04, 0x32, 0x87, + 0xe1, 0x15, 0x24, 0x23, 0x21, 0x0e, 0x89, 0x07, 0xb0, 0x84, 0x40, 0x42, 0x20, 0x61, 0x09, 0x01, + 0x0f, 0xbc, 0x20, 0x9e, 0xe0, 0x01, 0xf9, 0x2f, 0xe0, 0xd9, 0x28, 0x8e, 0x8c, 0x8c, 0xbc, 0xaa, + 0xb2, 0xba, 0x7a, 0x3c, 0x42, 0x7e, 0xea, 0xca, 0xc8, 0xef, 0x8b, 0x88, 0xfc, 0xe2, 0xbb, 0xe3, + 0x8b, 0x68, 0x68, 0x19, 0xba, 0xa7, 0xf7, 0xfa, 0xb6, 0xed, 0x18, 0xd7, 0xc6, 0x8e, 0xed, 0xd9, + 0x68, 0x65, 0x64, 0x0e, 0x1f, 0x4e, 0x5c, 0xf6, 0xf4, 0xb0, 0x7b, 0x8d, 0x00, 0x74, 0xea, 0x7d, + 0x7b, 0x34, 0xb2, 0x2d, 0xd6, 0xd8, 0x69, 0x9a, 0x96, 0x87, 0x1d, 0x4b, 0x1f, 0xf2, 0xe7, 0xba, + 0x8c, 0xd2, 0xa9, 0xbb, 0xfd, 0x03, 0x3c, 0xd2, 0xf9, 0x53, 0x75, 0xe4, 0x0e, 0xf8, 0xcf, 0x65, + 0xd3, 0x32, 0xf0, 0x63, 0x79, 0x30, 0xb5, 0x0c, 0xc5, 0x77, 0x47, 0x63, 0xef, 0x48, 0xfd, 0x4b, + 0x05, 0xea, 0x77, 0x86, 0x13, 0xf7, 0x40, 0xc3, 0x1f, 0x4f, 0xb0, 0xeb, 0xa1, 0x2e, 0x14, 0xf6, + 0x74, 0x17, 0xb7, 0x95, 0x8b, 0xca, 0xe5, 0x5a, 0xf7, 0xfc, 0xb5, 0xc8, 0xac, 0xf8, 0x7c, 0xee, + 0xb9, 0x83, 0xdb, 0xba, 0x8b, 0x35, 0x0a, 0x8b, 0x10, 0x14, 0x8c, 0xbd, 0xcd, 0x8d, 0x76, 0xee, + 0xa2, 0x72, 0x39, 0xaf, 0xd1, 0xdf, 0xe8, 0x3c, 0x80, 0x8b, 0x07, 0x23, 0x6c, 0x79, 0x9b, 0x1b, + 0x6e, 0x3b, 0x7f, 0x31, 0x7f, 0x39, 0xaf, 0x49, 0x2d, 0x48, 0x85, 0x7a, 0xdf, 0x1e, 0x0e, 0x71, + 0xdf, 0x33, 0x6d, 0x6b, 0x73, 0xa3, 0x5d, 0xa0, 0xb8, 0xa1, 0x36, 0xd4, 0x81, 0x8a, 0xe9, 0x6e, + 0x8e, 0xc6, 0xb6, 0xe3, 0xb5, 0x8b, 0x17, 0x95, 0xcb, 0x15, 0x4d, 0x3c, 0xab, 0x3f, 0xcc, 0x43, + 0x83, 0x4f, 0xdc, 0x1d, 0xdb, 0x96, 0x8b, 0xd1, 0x2d, 0x28, 0xb9, 0x9e, 0xee, 0x4d, 0x5c, 0x3e, + 0xf7, 0x73, 0x29, 0x73, 0xdf, 0xa6, 0x40, 0x1a, 0x07, 0x4e, 0x9c, 0x7c, 0x74, 0x72, 0xf9, 0x84, + 0xc9, 0x85, 0x3f, 0xb0, 0x10, 0xfb, 0xc0, 0xcb, 0xb0, 0xb4, 0x4f, 0xe6, 0xb7, 0x1d, 0x00, 0x15, + 0x29, 0x50, 0xb4, 0x99, 0xf4, 0xe4, 0x99, 0x23, 0xfc, 0xe1, 0xfe, 0x36, 0xd6, 0x87, 0xed, 0x12, + 0x1d, 0x4b, 0x6a, 0x41, 0x67, 0xa0, 0x42, 0x51, 0x7a, 0x9e, 0xdb, 0x2e, 0x5f, 0x54, 0x2e, 0x17, + 0xb4, 0x32, 0x7d, 0xde, 0x71, 0xd1, 0x36, 0xd4, 0xfa, 0x07, 0xba, 0x65, 0xe1, 0x61, 0xaf, 0x3f, + 0x76, 0xdb, 0x95, 0x8b, 0xf9, 0xcb, 0xb5, 0x6e, 0xf7, 0x5a, 0x02, 0x2b, 0x5d, 0x0b, 0x11, 0xeb, + 0xda, 0x3a, 0xc3, 0x5a, 0x1f, 0xbb, 0xef, 0x5a, 0x9e, 0x73, 0xa4, 0x41, 0x5f, 0x34, 0x74, 0xbe, + 0x0a, 0x4b, 0x91, 0xd7, 0xa8, 0x05, 0xf9, 0x43, 0x7c, 0x44, 0x09, 0x5b, 0xd5, 0xc8, 0x4f, 0x74, + 0x0b, 0x8a, 0x0f, 0xf5, 0xe1, 0x04, 0x53, 0xba, 0xd5, 0xba, 0x17, 0xa2, 0x63, 0x12, 0xf6, 0xbb, + 0xe7, 0x0e, 0xb6, 0x6c, 0xd7, 0x24, 0x04, 0xd3, 0x18, 0xf4, 0x6b, 0xb9, 0xcf, 0x29, 0xea, 0xaf, + 0x28, 0xb0, 0x4a, 0x67, 0xc3, 0x47, 0x71, 0x17, 0xe1, 0x3d, 0x99, 0x38, 0xb9, 0x30, 0x71, 0x3a, + 0x50, 0xe1, 0x5f, 0xc5, 0x18, 0xb0, 0xaa, 0x89, 0x67, 0xf5, 0x3b, 0x39, 0x68, 0x89, 0x25, 0xf0, + 0xc7, 0x5f, 0x85, 0x62, 0xdf, 0x9e, 0x58, 0x1e, 0x9d, 0x40, 0x43, 0x63, 0x0f, 0xe8, 0x39, 0xa8, + 0xfb, 0x34, 0xb6, 0xf4, 0x11, 0xfb, 0xe0, 0xaa, 0xe6, 0xd3, 0xfd, 0xbe, 0x3e, 0xc2, 0x99, 0xf8, + 0xe5, 0x22, 0xd4, 0xc6, 0xba, 0xe3, 0x99, 0x21, 0x7e, 0x97, 0x9b, 0xa6, 0xb1, 0x3b, 0x19, 0xc1, + 0xa4, 0xbf, 0x76, 0x74, 0xf7, 0x70, 0x73, 0x83, 0x73, 0x49, 0xa8, 0x0d, 0x7d, 0x16, 0x8a, 0x43, + 0xfc, 0x10, 0x0f, 0x29, 0x93, 0x34, 0xbb, 0xcf, 0x25, 0xb2, 0x01, 0xff, 0xe8, 0xbb, 0x04, 0x50, + 0x63, 0xf0, 0xea, 0x1f, 0x28, 0xb0, 0xf6, 0x8e, 0xeb, 0x9a, 0x03, 0x2b, 0x46, 0x92, 0x35, 0x28, + 0x59, 0xb6, 0x81, 0x37, 0x37, 0x28, 0x4d, 0xf2, 0x1a, 0x7f, 0x42, 0xcf, 0x42, 0x75, 0x8c, 0xb1, + 0xd3, 0x73, 0xec, 0xa1, 0x4f, 0x91, 0x0a, 0x69, 0xd0, 0xec, 0x21, 0x46, 0xdb, 0xb0, 0xec, 0x46, + 0x3a, 0x62, 0x2b, 0x50, 0xeb, 0xbe, 0x38, 0x6d, 0x52, 0x02, 0x5a, 0x8b, 0xe3, 0xab, 0x5f, 0xcf, + 0xc1, 0x8a, 0x80, 0x63, 0xb3, 0x25, 0xbf, 0xc9, 0xa2, 0xb9, 0x78, 0x20, 0x26, 0xc8, 0x1e, 0xb2, + 0x2c, 0x9a, 0x58, 0xed, 0xbc, 0xbc, 0xda, 0x59, 0xf4, 0x52, 0x64, 0x29, 0x8b, 0xf1, 0xa5, 0xbc, + 0x00, 0x35, 0xfc, 0x78, 0x6c, 0x3a, 0xb8, 0x47, 0xe4, 0x98, 0xae, 0x56, 0x41, 0x03, 0xd6, 0xb4, + 0x63, 0x8e, 0x64, 0x65, 0x55, 0x9e, 0x43, 0x59, 0xa9, 0x3f, 0x50, 0xe0, 0x74, 0x6c, 0xa5, 0xb8, + 0xfe, 0xdb, 0x81, 0x16, 0xfd, 0xf6, 0x80, 0x36, 0x44, 0x13, 0x12, 0xa2, 0x5f, 0x9e, 0x4e, 0xf4, + 0x00, 0x41, 0x8b, 0xf5, 0x20, 0x4d, 0x34, 0x37, 0xcf, 0x44, 0x47, 0x70, 0xfa, 0x3d, 0xec, 0xf1, + 0x21, 0xc8, 0x3b, 0xbc, 0x90, 0x94, 0x87, 0x95, 0x6d, 0x2e, 0xaa, 0x6c, 0xd5, 0x3f, 0x0b, 0xc4, + 0x99, 0x0e, 0xb6, 0x69, 0xed, 0xdb, 0xe8, 0x2c, 0x54, 0x05, 0x08, 0xe7, 0x8e, 0xa0, 0x01, 0x7d, + 0x1e, 0x8a, 0x64, 0xae, 0x8c, 0x35, 0x9a, 0xdd, 0xe7, 0xd3, 0xbe, 0x4b, 0xea, 0x55, 0x63, 0x18, + 0xe8, 0x0e, 0x34, 0x5d, 0x4f, 0x77, 0xbc, 0xde, 0x98, 0x6b, 0x37, 0xca, 0x42, 0x19, 0x94, 0x60, + 0x83, 0xa2, 0xf9, 0x8f, 0xe8, 0x36, 0xd4, 0xb1, 0x65, 0x04, 0xbd, 0x14, 0xb2, 0xf5, 0x52, 0xc3, + 0x96, 0x21, 0xfa, 0x08, 0xd6, 0xa7, 0x38, 0xcf, 0xfa, 0xfc, 0xa6, 0x02, 0xed, 0xf8, 0x02, 0x2d, + 0x66, 0x49, 0xdf, 0x60, 0x68, 0x98, 0x2d, 0xd0, 0x0c, 0x59, 0x17, 0xcb, 0xa4, 0x71, 0x24, 0xf5, + 0xfb, 0x0a, 0x3c, 0x13, 0x4c, 0x89, 0xbe, 0x7a, 0x72, 0x1c, 0x83, 0xae, 0x42, 0xcb, 0xb4, 0xfa, + 0xc3, 0x89, 0x81, 0x1f, 0x58, 0x5f, 0xc4, 0xfa, 0xd0, 0x3b, 0x38, 0xa2, 0xab, 0x58, 0xd1, 0x62, + 0xed, 0xea, 0x7f, 0xe5, 0x60, 0x2d, 0x3a, 0xb3, 0xc5, 0x48, 0xf5, 0x19, 0x28, 0x9a, 0xd6, 0xbe, + 0xed, 0x53, 0xea, 0xe2, 0x54, 0x01, 0x25, 0xe3, 0x31, 0x70, 0xf4, 0x31, 0x20, 0x61, 0xef, 0x0f, + 0x70, 0xff, 0x70, 0x6c, 0x9b, 0x54, 0x81, 0x91, 0x4e, 0x6e, 0x27, 0x76, 0x92, 0x3c, 0x6f, 0x61, + 0xff, 0x45, 0x27, 0xcc, 0x0d, 0x58, 0xee, 0x47, 0xdb, 0x3b, 0x18, 0xd6, 0x92, 0x81, 0x4f, 0xd6, + 0x29, 0xb0, 0xe1, 0xd9, 0xf7, 0xb0, 0xb7, 0x69, 0xb9, 0xd8, 0xf1, 0x6e, 0x9b, 0xd6, 0xd0, 0x1e, + 0x6c, 0xe9, 0xde, 0xc1, 0x42, 0x4a, 0x23, 0x24, 0xff, 0xb9, 0x88, 0xfc, 0xab, 0x7f, 0xa2, 0xc0, + 0xd9, 0xe4, 0x11, 0xf9, 0xd2, 0x76, 0xa0, 0xb2, 0x6f, 0xe2, 0xa1, 0x41, 0xf8, 0x47, 0xa1, 0xfc, + 0x23, 0x9e, 0x89, 0xf2, 0x18, 0x13, 0x60, 0xbe, 0x7e, 0x31, 0xe5, 0x21, 0x1c, 0xf5, 0x6d, 0xcf, + 0x31, 0xad, 0xc1, 0x5d, 0xd3, 0xf5, 0x34, 0x86, 0x21, 0x71, 0x4c, 0x7e, 0x1e, 0x81, 0xfd, 0xae, + 0x02, 0xe7, 0xdf, 0xc3, 0xde, 0xba, 0xb0, 0x43, 0xe4, 0xbd, 0xe9, 0x7a, 0x66, 0xdf, 0x3d, 0x69, + 0xd7, 0x3d, 0x83, 0x37, 0xa3, 0xfe, 0x96, 0x02, 0x17, 0x52, 0xa7, 0xc3, 0x09, 0xc8, 0x35, 0xac, + 0x6f, 0x85, 0xd2, 0x34, 0xec, 0x07, 0xf8, 0x68, 0x97, 0xb0, 0xc1, 0x96, 0x6e, 0x3a, 0x4c, 0xc3, + 0x1e, 0xdb, 0xea, 0xfc, 0xb9, 0x02, 0xe7, 0xde, 0xc3, 0xde, 0x96, 0x6f, 0x89, 0x9f, 0x2a, 0x8d, + 0x08, 0x8c, 0xe4, 0x13, 0xf8, 0x31, 0x42, 0xa8, 0x4d, 0xfd, 0x1e, 0x5b, 0xd6, 0xc4, 0x19, 0x3f, + 0x35, 0x32, 0x9e, 0xa7, 0x92, 0x21, 0xa9, 0x0d, 0xae, 0x00, 0x38, 0x11, 0xd5, 0x6f, 0x97, 0xa1, + 0xbe, 0xcb, 0x35, 0x05, 0xb5, 0xb4, 0x51, 0x6a, 0x28, 0xc9, 0x4e, 0x93, 0xe4, 0x7d, 0x25, 0x39, + 0x64, 0x1b, 0xd0, 0x70, 0x31, 0x3e, 0x9c, 0xdb, 0xaa, 0xd6, 0x09, 0x96, 0x30, 0x88, 0xf7, 0x61, + 0x79, 0x62, 0xd1, 0x10, 0x00, 0x1b, 0xfc, 0x13, 0x18, 0xe9, 0xb3, 0xa8, 0xd9, 0x38, 0x2a, 0x7a, + 0x9f, 0xc7, 0x71, 0x52, 0x6f, 0xc5, 0x8c, 0xbd, 0x45, 0x11, 0xd1, 0x07, 0xd0, 0x32, 0x1c, 0x7b, + 0x3c, 0xc6, 0x46, 0xcf, 0xf5, 0x3b, 0x2b, 0x65, 0xed, 0x8c, 0x63, 0x8a, 0xce, 0x6e, 0xc0, 0x4a, + 0x74, 0xb6, 0x9b, 0x06, 0xf1, 0x27, 0x09, 0x97, 0x25, 0xbd, 0x42, 0x2f, 0xc3, 0x72, 0x1c, 0xbe, + 0x42, 0xe1, 0xe3, 0x2f, 0xd0, 0x2b, 0x80, 0x22, 0x93, 0x25, 0xe0, 0x55, 0x06, 0x1e, 0x9e, 0x0c, + 0x07, 0xa7, 0x79, 0x86, 0x30, 0x38, 0x30, 0x70, 0xfe, 0x46, 0x02, 0xff, 0x80, 0xd8, 0xdf, 0x10, + 0xb8, 0xdb, 0xae, 0x65, 0x25, 0x45, 0xb8, 0x3b, 0x17, 0xbd, 0x0a, 0x6b, 0x34, 0x92, 0xe9, 0x7d, + 0x82, 0x1d, 0xdb, 0xef, 0xaf, 0x67, 0x1a, 0x6e, 0xbb, 0xce, 0xa8, 0x41, 0xdf, 0x7e, 0x05, 0x3b, + 0xb6, 0x34, 0x83, 0x47, 0xd0, 0x16, 0xa2, 0xd8, 0xa3, 0xf2, 0xd2, 0x7b, 0x88, 0x1d, 0xd7, 0xb4, + 0x2d, 0xb7, 0xdd, 0xa0, 0x33, 0x79, 0x23, 0x71, 0x26, 0x32, 0xe7, 0x5f, 0x0b, 0x09, 0xae, 0xbb, + 0xcb, 0xf1, 0x99, 0x31, 0x5d, 0x1b, 0x27, 0xbe, 0xec, 0x6c, 0xc2, 0xb3, 0x53, 0xd0, 0x64, 0xb3, + 0x9a, 0x67, 0x66, 0x75, 0x55, 0x36, 0xab, 0x79, 0xd9, 0x6a, 0xfe, 0xba, 0x02, 0x6b, 0x5f, 0xd2, + 0xbd, 0xfe, 0xc1, 0xc6, 0xe8, 0x24, 0x82, 0xe9, 0xb7, 0xa0, 0xfa, 0x50, 0x84, 0xcc, 0xcc, 0xb4, + 0x3d, 0x37, 0x93, 0x06, 0x5a, 0x80, 0xa3, 0xfe, 0x83, 0x1f, 0xda, 0xfb, 0x4b, 0xf3, 0x34, 0xf4, + 0xee, 0xac, 0xcc, 0x4c, 0x44, 0x13, 0x15, 0x63, 0x9a, 0x48, 0xfd, 0x1a, 0x00, 0xff, 0x80, 0x7b, + 0xee, 0xe0, 0x58, 0x73, 0x7f, 0x0d, 0xca, 0x7c, 0x44, 0xae, 0x7a, 0x67, 0x73, 0xb5, 0x8f, 0xa0, + 0xfe, 0xb8, 0x02, 0x35, 0xe9, 0x05, 0x6a, 0x42, 0x4e, 0xe8, 0xd4, 0x5c, 0x02, 0x0d, 0x72, 0xb3, + 0x43, 0xd4, 0x7c, 0x3c, 0x44, 0x7d, 0x11, 0x9a, 0x26, 0xf5, 0x7d, 0x7a, 0xfc, 0xcb, 0x69, 0xf8, + 0x51, 0xd5, 0x1a, 0xac, 0x95, 0xb3, 0x13, 0x3a, 0x0f, 0x35, 0x6b, 0x32, 0xea, 0xd9, 0xfb, 0x3d, + 0xc7, 0x7e, 0xe4, 0xf2, 0x58, 0xb7, 0x6a, 0x4d, 0x46, 0x1f, 0xee, 0x6b, 0xf6, 0x23, 0x37, 0x08, + 0xa3, 0x4a, 0x73, 0x87, 0x51, 0xe7, 0xa1, 0x36, 0xd2, 0x1f, 0x93, 0x7e, 0x7b, 0xd6, 0x64, 0x44, + 0x03, 0xe1, 0xbc, 0x56, 0x1d, 0xe9, 0x8f, 0x35, 0xfb, 0xd1, 0xfd, 0xc9, 0x08, 0x5d, 0x86, 0xd6, + 0x50, 0x77, 0xbd, 0x9e, 0x1c, 0x49, 0x57, 0x68, 0x24, 0xdd, 0x24, 0xed, 0xef, 0x06, 0xd1, 0x74, + 0x3c, 0x20, 0xab, 0x1e, 0x37, 0x20, 0x33, 0x46, 0xc3, 0xa0, 0x17, 0xc8, 0x18, 0x90, 0x19, 0xa3, + 0xa1, 0xe8, 0xe3, 0x35, 0x28, 0xef, 0x51, 0x6f, 0x72, 0xba, 0x3e, 0xbb, 0x43, 0x5c, 0x49, 0xe6, + 0x76, 0x6a, 0x3e, 0x02, 0x7a, 0x13, 0xaa, 0x54, 0x11, 0x51, 0xec, 0x7a, 0x46, 0xec, 0x00, 0x85, + 0xe0, 0x1b, 0x78, 0xe8, 0xe9, 0x14, 0xbf, 0x91, 0x15, 0x5f, 0xa0, 0x10, 0x93, 0xd2, 0x77, 0xb0, + 0xee, 0x61, 0xe3, 0xf6, 0xd1, 0xba, 0x3d, 0x1a, 0xeb, 0x94, 0x9d, 0xda, 0x4d, 0x1a, 0x17, 0x25, + 0xbd, 0x42, 0x97, 0xa0, 0xd9, 0x17, 0x4f, 0x77, 0x1c, 0x7b, 0xd4, 0x5e, 0xa2, 0xf2, 0x16, 0x69, + 0x45, 0xe7, 0x00, 0x7c, 0x63, 0xa2, 0x7b, 0xed, 0x16, 0x5d, 0xc5, 0x2a, 0x6f, 0x79, 0x87, 0xe6, + 0xd8, 0x4c, 0xb7, 0xc7, 0xb2, 0x59, 0xa6, 0x35, 0x68, 0x2f, 0xd3, 0x11, 0x6b, 0x7e, 0xfa, 0xcb, + 0xb4, 0x06, 0xe8, 0x34, 0x94, 0x4d, 0xb7, 0xb7, 0xaf, 0x1f, 0xe2, 0x36, 0xa2, 0x6f, 0x4b, 0xa6, + 0x7b, 0x47, 0x3f, 0xa4, 0x6e, 0x3e, 0x1f, 0x0c, 0x1b, 0xed, 0x15, 0xfa, 0x2a, 0x68, 0x08, 0x92, + 0x62, 0xab, 0xf3, 0x25, 0xc5, 0xd0, 0x4b, 0xb0, 0xe4, 0x7a, 0xb6, 0xa3, 0x0f, 0xb0, 0x6f, 0x16, + 0xda, 0xcf, 0x50, 0x0e, 0x6d, 0xf2, 0x66, 0xae, 0xb5, 0xd1, 0x67, 0xe0, 0x74, 0x8a, 0x1d, 0x69, + 0xaf, 0x51, 0x84, 0x67, 0x12, 0xed, 0x00, 0x7a, 0x1b, 0x80, 0xb2, 0x37, 0x9b, 0xde, 0xe9, 0xac, + 0xd3, 0xab, 0x12, 0x24, 0xfa, 0x13, 0xbd, 0x05, 0x67, 0x69, 0x0f, 0x69, 0xc3, 0xb7, 0xe9, 0xf0, + 0x67, 0x08, 0x4c, 0xa2, 0xc1, 0x51, 0xbf, 0x06, 0xab, 0x81, 0x60, 0x4a, 0x72, 0x10, 0x97, 0x27, + 0xe5, 0x58, 0xf2, 0x34, 0x3d, 0x02, 0xfb, 0x49, 0x11, 0xd6, 0xb6, 0xf5, 0x87, 0xf8, 0xa7, 0x11, + 0xee, 0x65, 0x32, 0x1c, 0xf7, 0x61, 0x99, 0x46, 0x78, 0x5d, 0x69, 0x46, 0x53, 0x5d, 0x47, 0x59, + 0x8c, 0xe2, 0xa8, 0xe8, 0x1d, 0x62, 0x68, 0x70, 0xff, 0x70, 0x8b, 0xc4, 0xcc, 0xbe, 0xdb, 0x78, + 0x21, 0xb1, 0xa7, 0x75, 0x01, 0xa7, 0xc9, 0x38, 0x48, 0x23, 0x5c, 0x28, 0xaf, 0x84, 0xef, 0x30, + 0x5e, 0x99, 0x91, 0x5c, 0x09, 0x56, 0x41, 0x6b, 0x86, 0x16, 0xc5, 0x45, 0x6d, 0x28, 0x73, 0x6f, + 0x8f, 0xea, 0xdc, 0x8a, 0xe6, 0x3f, 0x22, 0x0d, 0x56, 0xd8, 0x57, 0x6c, 0x73, 0x95, 0xc2, 0x48, + 0x50, 0xc9, 0x48, 0x82, 0x24, 0xe4, 0xb0, 0x4e, 0xaa, 0xce, 0xaf, 0x93, 0xda, 0x50, 0xe6, 0x7a, + 0x82, 0xaa, 0xe3, 0x8a, 0xe6, 0x3f, 0x92, 0x05, 0x0f, 0x34, 0x46, 0x8d, 0x09, 0xbe, 0x68, 0x20, + 0x78, 0xbe, 0x61, 0xab, 0x53, 0xc3, 0xe6, 0x3f, 0x52, 0x2d, 0x8b, 0x07, 0x5c, 0xee, 0x1a, 0x59, + 0xe5, 0xae, 0xe2, 0xe2, 0x01, 0x13, 0xbb, 0x88, 0x6d, 0x6d, 0xc6, 0x6d, 0xeb, 0x25, 0x88, 0x28, + 0x89, 0xf6, 0x52, 0x92, 0xea, 0x50, 0xbf, 0xad, 0x00, 0x04, 0x2b, 0x3f, 0x23, 0x61, 0xf9, 0x3a, + 0x54, 0x84, 0x38, 0x66, 0xcc, 0xaf, 0x08, 0x84, 0xa8, 0x19, 0xcf, 0x47, 0xcc, 0xb8, 0xfa, 0x4f, + 0x0a, 0xd4, 0x37, 0x08, 0xcd, 0xef, 0xda, 0x03, 0xea, 0x74, 0xbc, 0x08, 0x4d, 0x07, 0xf7, 0x6d, + 0xc7, 0xe8, 0x61, 0xcb, 0x73, 0x4c, 0xcc, 0x12, 0x5c, 0x05, 0xad, 0xc1, 0x5a, 0xdf, 0x65, 0x8d, + 0x04, 0x8c, 0xd8, 0x65, 0xd7, 0xd3, 0x47, 0xe3, 0xde, 0x3e, 0xd1, 0xff, 0x6c, 0x13, 0xa6, 0x21, + 0x5a, 0xa9, 0xfa, 0x7f, 0x0e, 0xea, 0x01, 0x98, 0x67, 0xd3, 0xf1, 0x0b, 0x5a, 0x4d, 0xb4, 0xed, + 0xd8, 0xe8, 0x05, 0x68, 0xd2, 0x45, 0xef, 0x0d, 0xed, 0x41, 0x6f, 0xac, 0x7b, 0x07, 0xdc, 0x1f, + 0xa9, 0x1b, 0x7c, 0x5a, 0x84, 0x9d, 0xc2, 0x50, 0xae, 0xf9, 0x09, 0xe6, 0x1e, 0x89, 0x80, 0xda, + 0x36, 0x3f, 0xc1, 0xea, 0x37, 0x15, 0x68, 0x70, 0x07, 0x66, 0x5b, 0xec, 0xf2, 0xd1, 0x7d, 0x00, + 0x96, 0xac, 0xa2, 0xbf, 0xd1, 0x17, 0xc2, 0x19, 0xe0, 0x4b, 0x29, 0x82, 0x49, 0xbb, 0xa1, 0x4e, + 0x76, 0xc8, 0x7b, 0xc9, 0x92, 0x25, 0xf9, 0x3a, 0xa1, 0xaa, 0xee, 0xe9, 0xf7, 0x6d, 0x83, 0xa5, + 0xa4, 0xdb, 0x50, 0xd6, 0x0d, 0xc3, 0xc1, 0xae, 0xcb, 0x67, 0xe2, 0x3f, 0x92, 0x37, 0xbe, 0xda, + 0x66, 0xba, 0xcb, 0x7f, 0x44, 0x6f, 0x46, 0xb6, 0xb1, 0x6a, 0x5d, 0x75, 0xda, 0x4c, 0x79, 0x2c, + 0x1f, 0x6c, 0x75, 0xfd, 0x75, 0x0e, 0x9a, 0x9c, 0x93, 0x6f, 0x73, 0x3f, 0x63, 0x3a, 0xa3, 0x6d, + 0x40, 0x7d, 0x3f, 0x90, 0xc5, 0xe9, 0x39, 0x4a, 0x59, 0x68, 0x43, 0x58, 0xb3, 0x38, 0x2e, 0xec, + 0xeb, 0x14, 0x16, 0xf4, 0x75, 0x8a, 0xf3, 0xeb, 0x95, 0xb8, 0xff, 0x5b, 0x4a, 0xf0, 0x7f, 0xd5, + 0xaf, 0x42, 0x4d, 0xea, 0x80, 0xea, 0x4e, 0x96, 0x04, 0xe4, 0x74, 0xf3, 0x1f, 0xd1, 0xad, 0xc0, + 0xef, 0x63, 0x04, 0x7b, 0x36, 0x71, 0x36, 0x11, 0x97, 0x4f, 0xfd, 0x4f, 0x05, 0x4a, 0xbc, 0xef, + 0x0b, 0x50, 0xe3, 0xb2, 0x46, 0xfd, 0x61, 0xd6, 0x3f, 0xf0, 0x26, 0xe2, 0x10, 0x9f, 0x9c, 0xb0, + 0x9d, 0x81, 0x4a, 0x44, 0xcc, 0xca, 0x5c, 0x61, 0xfb, 0xaf, 0x24, 0xd9, 0x22, 0xaf, 0x88, 0x58, + 0x91, 0x38, 0x74, 0x68, 0x0f, 0xc4, 0xee, 0x23, 0x7b, 0x20, 0xd3, 0x1e, 0xe1, 0x91, 0xed, 0x1c, + 0x31, 0x1c, 0xe6, 0xc6, 0x03, 0x6b, 0xa2, 0xd2, 0xf8, 0x2f, 0x0a, 0xdd, 0x0c, 0xd2, 0x70, 0xdf, + 0x7e, 0x88, 0x9d, 0xa3, 0x93, 0xc8, 0x9f, 0xbf, 0x21, 0xc9, 0x44, 0xe6, 0x38, 0x55, 0xa0, 0xa0, + 0x37, 0x82, 0xb5, 0xca, 0x27, 0x27, 0xd5, 0x64, 0xfd, 0xcf, 0x39, 0x3a, 0x58, 0xb3, 0xef, 0x29, + 0x74, 0x3f, 0x20, 0xfc, 0x41, 0xc7, 0x77, 0x5c, 0x4e, 0x24, 0x9e, 0x53, 0xff, 0x55, 0x81, 0x33, + 0x29, 0x54, 0xde, 0xed, 0x3e, 0x25, 0x3a, 0x7f, 0x01, 0x2a, 0x22, 0xb9, 0x93, 0xcf, 0x98, 0xdc, + 0x11, 0x18, 0xea, 0xef, 0xb2, 0x3d, 0xaa, 0x04, 0x32, 0xef, 0x76, 0x9f, 0x18, 0xa1, 0xa3, 0x49, + 0xdb, 0x7c, 0x42, 0xd2, 0xf6, 0xdf, 0x14, 0xe8, 0x04, 0x09, 0x52, 0xf7, 0xf6, 0xd1, 0xe2, 0x1b, + 0x9c, 0x27, 0x13, 0xd3, 0xbf, 0x2e, 0x76, 0xe0, 0x88, 0x42, 0xcd, 0x18, 0x8d, 0xfb, 0xfb, 0x6f, + 0x63, 0xba, 0x03, 0x13, 0xff, 0xa8, 0xc5, 0x24, 0xb5, 0x23, 0xb1, 0x00, 0xdb, 0x85, 0x0b, 0x16, + 0xf8, 0xef, 0x18, 0xcb, 0xde, 0x09, 0x67, 0x49, 0x9f, 0x3e, 0x19, 0xe5, 0xbd, 0xc1, 0x03, 0xbe, + 0x37, 0x58, 0x88, 0xec, 0x0d, 0xf2, 0x76, 0xd5, 0xa6, 0xac, 0x10, 0xfb, 0x84, 0x27, 0x47, 0xb4, + 0xef, 0x28, 0xd0, 0xe6, 0xe3, 0xb0, 0x22, 0x1a, 0x7b, 0x34, 0x1e, 0x62, 0x0f, 0x1b, 0x4f, 0x23, + 0x55, 0xf5, 0x17, 0x39, 0x68, 0xc9, 0x1e, 0x12, 0x75, 0x72, 0x3e, 0x0b, 0x45, 0x9a, 0x11, 0xe4, + 0xb3, 0xc8, 0xa0, 0x31, 0x18, 0x3c, 0x31, 0xae, 0x34, 0x54, 0xd9, 0x71, 0x7d, 0x1f, 0x88, 0x3f, + 0x06, 0xae, 0x5a, 0xfe, 0x38, 0xae, 0xda, 0x59, 0xa8, 0x12, 0xe3, 0x67, 0x4f, 0x48, 0xcf, 0xac, + 0xa0, 0x23, 0x68, 0x40, 0x6f, 0x41, 0x89, 0x55, 0xce, 0xf1, 0x1d, 0xf4, 0x97, 0xa2, 0x9d, 0xf3, + 0xba, 0x3a, 0x69, 0xaf, 0x8b, 0x36, 0x68, 0x1c, 0x8d, 0xac, 0xd6, 0xd8, 0xb1, 0x07, 0xd4, 0xab, + 0x23, 0x96, 0xb1, 0xa8, 0x89, 0x67, 0xe2, 0x77, 0xda, 0xe3, 0xcd, 0x0d, 0x6e, 0x15, 0xe9, 0x6f, + 0xd5, 0x80, 0xb5, 0x20, 0x83, 0xc2, 0x26, 0xba, 0x00, 0xcb, 0xaf, 0x41, 0x69, 0x3c, 0xd4, 0x03, + 0x66, 0xe7, 0x4f, 0xea, 0xdf, 0xe7, 0x60, 0x65, 0xfb, 0xc8, 0xea, 0x47, 0xc5, 0x2a, 0x80, 0x57, + 0x64, 0x78, 0x5a, 0x31, 0xe3, 0x67, 0x4d, 0x88, 0xd7, 0xc0, 0x7a, 0xab, 0x89, 0xb6, 0x1d, 0x7b, + 0xa6, 0x4b, 0xf7, 0xa2, 0x48, 0x06, 0x61, 0x83, 0xf9, 0x27, 0x2c, 0xf9, 0xda, 0x10, 0xad, 0xd4, + 0x3f, 0x79, 0x0b, 0x80, 0xe5, 0x29, 0xe6, 0x73, 0xdd, 0x28, 0xce, 0x5d, 0xe2, 0xba, 0x45, 0x8b, + 0x7b, 0x4a, 0xf1, 0xbd, 0xa4, 0xe7, 0x24, 0x35, 0xde, 0x33, 0x0d, 0x4e, 0x7f, 0x49, 0xca, 0x0d, + 0xf4, 0x3c, 0x34, 0x02, 0xbd, 0x40, 0x60, 0x2a, 0x31, 0x65, 0x61, 0xa8, 0x3f, 0xcc, 0x43, 0x5b, + 0x5a, 0xac, 0x9f, 0xbe, 0x1b, 0x9d, 0x12, 0x92, 0xe7, 0x4f, 0x2c, 0x24, 0x2f, 0x9c, 0x84, 0xeb, + 0x5c, 0x4c, 0x4a, 0x1d, 0x8b, 0xd4, 0x5b, 0x69, 0xce, 0xd4, 0x5b, 0x54, 0x8b, 0x97, 0x67, 0x6b, + 0xf1, 0x4a, 0xdc, 0x21, 0xfa, 0x51, 0x11, 0x9a, 0xc1, 0xd2, 0x6d, 0x0d, 0x75, 0x2b, 0x95, 0xf7, + 0x1f, 0x40, 0xd3, 0x0d, 0x2d, 0x2d, 0x5f, 0xac, 0x57, 0x92, 0xf5, 0x4c, 0x0a, 0x3f, 0x68, 0x91, + 0x4e, 0xd0, 0x39, 0xca, 0xe8, 0x8e, 0xc7, 0x52, 0xd7, 0x5c, 0x5c, 0x98, 0x4a, 0x33, 0x47, 0x18, + 0xbd, 0x0c, 0x88, 0x6b, 0xa1, 0x9e, 0x69, 0xf5, 0x5c, 0xdc, 0xb7, 0x2d, 0x83, 0xe9, 0xa7, 0xa2, + 0xd6, 0xe2, 0x6f, 0x36, 0xad, 0x6d, 0xd6, 0x8e, 0x3e, 0x0b, 0x05, 0xef, 0x68, 0xcc, 0x7c, 0xf2, + 0x66, 0x8a, 0xc3, 0x1a, 0xcc, 0x6c, 0xe7, 0x68, 0x8c, 0x35, 0x8a, 0xe0, 0x97, 0x97, 0x7a, 0x8e, + 0xee, 0xaf, 0x45, 0x41, 0x93, 0x5a, 0xe4, 0x44, 0x49, 0x39, 0x9c, 0x28, 0xa1, 0xf2, 0x2c, 0x24, + 0xc4, 0xf3, 0x86, 0x9c, 0xcc, 0x92, 0xdc, 0xec, 0x78, 0x43, 0xf2, 0x99, 0x9e, 0xed, 0xe9, 0x43, + 0xa6, 0x15, 0xaa, 0x5c, 0xbf, 0x92, 0x16, 0xaa, 0x15, 0x02, 0xfd, 0x0a, 0xc7, 0xd3, 0xaf, 0x37, + 0x60, 0xb5, 0x3f, 0x9c, 0xb8, 0x1e, 0x76, 0x4c, 0x6b, 0xd0, 0x3b, 0xc4, 0x47, 0x3d, 0xca, 0xd4, + 0x34, 0xe5, 0x93, 0xd7, 0x50, 0xf0, 0xee, 0x03, 0x7c, 0x44, 0x39, 0x16, 0x5d, 0x86, 0xd6, 0x48, + 0x7f, 0x2c, 0x36, 0x02, 0xe9, 0xbc, 0xea, 0x2c, 0x03, 0x33, 0xd2, 0x1f, 0xf3, 0x55, 0xa3, 0x93, + 0xbb, 0x06, 0x2b, 0x63, 0x07, 0xef, 0x63, 0x27, 0x0c, 0xdc, 0xa0, 0xc0, 0xcb, 0xec, 0x55, 0x04, + 0x5e, 0xb7, 0xf4, 0xe1, 0xd1, 0x27, 0xb8, 0xe7, 0x60, 0x77, 0x32, 0xf4, 0x58, 0x0c, 0xd5, 0xa4, + 0x84, 0x5b, 0xe6, 0xaf, 0x34, 0xfa, 0x86, 0x46, 0x53, 0x12, 0xbc, 0xbc, 0x2d, 0xc9, 0x92, 0xe4, + 0x3e, 0xbc, 0xb4, 0x29, 0xb9, 0xea, 0x1b, 0xba, 0x16, 0x65, 0x03, 0xf6, 0xa0, 0xfe, 0x47, 0x0e, + 0x96, 0x63, 0x5c, 0x97, 0xca, 0xcd, 0xd3, 0x13, 0xa1, 0xb3, 0x94, 0xf8, 0x3b, 0x50, 0xe3, 0xc2, + 0x3d, 0x97, 0x7a, 0x00, 0x86, 0x74, 0x77, 0x8a, 0xce, 0x2a, 0x9e, 0x98, 0xce, 0x2a, 0x1d, 0x2b, + 0x8d, 0x98, 0xcc, 0xe5, 0xea, 0x37, 0x73, 0xb0, 0x1a, 0xd6, 0x13, 0x6c, 0xfd, 0x52, 0xe9, 0xfb, + 0x66, 0x38, 0x6f, 0x74, 0x79, 0x96, 0x28, 0xea, 0xee, 0x61, 0xc8, 0x1d, 0xb9, 0x1d, 0x8b, 0x8a, + 0x2e, 0x65, 0xd3, 0x33, 0x81, 0x17, 0x28, 0x7f, 0x4e, 0x21, 0x2c, 0xb4, 0xc7, 0xd5, 0x13, 0xea, + 0xef, 0x28, 0x70, 0x3a, 0xe6, 0x97, 0x2c, 0xe6, 0xc7, 0xae, 0x43, 0x99, 0x49, 0x89, 0xaf, 0x50, + 0xaf, 0xcc, 0x98, 0x4e, 0x40, 0x7d, 0xcd, 0xc7, 0x54, 0xb7, 0x61, 0xcd, 0xf7, 0x77, 0x83, 0xa5, + 0xbd, 0x87, 0x3d, 0x7d, 0x4a, 0x32, 0xe6, 0x02, 0xd4, 0x58, 0xb0, 0xce, 0xc4, 0x93, 0x15, 0x9b, + 0xc0, 0x9e, 0xc8, 0xcd, 0xab, 0xdf, 0xcf, 0xc1, 0x2a, 0x75, 0x14, 0xa3, 0xdb, 0xe6, 0x59, 0x4a, + 0x59, 0x54, 0xe1, 0x7f, 0x10, 0x5f, 0x83, 0x7d, 0x5b, 0x55, 0x0b, 0xb5, 0xa1, 0x0f, 0xe2, 0x89, + 0xfb, 0x94, 0xe4, 0x5d, 0x50, 0xbf, 0xb3, 0xa1, 0x7b, 0x3a, 0x2d, 0xdf, 0x89, 0x66, 0xec, 0x03, + 0x15, 0x5a, 0x38, 0x9e, 0x0a, 0xbd, 0x02, 0x2d, 0xb6, 0x7b, 0xd7, 0x13, 0x59, 0x20, 0xca, 0x20, + 0x05, 0x6d, 0x89, 0xb5, 0xef, 0xf8, 0xcd, 0xea, 0x7d, 0x78, 0x26, 0x42, 0x98, 0x85, 0x78, 0x40, + 0xfd, 0x53, 0x85, 0xac, 0x5f, 0xa8, 0xd2, 0x74, 0x11, 0x77, 0xf7, 0x9c, 0xd8, 0xdc, 0x27, 0x2e, + 0x5b, 0x44, 0xbb, 0x19, 0xe8, 0x6d, 0xa8, 0x5a, 0xf8, 0x51, 0x4f, 0x0e, 0x16, 0x32, 0x05, 0xc1, + 0x15, 0x0b, 0x3f, 0xa2, 0xbf, 0xd4, 0x2d, 0x38, 0x1d, 0x9b, 0xee, 0x62, 0x14, 0xf8, 0x5b, 0x05, + 0xce, 0x6c, 0x38, 0xf6, 0x78, 0xd7, 0x74, 0xbc, 0x89, 0x3e, 0x0c, 0x17, 0x53, 0x1d, 0x8b, 0x08, + 0x19, 0xaa, 0xdb, 0xdf, 0x8f, 0x29, 0x99, 0x6b, 0x89, 0xb2, 0x17, 0x9f, 0x58, 0x4c, 0xd9, 0xa8, + 0x3f, 0xce, 0x27, 0x7d, 0x80, 0x6f, 0x86, 0xa6, 0x7b, 0xc1, 0x59, 0x22, 0xf2, 0xc4, 0x7d, 0xb7, + 0xfc, 0xf1, 0xf7, 0xdd, 0x52, 0xec, 0x4f, 0xe1, 0xc4, 0xec, 0xcf, 0x31, 0xd2, 0xcd, 0xef, 0x42, + 0x78, 0x6f, 0x94, 0x3a, 0x62, 0xf3, 0xef, 0xa8, 0xbe, 0x05, 0x10, 0x6c, 0x0f, 0xf2, 0xb3, 0x03, + 0x33, 0xfb, 0x90, 0x50, 0xc8, 0x6a, 0x09, 0x5b, 0xcf, 0xdd, 0x39, 0x69, 0x1b, 0x68, 0x1b, 0x3a, + 0x49, 0x9c, 0xba, 0x18, 0xff, 0xff, 0x86, 0x02, 0xe7, 0x1f, 0x8c, 0x0d, 0xdd, 0xc3, 0x92, 0x54, + 0x2d, 0x5e, 0x96, 0x29, 0xea, 0x22, 0x73, 0x53, 0xeb, 0x22, 0xa5, 0x31, 0x5d, 0x5e, 0x17, 0xa9, + 0xfe, 0x44, 0xcc, 0x28, 0x56, 0xda, 0xbc, 0xc8, 0x8c, 0x3a, 0x50, 0x79, 0xc8, 0x3b, 0xf4, 0xcf, + 0xc4, 0xf8, 0xcf, 0xa1, 0xdd, 0xbb, 0xfc, 0xbc, 0xbb, 0x77, 0x5b, 0xb0, 0x12, 0x2f, 0xfb, 0xf6, + 0x19, 0x7a, 0x66, 0x3f, 0x28, 0x56, 0xd4, 0xed, 0xaa, 0x1f, 0xc2, 0x19, 0x0d, 0xbb, 0xd8, 0x32, + 0x42, 0xe4, 0x39, 0xfe, 0xb7, 0xab, 0x0e, 0x74, 0x92, 0x3a, 0x5c, 0xcc, 0x7f, 0x60, 0xca, 0x9e, + 0x78, 0xda, 0x2c, 0x3b, 0x95, 0xe7, 0xba, 0x85, 0x8e, 0xe4, 0xa9, 0x1f, 0x43, 0xe7, 0x9e, 0xee, + 0x1c, 0xfa, 0x19, 0x8e, 0x0d, 0xb6, 0x2f, 0xbc, 0xc8, 0x0a, 0x5e, 0x80, 0x9a, 0xec, 0xa6, 0x47, + 0x8e, 0x0d, 0x18, 0xae, 0xba, 0x2f, 0x2a, 0x26, 0x34, 0x12, 0x1a, 0x60, 0xab, 0x8f, 0xef, 0xda, + 0xfd, 0x43, 0xe2, 0x2b, 0x7a, 0xec, 0x64, 0x16, 0xf7, 0x15, 0xd9, 0x93, 0x74, 0x7e, 0x2a, 0x17, + 0x3a, 0x3f, 0x35, 0xe3, 0x78, 0xa4, 0xfa, 0xdf, 0x39, 0x58, 0x7b, 0x67, 0xe8, 0x61, 0x27, 0x30, + 0xe9, 0xf3, 0x78, 0x28, 0x81, 0xc3, 0x90, 0x3b, 0x9e, 0xc3, 0x90, 0x21, 0x0d, 0x9e, 0xe4, 0xe2, + 0x14, 0x8e, 0xed, 0xe2, 0xac, 0x03, 0x8c, 0x1d, 0x7b, 0x8c, 0x1d, 0xcf, 0xc4, 0xbe, 0x82, 0xcd, + 0x54, 0xea, 0x2c, 0xa1, 0x89, 0x8a, 0xc1, 0x92, 0x54, 0x31, 0x78, 0x16, 0xaa, 0xbe, 0x10, 0xb2, + 0xe2, 0xd8, 0xaa, 0x16, 0x34, 0xa8, 0x5f, 0x81, 0xd6, 0x7b, 0xfd, 0x75, 0xdb, 0xda, 0x37, 0x9d, + 0x91, 0x4f, 0xe0, 0x58, 0x62, 0x28, 0x4e, 0x61, 0x23, 0x96, 0x60, 0xca, 0xc5, 0x12, 0x4c, 0xea, + 0x21, 0x2c, 0x4b, 0x7d, 0x2f, 0x26, 0x09, 0x17, 0xa0, 0x36, 0xe8, 0xf7, 0xf6, 0x4d, 0xcb, 0xa4, + 0x75, 0x1b, 0x39, 0x9a, 0x8d, 0x86, 0x41, 0xff, 0x0e, 0x6f, 0x51, 0x7f, 0x4d, 0x81, 0x67, 0x35, + 0x3c, 0xb6, 0x1d, 0xcf, 0xdf, 0x70, 0xde, 0xf1, 0xee, 0xb9, 0x83, 0x85, 0x34, 0xec, 0x2d, 0x28, + 0x8c, 0xdc, 0x41, 0xea, 0xce, 0x0f, 0xd1, 0x33, 0xa1, 0xc1, 0x34, 0x0a, 0xae, 0xfe, 0x95, 0x02, + 0xab, 0x7e, 0x4e, 0x3c, 0xe4, 0xef, 0x85, 0x99, 0x5e, 0x89, 0x15, 0x66, 0x4e, 0x39, 0xcb, 0x79, + 0x1a, 0xca, 0xc6, 0x1e, 0x73, 0x76, 0xf2, 0x54, 0xb3, 0x96, 0x8c, 0x3d, 0xea, 0xe7, 0xbc, 0x04, + 0x4b, 0xd2, 0x62, 0x51, 0x00, 0x16, 0x10, 0x49, 0xa9, 0x8b, 0xc4, 0x33, 0x9a, 0xc5, 0x84, 0xfd, + 0xfa, 0x2f, 0x41, 0x9b, 0x73, 0xc6, 0x87, 0x63, 0xec, 0xe8, 0x94, 0x33, 0xfd, 0xc9, 0xbf, 0xee, + 0x1f, 0xd9, 0x51, 0xa6, 0x1c, 0x6e, 0x8a, 0xe6, 0xc2, 0xf9, 0xb9, 0x1d, 0xf5, 0x1f, 0x15, 0xb8, + 0x18, 0xed, 0x79, 0x8b, 0xe7, 0x88, 0x4f, 0xe0, 0x00, 0x33, 0x4d, 0x31, 0xe7, 0x82, 0x14, 0xf3, + 0x82, 0xf9, 0x72, 0x39, 0xa1, 0x5d, 0x08, 0x27, 0xb4, 0xd5, 0xef, 0xe6, 0xa1, 0xb5, 0xe5, 0x60, + 0x56, 0x97, 0xe7, 0xd3, 0xe6, 0x2c, 0x54, 0x79, 0x16, 0x86, 0xeb, 0xa3, 0xaa, 0x16, 0x34, 0xa0, + 0x55, 0x28, 0x7e, 0x64, 0x07, 0x85, 0xbc, 0xec, 0x41, 0xd2, 0x98, 0xf9, 0x90, 0xc6, 0xcc, 0x72, + 0x00, 0x33, 0xaa, 0x9d, 0x8a, 0x09, 0xda, 0xe9, 0xac, 0x5c, 0xcb, 0x5c, 0xe2, 0x72, 0x2f, 0x76, + 0x26, 0x03, 0x05, 0x59, 0x3e, 0x9e, 0x82, 0xbc, 0xe3, 0x1f, 0xc8, 0xed, 0xed, 0x9b, 0x43, 0xec, + 0xd7, 0x48, 0xa5, 0x1f, 0x04, 0x62, 0x04, 0xbb, 0x63, 0x0e, 0xb1, 0x56, 0x33, 0xc5, 0x6f, 0xba, + 0x15, 0x6d, 0x8f, 0x99, 0xf2, 0xac, 0x66, 0x57, 0x7a, 0x3e, 0x8e, 0x7a, 0x0b, 0x6a, 0xfa, 0xc4, + 0xb3, 0x37, 0x37, 0x34, 0xdd, 0x1a, 0xd0, 0x1d, 0xfa, 0x3d, 0x3c, 0x30, 0x2d, 0xff, 0x30, 0x2c, + 0x7d, 0x40, 0x2d, 0xc8, 0x63, 0xcb, 0x57, 0x51, 0xe4, 0xa7, 0xea, 0xc0, 0x6a, 0x68, 0x05, 0xb3, + 0xf9, 0xf2, 0x91, 0x9c, 0x6b, 0x2e, 0xf1, 0x08, 0xb3, 0x4f, 0x63, 0x2e, 0xa7, 0xe2, 0x59, 0xfd, + 0xa3, 0x02, 0x34, 0x7e, 0xe6, 0xd9, 0xe6, 0xf3, 0x50, 0x9c, 0x9b, 0x5f, 0x18, 0xc6, 0x82, 0x9c, + 0x82, 0x9a, 0x90, 0xf3, 0x5c, 0x9a, 0x82, 0x2d, 0x68, 0x39, 0x8f, 0x18, 0xdc, 0x3a, 0xe3, 0x9c, + 0x9e, 0x43, 0x58, 0x87, 0x66, 0x53, 0xd3, 0x62, 0x1a, 0x89, 0xc5, 0xb4, 0x10, 0xbf, 0xed, 0x40, + 0xcb, 0x61, 0x8b, 0x19, 0x9c, 0xe2, 0xa8, 0x4f, 0xc9, 0xf4, 0x24, 0x31, 0x9d, 0xb6, 0xe4, 0x84, + 0x9e, 0x5d, 0xb5, 0x0f, 0xcf, 0xfc, 0xbf, 0x09, 0x76, 0x8e, 0x9e, 0xa4, 0x9e, 0x51, 0xff, 0x27, + 0x07, 0xab, 0xa2, 0x2a, 0x96, 0x0d, 0x43, 0x7d, 0x56, 0xd4, 0x87, 0x66, 0x60, 0xd9, 0x69, 0x8e, + 0x94, 0x69, 0xfc, 0x2f, 0x24, 0x7e, 0x51, 0x52, 0x17, 0x41, 0x23, 0x09, 0xaa, 0xd8, 0x61, 0x90, + 0xc6, 0x58, 0x6e, 0x43, 0x63, 0x58, 0x09, 0x06, 0xa1, 0x77, 0x81, 0xd0, 0xe2, 0x19, 0x66, 0x69, + 0xdf, 0x3e, 0xc6, 0x48, 0xc4, 0x10, 0x6f, 0x9b, 0x9f, 0x60, 0x7e, 0x8e, 0x73, 0x1c, 0x6d, 0xef, + 0xbc, 0x0d, 0x28, 0x3e, 0xad, 0x79, 0x0e, 0x9b, 0x74, 0x36, 0x60, 0x2d, 0x79, 0xb8, 0xb9, 0x8e, + 0xac, 0x7c, 0x23, 0x0f, 0x4b, 0x01, 0x73, 0x33, 0x92, 0x6f, 0x40, 0x4d, 0x52, 0xa6, 0xdc, 0xfc, + 0x65, 0x92, 0x0d, 0x08, 0x74, 0x29, 0x7a, 0x16, 0xaa, 0x04, 0xdd, 0xa7, 0xa4, 0xc2, 0x4e, 0x6c, + 0x0e, 0x31, 0xad, 0x5d, 0x0a, 0x6f, 0x52, 0xe4, 0xa3, 0x9b, 0x14, 0x57, 0x61, 0x99, 0xbd, 0x96, + 0x4b, 0x99, 0x98, 0x0e, 0x59, 0xa2, 0x2f, 0xee, 0x89, 0x7a, 0x26, 0xf4, 0x65, 0xa8, 0x1f, 0xe8, + 0xc4, 0xe9, 0x62, 0xe5, 0xd6, 0xdc, 0x59, 0xbd, 0x35, 0x85, 0xe1, 0xc5, 0x97, 0x5e, 0xfb, 0x22, + 0x45, 0xa4, 0xbf, 0xd9, 0x4a, 0xd5, 0x0e, 0x82, 0x96, 0x8e, 0x09, 0xad, 0x28, 0x40, 0xc2, 0x29, + 0xdb, 0xb7, 0xc2, 0xa7, 0x6c, 0xaf, 0x64, 0xe6, 0x16, 0x79, 0x19, 0x7e, 0x2f, 0x07, 0x6b, 0x51, + 0x21, 0x5b, 0xcc, 0x0f, 0x09, 0x04, 0x2d, 0x17, 0xd2, 0xcc, 0x99, 0x7c, 0x91, 0x4d, 0x71, 0x91, + 0x05, 0xf5, 0x44, 0x76, 0xbb, 0xbe, 0x2f, 0xb2, 0x06, 0x25, 0x07, 0xeb, 0x2e, 0x3f, 0x1d, 0x5f, + 0xd5, 0xf8, 0x13, 0xdd, 0x28, 0x19, 0xda, 0x9e, 0x7f, 0x22, 0x85, 0x3d, 0x90, 0x28, 0x82, 0xb1, + 0x00, 0x5d, 0x18, 0xb6, 0x4d, 0xf0, 0x42, 0x96, 0x85, 0xd1, 0x28, 0xeb, 0xd0, 0x9f, 0xea, 0x2f, + 0x01, 0xa2, 0x94, 0x79, 0x72, 0xc6, 0xea, 0x2c, 0x54, 0x3f, 0x26, 0x23, 0x6c, 0x0f, 0x6d, 0x8f, + 0x57, 0x96, 0x04, 0x0d, 0xea, 0xf7, 0x72, 0xb0, 0xcc, 0x57, 0x4d, 0x3a, 0x05, 0x34, 0xdd, 0x34, + 0x3f, 0x0f, 0x0d, 0x26, 0x09, 0xd8, 0x60, 0x1c, 0x9e, 0x93, 0x2f, 0x08, 0xc1, 0x06, 0x65, 0xf2, + 0xd7, 0xa2, 0x65, 0x6f, 0xc7, 0x3d, 0x9a, 0xf2, 0xd3, 0x2f, 0xd7, 0x54, 0xff, 0x38, 0x07, 0x2b, + 0xa1, 0x55, 0xf9, 0xbf, 0xcf, 0xac, 0x5f, 0x86, 0x55, 0xae, 0xf5, 0x7c, 0xdb, 0xd9, 0x23, 0xd1, + 0x02, 0x67, 0xdb, 0x69, 0x43, 0xcb, 0xb5, 0x38, 0xc8, 0x94, 0x9b, 0x5c, 0xd2, 0xa6, 0xf6, 0x60, + 0x79, 0xc3, 0xb1, 0xc7, 0x4f, 0xce, 0x78, 0x7e, 0xab, 0x08, 0x55, 0xd6, 0xfb, 0xfb, 0xf6, 0x5e, + 0x80, 0xab, 0xc8, 0xb8, 0xc7, 0x3d, 0xbe, 0x37, 0x4f, 0x44, 0xf7, 0xb4, 0xdd, 0xb9, 0x73, 0x6c, + 0x6f, 0xdd, 0x9e, 0x78, 0x24, 0x66, 0x65, 0x87, 0xd3, 0xa4, 0xd2, 0xa2, 0x73, 0x00, 0xfd, 0x21, + 0xd6, 0xad, 0xc9, 0x98, 0xbc, 0xae, 0xb2, 0xd7, 0xbc, 0x65, 0x87, 0x9e, 0xc7, 0xe5, 0xae, 0x0f, + 0x36, 0x36, 0x4c, 0xf7, 0x90, 0x58, 0x17, 0xea, 0xa1, 0xe5, 0xb5, 0xf8, 0x0b, 0xf4, 0x86, 0xcf, + 0x9a, 0x35, 0xca, 0x9a, 0x2f, 0xcd, 0x30, 0x8f, 0xef, 0xdb, 0x7b, 0xa1, 0xa0, 0x2e, 0xe0, 0xcd, + 0x7a, 0x88, 0x37, 0x69, 0xb6, 0x83, 0x95, 0x90, 0xb1, 0x3a, 0x85, 0x06, 0x2b, 0xbb, 0xf7, 0x1b, + 0x69, 0xa9, 0x82, 0x70, 0x5b, 0x9b, 0x8b, 0xb8, 0xad, 0x4b, 0xc7, 0x70, 0x5b, 0xc3, 0x35, 0x14, + 0x2d, 0xc6, 0xb6, 0xa2, 0x86, 0x42, 0xfd, 0xed, 0x1c, 0x34, 0x84, 0x05, 0x23, 0x12, 0x99, 0xc2, + 0x8c, 0x69, 0xf2, 0x9e, 0x85, 0x21, 0x83, 0x1c, 0x5e, 0x29, 0x94, 0xc3, 0x13, 0xba, 0xa2, 0xbc, + 0x98, 0xae, 0xa8, 0x84, 0xd6, 0x23, 0x6c, 0xc2, 0xe0, 0x78, 0x26, 0xec, 0xdf, 0x73, 0x50, 0x0f, + 0x46, 0xde, 0xed, 0x3e, 0x01, 0xaa, 0xcc, 0x3a, 0x65, 0x1b, 0x50, 0xad, 0x98, 0x4c, 0xb5, 0xd2, + 0x62, 0x54, 0x2b, 0x4f, 0xe7, 0xe2, 0x4a, 0x02, 0x17, 0x87, 0x49, 0x5b, 0x3d, 0x1e, 0x69, 0xff, + 0x46, 0xe1, 0x29, 0x43, 0xcf, 0xb1, 0x17, 0xda, 0xc4, 0xfb, 0x1c, 0x94, 0x49, 0xbb, 0xce, 0x23, + 0xf3, 0x66, 0x1c, 0x8d, 0x5d, 0xe0, 0xd2, 0x5f, 0x67, 0x50, 0x9a, 0x0f, 0x8e, 0x5e, 0x87, 0xd2, + 0x58, 0x77, 0xf4, 0x51, 0x6a, 0xf5, 0x7a, 0x92, 0x44, 0x71, 0x14, 0xf5, 0xc7, 0x65, 0xb9, 0x2c, + 0x8a, 0x8a, 0xcc, 0x94, 0x42, 0x12, 0xcf, 0x31, 0x07, 0x03, 0x6a, 0x31, 0xf8, 0x56, 0xab, 0x68, + 0x38, 0xa1, 0x4b, 0xcf, 0xa4, 0x42, 0x86, 0x62, 0x72, 0x21, 0x43, 0x69, 0xde, 0x82, 0xa7, 0x37, + 0xc3, 0x72, 0x39, 0x77, 0x7d, 0xc6, 0x05, 0xa8, 0xed, 0xeb, 0xe6, 0xb0, 0x17, 0x12, 0x4f, 0x20, + 0x4d, 0x1a, 0x63, 0xb6, 0xb0, 0x4e, 0xaa, 0x46, 0xeb, 0xba, 0xce, 0x40, 0x05, 0x5b, 0x06, 0x7b, + 0xc9, 0xb4, 0x79, 0x19, 0x5b, 0xc6, 0x94, 0x92, 0xaf, 0x5a, 0x4a, 0xc9, 0xd7, 0x05, 0xa8, 0x39, + 0xd8, 0x73, 0x8e, 0xd8, 0xa6, 0x3d, 0xd5, 0xdb, 0x45, 0x0d, 0x68, 0x13, 0xdd, 0xaf, 0x4f, 0x28, + 0xd0, 0x6a, 0xcc, 0x2e, 0xd0, 0x6a, 0x46, 0x63, 0x9f, 0x17, 0xa0, 0x61, 0x5a, 0xe3, 0x89, 0x70, + 0x21, 0x78, 0x75, 0x52, 0xb8, 0x11, 0x5d, 0x82, 0x26, 0xab, 0xc8, 0x10, 0x60, 0x2d, 0x76, 0xd2, + 0x37, 0xdc, 0x8a, 0x6e, 0x42, 0x7e, 0x6c, 0xbb, 0xf4, 0x04, 0x6f, 0x86, 0xbd, 0x29, 0x02, 0x2b, + 0xa9, 0x0a, 0x14, 0x52, 0x15, 0x81, 0x79, 0x5e, 0x39, 0x9e, 0x79, 0xde, 0x49, 0xa9, 0x1c, 0x5b, + 0xa5, 0xdd, 0xa9, 0x29, 0xdd, 0x51, 0x0f, 0x94, 0xf7, 0x94, 0xb5, 0xba, 0xec, 0x99, 0x79, 0xaa, + 0xcb, 0xd6, 0xd2, 0xaa, 0xcb, 0x5e, 0x80, 0x06, 0x2f, 0x09, 0xe3, 0xd7, 0xfc, 0x9d, 0x66, 0xcb, + 0x19, 0x6a, 0x24, 0x2b, 0xc1, 0x1b, 0x76, 0x43, 0x07, 0x7d, 0x23, 0xad, 0x57, 0xdf, 0x14, 0xd7, + 0x08, 0x10, 0xe1, 0x40, 0x65, 0xc8, 0xdf, 0xc7, 0x8f, 0x5a, 0xa7, 0x10, 0x40, 0xe9, 0xbe, 0xed, + 0x8c, 0xf4, 0x61, 0x4b, 0x41, 0x35, 0x28, 0xf3, 0xda, 0xf5, 0x56, 0x0e, 0x35, 0xa0, 0xba, 0xee, + 0x57, 0xea, 0xb6, 0xf2, 0x57, 0xbb, 0x50, 0x97, 0xab, 0x33, 0x09, 0xde, 0x5d, 0x3c, 0xd0, 0xfb, + 0x47, 0xad, 0x53, 0xa8, 0x04, 0xb9, 0xbb, 0x37, 0x5a, 0x0a, 0xfd, 0x7b, 0xb3, 0x95, 0xa3, 0x7f, + 0xbb, 0xad, 0xfc, 0xd5, 0xdf, 0x57, 0x60, 0x39, 0x96, 0x57, 0x46, 0x4d, 0x80, 0x07, 0x96, 0xaf, + 0x8a, 0x5b, 0xa7, 0x50, 0x1d, 0x2a, 0x7e, 0xd9, 0x3a, 0x9b, 0xc3, 0x8e, 0x4d, 0xa1, 0x5b, 0x39, + 0xd4, 0x82, 0x3a, 0x43, 0x9c, 0xf4, 0xfb, 0xd8, 0x75, 0x5b, 0x79, 0xd1, 0x72, 0x47, 0x37, 0x87, + 0x13, 0x07, 0xb7, 0x0a, 0x64, 0x9e, 0x3b, 0xb6, 0x86, 0x87, 0x58, 0x77, 0x71, 0xab, 0x88, 0x10, + 0x34, 0xf9, 0x83, 0x8f, 0x54, 0x92, 0xda, 0x7c, 0xb4, 0xf2, 0xd5, 0x7f, 0x56, 0x42, 0x9a, 0x8f, + 0xd0, 0xe4, 0x34, 0xac, 0x3c, 0xb0, 0x0c, 0xbc, 0x6f, 0x5a, 0xd8, 0x08, 0x5e, 0xb5, 0x4e, 0xa1, + 0x15, 0x58, 0xba, 0x87, 0x9d, 0x01, 0x96, 0x1a, 0x73, 0x68, 0x19, 0x1a, 0xf7, 0xcc, 0xc7, 0x52, + 0x53, 0x1e, 0xad, 0x42, 0x6b, 0xdb, 0xb4, 0x06, 0x43, 0x19, 0xb0, 0x40, 0xb1, 0x4d, 0xcb, 0x76, + 0xa4, 0xc6, 0x22, 0x6d, 0xd4, 0x3f, 0x0a, 0x35, 0x96, 0x50, 0x07, 0xd6, 0x28, 0x71, 0x6f, 0x6c, + 0x60, 0x42, 0x0d, 0xe9, 0x5d, 0x19, 0xb5, 0x61, 0x75, 0x5d, 0x70, 0x9f, 0xf4, 0xa6, 0xa2, 0x16, + 0x2a, 0x4a, 0x4b, 0xb9, 0xfa, 0xc0, 0x0f, 0x13, 0x25, 0x3b, 0x89, 0x2a, 0x50, 0xb8, 0x6f, 0x5b, + 0x84, 0xc8, 0x35, 0x28, 0x6f, 0x61, 0xcb, 0x30, 0xad, 0x41, 0x4b, 0x21, 0x2b, 0xb0, 0x29, 0x76, + 0x1c, 0x5a, 0x39, 0xb2, 0x96, 0x84, 0x30, 0x64, 0x9d, 0xfd, 0x65, 0xa7, 0x87, 0x08, 0x5a, 0x85, + 0xab, 0x57, 0xa0, 0x2a, 0x6c, 0x0e, 0x2a, 0x82, 0xd2, 0x6b, 0x9d, 0x42, 0x55, 0x28, 0x6e, 0xe9, + 0x13, 0x97, 0xac, 0x16, 0x40, 0x49, 0xc3, 0xee, 0x64, 0x84, 0x5b, 0xb9, 0xab, 0x7f, 0xa8, 0xc0, + 0x4a, 0x82, 0x22, 0x25, 0x43, 0x4f, 0xac, 0x43, 0xcb, 0x7e, 0x44, 0x48, 0xd9, 0x80, 0x2a, 0x7e, + 0x8c, 0xfb, 0x13, 0x4f, 0xcc, 0x64, 0x6c, 0x8e, 0xf1, 0xd0, 0xb4, 0xc8, 0x33, 0x65, 0xba, 0xbe, + 0x18, 0x3d, 0x4f, 0xba, 0xdf, 0x67, 0x13, 0x2b, 0x90, 0x6e, 0xb8, 0x4e, 0x6c, 0x15, 0x09, 0x1c, + 0xe3, 0x6f, 0x82, 0x56, 0x22, 0x2c, 0x44, 0x6f, 0x81, 0x21, 0x4f, 0x65, 0x02, 0x49, 0xdd, 0x6a, + 0x6c, 0xb4, 0x2a, 0x64, 0x84, 0x11, 0xf6, 0xf4, 0x9e, 0xab, 0x3f, 0xc4, 0x46, 0xab, 0xda, 0xfd, + 0xc1, 0x15, 0xa8, 0x6e, 0xe8, 0x9e, 0xbe, 0x6e, 0xdb, 0x8e, 0x81, 0xc6, 0x80, 0xe8, 0xc5, 0x55, + 0xa3, 0xb1, 0x6d, 0x89, 0xab, 0xef, 0xd0, 0x8d, 0x98, 0xa2, 0x62, 0x8f, 0x71, 0x50, 0x6e, 0xf2, + 0x3b, 0x97, 0x52, 0x30, 0x22, 0xe0, 0xea, 0x29, 0xf4, 0x31, 0x1d, 0x91, 0x68, 0xec, 0x1d, 0xb3, + 0x7f, 0xe8, 0x17, 0x04, 0x74, 0x53, 0x7d, 0xe8, 0x38, 0xb0, 0x3f, 0xe6, 0x8b, 0x29, 0x63, 0xb2, + 0x5b, 0xc6, 0xfc, 0x98, 0x58, 0x3d, 0x85, 0x26, 0x74, 0x07, 0x2e, 0xa8, 0xb3, 0xf0, 0x07, 0xfd, + 0xf4, 0xb4, 0x41, 0x63, 0xe0, 0x73, 0x0f, 0xbb, 0x05, 0x45, 0xaa, 0x4d, 0xd0, 0x73, 0xd3, 0xae, + 0xa0, 0x65, 0x9d, 0xaa, 0xb3, 0x6f, 0xa9, 0x55, 0x4f, 0x21, 0x0b, 0x96, 0x22, 0xf7, 0x5d, 0xa2, + 0x4f, 0x25, 0x22, 0x26, 0xdf, 0x5f, 0xda, 0x79, 0x39, 0x1b, 0xb0, 0x18, 0xef, 0x10, 0x9a, 0xe1, + 0xab, 0xaf, 0xd0, 0xd5, 0x4c, 0xd7, 0xea, 0xb1, 0xd1, 0x3e, 0x35, 0xc7, 0x15, 0x7c, 0x94, 0x31, + 0x5a, 0xd1, 0x3b, 0x18, 0xd1, 0xcb, 0x33, 0xba, 0x08, 0x33, 0xe1, 0x2b, 0x19, 0xa1, 0xc5, 0x90, + 0xbf, 0x48, 0x19, 0x23, 0x76, 0xe9, 0x5d, 0x9c, 0xff, 0xfd, 0x8e, 0xd2, 0x6e, 0xe4, 0xeb, 0xdc, + 0x9c, 0x03, 0x43, 0x0c, 0xff, 0x2d, 0x76, 0x14, 0x34, 0xe9, 0xda, 0x38, 0xf4, 0x6a, 0x5a, 0x87, + 0x53, 0xee, 0xbc, 0xeb, 0x7c, 0x7a, 0x3e, 0x24, 0x31, 0x91, 0x5f, 0x65, 0x47, 0x38, 0x13, 0xee, + 0x5d, 0x43, 0xdd, 0xb4, 0x2e, 0xd3, 0xaf, 0x95, 0xeb, 0xbc, 0x3a, 0x17, 0x8e, 0x98, 0x85, 0x1b, + 0xbd, 0xf1, 0xd2, 0x97, 0xd3, 0x9b, 0x19, 0x18, 0xe9, 0xb8, 0x42, 0xda, 0x83, 0xa5, 0xc8, 0xad, + 0x1b, 0x29, 0x22, 0x95, 0x7c, 0x37, 0x47, 0x67, 0x7a, 0x86, 0x8d, 0xc9, 0x6c, 0xe4, 0xd8, 0x26, + 0x4a, 0x15, 0x8c, 0x84, 0xc3, 0x9d, 0x9d, 0x97, 0xb3, 0x01, 0x8b, 0x0f, 0xf2, 0x60, 0x39, 0xf2, + 0x72, 0xb7, 0x8b, 0x5e, 0x99, 0x63, 0xc4, 0xdd, 0x6e, 0xe7, 0xda, 0x3c, 0x63, 0xee, 0x76, 0xd5, + 0x53, 0xe8, 0x11, 0xd5, 0xea, 0x91, 0x83, 0x7f, 0x28, 0xb5, 0x9f, 0xe4, 0x43, 0x8e, 0x9d, 0xeb, + 0x99, 0xe1, 0xc5, 0xe7, 0x7e, 0x02, 0x2b, 0x09, 0xe7, 0x34, 0xd1, 0xf5, 0x19, 0x2c, 0x13, 0x3d, + 0xa6, 0xda, 0xb9, 0x91, 0x1d, 0x41, 0xb2, 0x2b, 0x2d, 0x7f, 0x6e, 0xef, 0x0c, 0x87, 0xcc, 0xd8, + 0x5f, 0x4b, 0x37, 0x9d, 0x21, 0xc0, 0xd4, 0x4f, 0x4e, 0x85, 0x17, 0xc3, 0xfe, 0x32, 0xa0, 0xed, + 0x03, 0xfb, 0x11, 0xad, 0xa5, 0x19, 0x4c, 0x78, 0x61, 0xc6, 0x14, 0x0b, 0x1a, 0x07, 0x4e, 0x15, + 0xd4, 0xa9, 0x38, 0x62, 0x02, 0x7d, 0x80, 0xf7, 0xb0, 0x77, 0x0f, 0x7b, 0x0e, 0xd1, 0x10, 0x97, + 0xd3, 0xbf, 0x80, 0x83, 0xf8, 0xc3, 0x5d, 0xc9, 0x00, 0x29, 0x13, 0xf7, 0x9e, 0x6e, 0x4d, 0xf4, + 0xa1, 0x74, 0xbf, 0x52, 0x1a, 0x71, 0xa3, 0x80, 0xb3, 0x88, 0x1b, 0x87, 0x17, 0xc3, 0xfe, 0x82, + 0x70, 0x88, 0xa4, 0xca, 0xff, 0x59, 0x0e, 0x51, 0xfc, 0xf0, 0x62, 0xdc, 0x20, 0x4c, 0xc1, 0x10, + 0x83, 0x7f, 0x43, 0xa1, 0xa7, 0x8e, 0x23, 0x00, 0x5f, 0x32, 0xbd, 0x83, 0xad, 0xa1, 0x6e, 0xb9, + 0xd9, 0xa6, 0x41, 0x41, 0xe7, 0x9a, 0x06, 0xc7, 0x10, 0xd3, 0x38, 0x80, 0x46, 0xa8, 0xe8, 0x1d, + 0x25, 0x6f, 0xaa, 0x25, 0x9d, 0x18, 0xe8, 0x5c, 0xcd, 0x02, 0x2a, 0x46, 0xfa, 0x08, 0x1a, 0xa1, + 0xda, 0xa8, 0x94, 0x91, 0x92, 0xea, 0xa7, 0xe2, 0x8a, 0x31, 0x22, 0x39, 0x51, 0xe2, 0x3e, 0x02, + 0x14, 0xaf, 0xe6, 0x45, 0x59, 0xeb, 0xc0, 0xa7, 0xab, 0xa8, 0xf4, 0x32, 0x61, 0x66, 0x01, 0x22, + 0x35, 0xf4, 0x69, 0x26, 0x26, 0xf1, 0x60, 0x40, 0x8a, 0x05, 0x48, 0x29, 0xcb, 0x57, 0x4f, 0x21, + 0x1b, 0x4e, 0xa7, 0x14, 0x18, 0xa7, 0x78, 0x15, 0xd3, 0xcb, 0x91, 0x67, 0x9b, 0x38, 0x31, 0x60, + 0xac, 0x7e, 0x78, 0xea, 0x80, 0x69, 0xd5, 0xc6, 0xb3, 0x07, 0x1c, 0xc0, 0x4a, 0x42, 0xa9, 0x6b, + 0x8a, 0xd2, 0x4f, 0x2f, 0x8a, 0x9d, 0x3d, 0xd0, 0x47, 0xd0, 0xb9, 0xed, 0xd8, 0xba, 0xd1, 0xd7, + 0x5d, 0x8f, 0x16, 0xa0, 0x92, 0xc0, 0xd8, 0x77, 0xa5, 0xd2, 0x7c, 0xef, 0xc4, 0x42, 0xd5, 0xd9, + 0x63, 0xed, 0x43, 0x8d, 0x92, 0x82, 0xdd, 0xb3, 0x8d, 0xd2, 0x94, 0xa5, 0x04, 0x93, 0x2a, 0x73, + 0x49, 0xa0, 0x82, 0x3d, 0xbe, 0x0c, 0xb5, 0x75, 0x7a, 0xca, 0x65, 0x93, 0x44, 0x8c, 0x71, 0xf5, + 0x4d, 0x03, 0xc9, 0x6b, 0x12, 0x48, 0xe6, 0x2f, 0xd8, 0x05, 0xa0, 0x1f, 0xcf, 0x3a, 0x7e, 0x29, + 0xb9, 0xe3, 0x00, 0x62, 0x8e, 0x55, 0x68, 0x50, 0x4f, 0xda, 0xc0, 0x8f, 0x99, 0xf8, 0x5c, 0x4d, + 0xee, 0x3a, 0x04, 0x94, 0x1a, 0x85, 0x24, 0xc2, 0x4a, 0xc6, 0x75, 0x55, 0x76, 0x2c, 0xc5, 0x90, + 0x37, 0x53, 0xbb, 0x89, 0xc1, 0xfa, 0x23, 0x77, 0xe7, 0x41, 0x91, 0x95, 0xaf, 0x3f, 0xb7, 0x4d, + 0x7a, 0xcb, 0xf9, 0x95, 0xe9, 0x1f, 0x20, 0xfb, 0x8a, 0x57, 0xb3, 0x80, 0x8a, 0x91, 0x76, 0xa0, + 0x4a, 0xf7, 0x45, 0xe9, 0x6a, 0x5d, 0x4a, 0x46, 0x15, 0x00, 0xf3, 0x2c, 0xd6, 0x06, 0x76, 0xfb, + 0x8e, 0xb9, 0xc7, 0x19, 0x2c, 0x65, 0x52, 0x21, 0xa0, 0x19, 0x8b, 0x15, 0x81, 0x15, 0x5f, 0x70, + 0x44, 0x8d, 0xb5, 0x20, 0x23, 0x57, 0x72, 0xd7, 0x67, 0xaf, 0x78, 0x58, 0xc1, 0xdd, 0xc8, 0x8e, + 0x20, 0x86, 0xfe, 0x3a, 0xbb, 0x9f, 0x9f, 0x02, 0xdc, 0x9e, 0x98, 0x43, 0xc3, 0x4f, 0x27, 0xa1, + 0xee, 0xf4, 0xde, 0x42, 0xc0, 0x53, 0x1c, 0xb1, 0x29, 0x38, 0x62, 0x12, 0x06, 0xd4, 0xee, 0x9a, + 0x2e, 0x83, 0xc1, 0x6e, 0x9a, 0x28, 0x4b, 0x20, 0xa9, 0x9e, 0x58, 0x02, 0xa4, 0x18, 0xe5, 0xe7, + 0x59, 0x0a, 0x8c, 0x56, 0x6e, 0xa3, 0x17, 0x53, 0xb7, 0x65, 0xe4, 0xaa, 0xf1, 0xce, 0xa5, 0x59, + 0x60, 0xa2, 0x77, 0x13, 0x56, 0x93, 0x2a, 0xb5, 0x53, 0x62, 0xf0, 0x29, 0x45, 0xdd, 0xb3, 0x59, + 0x73, 0x9b, 0x7f, 0x88, 0xe7, 0xd8, 0xc3, 0x69, 0x1f, 0x22, 0xed, 0x65, 0xcd, 0xee, 0x14, 0x43, + 0x85, 0xe5, 0x1d, 0x77, 0xbb, 0x71, 0x67, 0x22, 0xb2, 0x13, 0xcc, 0x3b, 0xdd, 0xe4, 0xad, 0x9d, + 0x97, 0x66, 0xc2, 0x0b, 0x32, 0x7d, 0x8d, 0x86, 0x75, 0xac, 0x59, 0xb0, 0xda, 0xcd, 0x69, 0x09, + 0xac, 0x30, 0xec, 0x14, 0xa5, 0x94, 0x8e, 0x22, 0x46, 0x77, 0x38, 0xa3, 0xd1, 0xf7, 0x09, 0x6e, + 0x84, 0xe8, 0x44, 0x82, 0x8a, 0x7e, 0xec, 0xcb, 0xd9, 0x90, 0xfc, 0x31, 0xbb, 0x3f, 0x6a, 0x42, + 0xc5, 0x5f, 0xe8, 0xa7, 0x90, 0xa7, 0x7c, 0x4a, 0x49, 0xc3, 0x1e, 0x2c, 0x45, 0xae, 0xb0, 0x4e, + 0x71, 0x33, 0x92, 0x2f, 0xba, 0x9e, 0xcd, 0xaf, 0x3f, 0xc7, 0xff, 0x53, 0x98, 0x08, 0xd2, 0xaf, + 0xa4, 0xa7, 0x1e, 0xa3, 0xf1, 0xf9, 0xcc, 0xce, 0x7f, 0x36, 0x42, 0x53, 0x0d, 0x40, 0x0a, 0x4a, + 0x9f, 0xcf, 0x70, 0x8a, 0x7b, 0x36, 0xe5, 0x3e, 0x4e, 0x8c, 0x3b, 0x3f, 0x35, 0xeb, 0x28, 0xfc, + 0xec, 0x38, 0x21, 0x3d, 0xda, 0xfc, 0xff, 0x50, 0x97, 0xaf, 0xc4, 0x41, 0x29, 0xff, 0x18, 0x29, + 0x7e, 0x6b, 0xce, 0xec, 0xaf, 0x79, 0x04, 0x28, 0x7e, 0xfe, 0x2d, 0x25, 0xd6, 0x4a, 0x3d, 0x79, + 0x97, 0x12, 0x6b, 0xa5, 0x1f, 0xac, 0x93, 0xb8, 0x7b, 0x46, 0xe8, 0x9a, 0xf4, 0x0f, 0xd7, 0x66, + 0x7f, 0xd5, 0x01, 0xac, 0xdd, 0xb7, 0x3d, 0x73, 0xff, 0x28, 0x7a, 0x78, 0x25, 0x25, 0xbf, 0x96, + 0x76, 0x7a, 0x26, 0x8b, 0x1c, 0x9d, 0xa3, 0xce, 0x7b, 0xda, 0x29, 0x19, 0x94, 0xed, 0xc0, 0x4d, + 0xe7, 0x56, 0xa6, 0x79, 0x25, 0x28, 0xfc, 0x6d, 0xa8, 0x8a, 0x42, 0xa2, 0x94, 0xc1, 0xa2, 0xf5, + 0xe8, 0xb3, 0xbf, 0xea, 0x43, 0xc9, 0x54, 0xaa, 0xb3, 0x2b, 0xe2, 0x67, 0x77, 0x78, 0x08, 0xcd, + 0x70, 0xd5, 0x6e, 0xca, 0xfe, 0x44, 0x62, 0xfd, 0x7c, 0xca, 0xfe, 0x44, 0x72, 0x19, 0xb0, 0x7a, + 0x0a, 0xed, 0x41, 0x4d, 0x2a, 0xb9, 0x8c, 0x87, 0x37, 0x01, 0x76, 0x78, 0x98, 0xcb, 0xb3, 0x01, + 0xc5, 0x18, 0x0f, 0x00, 0x82, 0x52, 0x45, 0x74, 0x29, 0x35, 0xd7, 0x30, 0x1f, 0x9d, 0x6e, 0xbf, + 0xfa, 0x95, 0x9b, 0x03, 0xd3, 0x3b, 0x98, 0xec, 0x91, 0x37, 0xd7, 0x19, 0xf0, 0x2b, 0xa6, 0xcd, + 0x7f, 0x5d, 0xf7, 0x55, 0xeb, 0x75, 0x8a, 0x7f, 0x9d, 0x8c, 0x32, 0xde, 0xdb, 0x2b, 0xd1, 0xa7, + 0x57, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x35, 0xde, 0x70, 0x9d, 0x73, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/v2.2/gen_proto.sh b/proto/v2.2/gen_proto.sh index 455eb0e..8bd0aa9 100755 --- a/proto/v2.2/gen_proto.sh +++ b/proto/v2.2/gen_proto.sh @@ -19,7 +19,13 @@ case ":$PATH:" in esac echo "using protoc-gen-go: $(which protoc-gen-go)" -protoc=/home/yangxuan/Github/milvus/cmake_build/bin/protoc + +if ! [ -x "$(which protoc )" ]; then + if [ -z "${protoc}" ]; then + echo 'Error: protoc is not found. please set you protoc by export protoc=/path_to_milvus/cmake_build/bin/protoc' >&2 + exit 1 + fi +fi mkdir -p commonpb mkdir -p milvuspb diff --git a/proto/v2.2/milvuspb/milvus.pb.go b/proto/v2.2/milvuspb/milvus.pb.go index 5fe5832..c3dc089 100644 --- a/proto/v2.2/milvuspb/milvus.pb.go +++ b/proto/v2.2/milvuspb/milvus.pb.go @@ -377,7 +377,6 @@ func (m *DescribeAliasRequest) GetAlias() string { return "" } -// // Describe alias response type DescribeAliasResponse struct { // Response status @@ -498,7 +497,6 @@ func (m *ListAliasesRequest) GetCollectionName() string { return "" } -// // List aliases response type ListAliasesResponse struct { // Response status @@ -564,7 +562,7 @@ func (m *ListAliasesResponse) GetAliases() []string { return nil } -//* +// * // Create collection in milvus type CreateCollectionRequest struct { // Not useful for now @@ -667,7 +665,7 @@ func (m *CreateCollectionRequest) GetNumPartitions() int64 { return 0 } -//* +// * // Drop collection in milvus, also will drop data in collection. type DropCollectionRequest struct { // Not useful for now @@ -726,7 +724,7 @@ func (m *DropCollectionRequest) GetCollectionName() string { return "" } -//* +// * // Alter collection in milvus type AlterCollectionRequest struct { // Not useful for now @@ -801,7 +799,7 @@ func (m *AlterCollectionRequest) GetProperties() []*commonpb.KeyValuePair { return nil } -//* +// * // Check collection exist in milvus or not. type HasCollectionRequest struct { // Not useful for now @@ -963,7 +961,7 @@ func (m *StringResponse) GetValue() string { return "" } -//* +// * // Get collection meta datas like: schema, collectionID, shards number ... type DescribeCollectionRequest struct { // Not useful for now @@ -1040,7 +1038,7 @@ func (m *DescribeCollectionRequest) GetTimeStamp() uint64 { return 0 } -//* +// * // DescribeCollection Response type DescribeCollectionResponse struct { // Contain error_code and reason @@ -1205,7 +1203,7 @@ func (m *DescribeCollectionResponse) GetNumPartitions() int64 { return 0 } -//* +// * // Load collection data into query nodes, then you can do vector search on this collection. type LoadCollectionRequest struct { // Not useful for now @@ -1291,7 +1289,7 @@ func (m *LoadCollectionRequest) GetRefresh() bool { return false } -//* +// * // Release collection data from query nodes, then you can't do vector search on this collection. type ReleaseCollectionRequest struct { // Not useful for now @@ -1350,7 +1348,7 @@ func (m *ReleaseCollectionRequest) GetCollectionName() string { return "" } -//* +// * // Get statistics like row_count. // WARNING: This API is experimental and not useful for now. type GetStatisticsRequest struct { @@ -1428,7 +1426,7 @@ func (m *GetStatisticsRequest) GetGuaranteeTimestamp() uint64 { return 0 } -//* +// * // Will return statistics in stats field like [{key:"row_count",value:"1"}] // WARNING: This API is experimental and not useful for now. type GetStatisticsResponse struct { @@ -1480,7 +1478,7 @@ func (m *GetStatisticsResponse) GetStats() []*commonpb.KeyValuePair { return nil } -//* +// * // Get collection statistics like row_count. type GetCollectionStatisticsRequest struct { // Not useful for now @@ -1539,7 +1537,7 @@ func (m *GetCollectionStatisticsRequest) GetCollectionName() string { return "" } -//* +// * // Will return collection statistics in stats field like [{key:"row_count",value:"1"}] type GetCollectionStatisticsResponse struct { // Contain error_code and reason @@ -1590,7 +1588,6 @@ func (m *GetCollectionStatisticsResponse) GetStats() []*commonpb.KeyValuePair { return nil } -// // List collections type ShowCollectionsRequest struct { // Not useful for now @@ -1669,7 +1666,6 @@ func (m *ShowCollectionsRequest) GetCollectionNames() []string { return nil } -// // Return basic collection infos. type ShowCollectionsResponse struct { // Contain error_code and reason @@ -1767,7 +1763,6 @@ func (m *ShowCollectionsResponse) GetQueryServiceAvailable() []bool { return nil } -// // Create partition in created collection. type CreatePartitionRequest struct { // Not useful for now @@ -1835,7 +1830,6 @@ func (m *CreatePartitionRequest) GetPartitionName() string { return "" } -// // Drop partition in created collection. type DropPartitionRequest struct { // Not useful for now @@ -1903,7 +1897,6 @@ func (m *DropPartitionRequest) GetPartitionName() string { return "" } -// // Check if partition exist in collection or not. type HasPartitionRequest struct { // Not useful for now @@ -1971,7 +1964,6 @@ func (m *HasPartitionRequest) GetPartitionName() string { return "" } -// // Load specific partitions data of one collection into query nodes // Then you can get these data as result when you do vector search on this collection. type LoadPartitionsRequest struct { @@ -2067,7 +2059,6 @@ func (m *LoadPartitionsRequest) GetRefresh() bool { return false } -// // Release specific partitions data of one collection from query nodes. // Then you can not get these data as result when you do vector search on this collection. type ReleasePartitionsRequest struct { @@ -2136,7 +2127,6 @@ func (m *ReleasePartitionsRequest) GetPartitionNames() []string { return nil } -// // Get partition statistics like row_count. type GetPartitionStatisticsRequest struct { // Not useful for now @@ -2251,7 +2241,6 @@ func (m *GetPartitionStatisticsResponse) GetStats() []*commonpb.KeyValuePair { return nil } -// // List all partitions for particular collection type ShowPartitionsRequest struct { // Not useful for now @@ -2339,7 +2328,6 @@ func (m *ShowPartitionsRequest) GetType() ShowType { return ShowType_All } -// // List all partitions for particular collection response. // The returned datas are all rows, we can format to columns by therir index. type ShowPartitionsResponse struct { @@ -2657,7 +2645,6 @@ func (m *ShowSegmentsResponse) GetSegmentIDs() []int64 { return nil } -// // Create index for vector datas type CreateIndexRequest struct { // Not useful for now @@ -2743,7 +2730,6 @@ func (m *CreateIndexRequest) GetIndexName() string { return "" } -// // Alter index type AlterIndexRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` @@ -2816,7 +2802,6 @@ func (m *AlterIndexRequest) GetExtraParams() []*commonpb.KeyValuePair { return nil } -// // Get created index information. // Current release of Milvus only supports showing latest built index. type DescribeIndexRequest struct { @@ -2902,7 +2887,6 @@ func (m *DescribeIndexRequest) GetTimestamp() uint64 { return 0 } -// // Index informations type IndexDescription struct { // Index name @@ -3013,7 +2997,6 @@ func (m *IndexDescription) GetPendingIndexRows() int64 { return 0 } -// // Describe index response type DescribeIndexResponse struct { // Response status @@ -3064,8 +3047,7 @@ func (m *DescribeIndexResponse) GetIndexDescriptions() []*IndexDescription { return nil } -// -// Get index building progress +// Get index building progress type GetIndexBuildProgressRequest struct { // Not useful for now Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` @@ -4544,6 +4526,7 @@ func (m *VectorIDs) GetPartitionNames() []string { type VectorsArray struct { // Types that are valid to be assigned to Array: + // // *VectorsArray_IdArray // *VectorsArray_DataArray Array isVectorsArray_Array `protobuf_oneof:"array"` @@ -4690,6 +4673,7 @@ type CalcDistanceResults struct { // num(op_left)*num(op_right) distance values, "HAMMIN" return integer distance // // Types that are valid to be assigned to Array: + // // *CalcDistanceResults_IntDist // *CalcDistanceResults_FloatDist Array isCalcDistanceResults_Array `protobuf_oneof:"array"` @@ -5664,7 +5648,6 @@ func (m *GetComponentStatesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetComponentStatesRequest proto.InternalMessageInfo -// // Do load balancing operation from src_nodeID to dst_nodeID. type LoadBalanceRequest struct { Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` diff --git a/proto/v2.2/proxypb/proxy.pb.go b/proto/v2.2/proxypb/proxy.pb.go index 5365f94..43ef84b 100644 --- a/proto/v2.2/proxypb/proxy.pb.go +++ b/proto/v2.2/proxypb/proxy.pb.go @@ -29,8 +29,9 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type InvalidateCollMetaCacheRequest struct { // MsgType: - // DropCollection -> {meta cache, dml channels} - // Other -> {meta cache} + // + // DropCollection -> {meta cache, dml channels} + // Other -> {meta cache} Base *commonpb.MsgBase `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` DbName string `protobuf:"bytes,2,opt,name=db_name,json=dbName,proto3" json:"db_name,omitempty"` CollectionName string `protobuf:"bytes,3,opt,name=collection_name,json=collectionName,proto3" json:"collection_name,omitempty"` diff --git a/proto/v2.2/rootcoordpb/root_coord.pb.go b/proto/v2.2/rootcoordpb/root_coord.pb.go index 4f5680e..9052062 100644 --- a/proto/v2.2/rootcoordpb/root_coord.pb.go +++ b/proto/v2.2/rootcoordpb/root_coord.pb.go @@ -880,28 +880,28 @@ type RootCoordClient interface { GetComponentStates(ctx context.Context, in *milvuspb.GetComponentStatesRequest, opts ...grpc.CallOption) (*milvuspb.ComponentStates, error) GetTimeTickChannel(ctx context.Context, in *internalpb.GetTimeTickChannelRequest, opts ...grpc.CallOption) (*milvuspb.StringResponse, error) GetStatisticsChannel(ctx context.Context, in *internalpb.GetStatisticsChannelRequest, opts ...grpc.CallOption) (*milvuspb.StringResponse, error) - //* + // * // @brief This method is used to create collection // // @param CreateCollectionRequest, use to provide collection information to be created. // // @return Status CreateCollection(ctx context.Context, in *milvuspb.CreateCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - //* + // * // @brief This method is used to delete collection. // // @param DropCollectionRequest, collection name is going to be deleted. // // @return Status DropCollection(ctx context.Context, in *milvuspb.DropCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - //* + // * // @brief This method is used to test collection existence. // // @param HasCollectionRequest, collection name is going to be tested. // // @return BoolResponse HasCollection(ctx context.Context, in *milvuspb.HasCollectionRequest, opts ...grpc.CallOption) (*milvuspb.BoolResponse, error) - //* + // * // @brief This method is used to get collection schema. // // @param DescribeCollectionRequest, target collection name. @@ -914,28 +914,28 @@ type RootCoordClient interface { AlterAlias(ctx context.Context, in *milvuspb.AlterAliasRequest, opts ...grpc.CallOption) (*commonpb.Status, error) DescribeAlias(ctx context.Context, in *milvuspb.DescribeAliasRequest, opts ...grpc.CallOption) (*milvuspb.DescribeAliasResponse, error) ListAliases(ctx context.Context, in *milvuspb.ListAliasesRequest, opts ...grpc.CallOption) (*milvuspb.ListAliasesResponse, error) - //* + // * // @brief This method is used to list all collections. // // @return StringListResponse, collection name list ShowCollections(ctx context.Context, in *milvuspb.ShowCollectionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowCollectionsResponse, error) AlterCollection(ctx context.Context, in *milvuspb.AlterCollectionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - //* + // * // @brief This method is used to create partition // // @return Status CreatePartition(ctx context.Context, in *milvuspb.CreatePartitionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - //* + // * // @brief This method is used to drop partition // // @return Status DropPartition(ctx context.Context, in *milvuspb.DropPartitionRequest, opts ...grpc.CallOption) (*commonpb.Status, error) - //* + // * // @brief This method is used to test partition existence. // // @return BoolResponse HasPartition(ctx context.Context, in *milvuspb.HasPartitionRequest, opts ...grpc.CallOption) (*milvuspb.BoolResponse, error) - //* + // * // @brief This method is used to show partition information // // @param ShowPartitionRequest, target collection name. @@ -943,7 +943,7 @@ type RootCoordClient interface { // @return StringListResponse ShowPartitions(ctx context.Context, in *milvuspb.ShowPartitionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowPartitionsResponse, error) ShowPartitionsInternal(ctx context.Context, in *milvuspb.ShowPartitionsRequest, opts ...grpc.CallOption) (*milvuspb.ShowPartitionsResponse, error) - // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} + // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} ShowSegments(ctx context.Context, in *milvuspb.ShowSegmentsRequest, opts ...grpc.CallOption) (*milvuspb.ShowSegmentsResponse, error) AllocTimestamp(ctx context.Context, in *AllocTimestampRequest, opts ...grpc.CallOption) (*AllocTimestampResponse, error) AllocID(ctx context.Context, in *AllocIDRequest, opts ...grpc.CallOption) (*AllocIDResponse, error) @@ -1413,28 +1413,28 @@ type RootCoordServer interface { GetComponentStates(context.Context, *milvuspb.GetComponentStatesRequest) (*milvuspb.ComponentStates, error) GetTimeTickChannel(context.Context, *internalpb.GetTimeTickChannelRequest) (*milvuspb.StringResponse, error) GetStatisticsChannel(context.Context, *internalpb.GetStatisticsChannelRequest) (*milvuspb.StringResponse, error) - //* + // * // @brief This method is used to create collection // // @param CreateCollectionRequest, use to provide collection information to be created. // // @return Status CreateCollection(context.Context, *milvuspb.CreateCollectionRequest) (*commonpb.Status, error) - //* + // * // @brief This method is used to delete collection. // // @param DropCollectionRequest, collection name is going to be deleted. // // @return Status DropCollection(context.Context, *milvuspb.DropCollectionRequest) (*commonpb.Status, error) - //* + // * // @brief This method is used to test collection existence. // // @param HasCollectionRequest, collection name is going to be tested. // // @return BoolResponse HasCollection(context.Context, *milvuspb.HasCollectionRequest) (*milvuspb.BoolResponse, error) - //* + // * // @brief This method is used to get collection schema. // // @param DescribeCollectionRequest, target collection name. @@ -1447,28 +1447,28 @@ type RootCoordServer interface { AlterAlias(context.Context, *milvuspb.AlterAliasRequest) (*commonpb.Status, error) DescribeAlias(context.Context, *milvuspb.DescribeAliasRequest) (*milvuspb.DescribeAliasResponse, error) ListAliases(context.Context, *milvuspb.ListAliasesRequest) (*milvuspb.ListAliasesResponse, error) - //* + // * // @brief This method is used to list all collections. // // @return StringListResponse, collection name list ShowCollections(context.Context, *milvuspb.ShowCollectionsRequest) (*milvuspb.ShowCollectionsResponse, error) AlterCollection(context.Context, *milvuspb.AlterCollectionRequest) (*commonpb.Status, error) - //* + // * // @brief This method is used to create partition // // @return Status CreatePartition(context.Context, *milvuspb.CreatePartitionRequest) (*commonpb.Status, error) - //* + // * // @brief This method is used to drop partition // // @return Status DropPartition(context.Context, *milvuspb.DropPartitionRequest) (*commonpb.Status, error) - //* + // * // @brief This method is used to test partition existence. // // @return BoolResponse HasPartition(context.Context, *milvuspb.HasPartitionRequest) (*milvuspb.BoolResponse, error) - //* + // * // @brief This method is used to show partition information // // @param ShowPartitionRequest, target collection name. @@ -1476,7 +1476,7 @@ type RootCoordServer interface { // @return StringListResponse ShowPartitions(context.Context, *milvuspb.ShowPartitionsRequest) (*milvuspb.ShowPartitionsResponse, error) ShowPartitionsInternal(context.Context, *milvuspb.ShowPartitionsRequest) (*milvuspb.ShowPartitionsResponse, error) - // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} + // rpc DescribeSegment(milvus.DescribeSegmentRequest) returns (milvus.DescribeSegmentResponse) {} ShowSegments(context.Context, *milvuspb.ShowSegmentsRequest) (*milvuspb.ShowSegmentsResponse, error) AllocTimestamp(context.Context, *AllocTimestampRequest) (*AllocTimestampResponse, error) AllocID(context.Context, *AllocIDRequest) (*AllocIDResponse, error) diff --git a/proto/v2.2/schemapb/schema.pb.go b/proto/v2.2/schemapb/schema.pb.go index b6d1456..289c3fe 100644 --- a/proto/v2.2/schemapb/schema.pb.go +++ b/proto/v2.2/schemapb/schema.pb.go @@ -22,7 +22,7 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package -//* +// * // @brief Field data type type DataType int32 @@ -125,7 +125,7 @@ func (FieldState) EnumDescriptor() ([]byte, []int) { return fileDescriptor_1c5fb4d8cc22d66a, []int{1} } -//* +// * // @brief Field schema type FieldSchema struct { FieldID int64 `protobuf:"varint,1,opt,name=fieldID,proto3" json:"fieldID,omitempty"` @@ -271,7 +271,7 @@ func (m *FieldSchema) GetIsClusteringKey() bool { return false } -//* +// * // @brief Collection schema type CollectionSchema struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -715,6 +715,7 @@ func (m *JSONArray) GetData() [][]byte { type ValueField struct { // Types that are valid to be assigned to Data: + // // *ValueField_BoolData // *ValueField_IntData // *ValueField_LongData @@ -870,6 +871,7 @@ func (*ValueField) XXX_OneofWrappers() []interface{} { type ScalarField struct { // Types that are valid to be assigned to Data: + // // *ScalarField_BoolData // *ScalarField_IntData // *ScalarField_LongData @@ -1106,6 +1108,7 @@ type VectorField struct { // For sparse vector, dim is the max dimension of the current batch of vectors Dim int64 `protobuf:"varint,1,opt,name=dim,proto3" json:"dim,omitempty"` // Types that are valid to be assigned to Data: + // // *VectorField_FloatVector // *VectorField_BinaryVector // *VectorField_Float16Vector @@ -1240,6 +1243,7 @@ type FieldData struct { Type DataType `protobuf:"varint,1,opt,name=type,proto3,enum=milvus.protov2.schema.DataType" json:"type,omitempty"` FieldName string `protobuf:"bytes,2,opt,name=field_name,json=fieldName,proto3" json:"field_name,omitempty"` // Types that are valid to be assigned to Field: + // // *FieldData_Scalars // *FieldData_Vectors Field isFieldData_Field `protobuf_oneof:"field"` @@ -1350,6 +1354,7 @@ func (*FieldData) XXX_OneofWrappers() []interface{} { type IDs struct { // Types that are valid to be assigned to IdField: + // // *IDs_IntId // *IDs_StrId IdField isIDs_IdField `protobuf_oneof:"id_field"` diff --git a/rules.go b/rules.go new file mode 100644 index 0000000..5bc3422 --- /dev/null +++ b/rules.go @@ -0,0 +1,409 @@ +// Licensed to the LF AI & Data foundation under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gorules + +import ( + "github.com/quasilyte/go-ruleguard/dsl" +) + +// This is a collection of rules for ruleguard: https://github.com/quasilyte/go-ruleguard + +// Remove extra conversions: mdempsky/unconvert +func unconvert(m dsl.Matcher) { + m.Match("int($x)").Where(m["x"].Type.Is("int") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + + m.Match("float32($x)").Where(m["x"].Type.Is("float32") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("float64($x)").Where(m["x"].Type.Is("float64") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + + // m.Match("byte($x)").Where(m["x"].Type.Is("byte")).Report("unnecessary conversion").Suggest("$x") + // m.Match("rune($x)").Where(m["x"].Type.Is("rune")).Report("unnecessary conversion").Suggest("$x") + m.Match("bool($x)").Where(m["x"].Type.Is("bool") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + + m.Match("int8($x)").Where(m["x"].Type.Is("int8") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("int16($x)").Where(m["x"].Type.Is("int16") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("int32($x)").Where(m["x"].Type.Is("int32") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("int64($x)").Where(m["x"].Type.Is("int64") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + + m.Match("uint8($x)").Where(m["x"].Type.Is("uint8") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("uint16($x)").Where(m["x"].Type.Is("uint16") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("uint32($x)").Where(m["x"].Type.Is("uint32") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + m.Match("uint64($x)").Where(m["x"].Type.Is("uint64") && !m["x"].Const).Report("unnecessary conversion").Suggest("$x") + + m.Match("time.Duration($x)").Where(m["x"].Type.Is("time.Duration") && !m["x"].Text.Matches("^[0-9]*$")).Report("unnecessary conversion").Suggest("$x") +} + +// Don't use == or != with time.Time +// https://github.com/dominikh/go-tools/issues/47 : Wontfix +func timeeq(m dsl.Matcher) { + m.Match("$t0 == $t1").Where(m["t0"].Type.Is("time.Time")).Report("using == with time.Time") + m.Match("$t0 != $t1").Where(m["t0"].Type.Is("time.Time")).Report("using != with time.Time") + m.Match(`map[$k]$v`).Where(m["k"].Type.Is("time.Time")).Report("map with time.Time keys are easy to misuse") +} + +// err but no an error +func errnoterror(m dsl.Matcher) { + // Would be easier to check for all err identifiers instead, but then how do we get the type from m[] ? + + m.Match( + "if $*_, err := $x; $err != nil { $*_ } else if $_ { $*_ }", + "if $*_, err := $x; $err != nil { $*_ } else { $*_ }", + "if $*_, err := $x; $err != nil { $*_ }", + + "if $*_, err = $x; $err != nil { $*_ } else if $_ { $*_ }", + "if $*_, err = $x; $err != nil { $*_ } else { $*_ }", + "if $*_, err = $x; $err != nil { $*_ }", + + "$*_, err := $x; if $err != nil { $*_ } else if $_ { $*_ }", + "$*_, err := $x; if $err != nil { $*_ } else { $*_ }", + "$*_, err := $x; if $err != nil { $*_ }", + + "$*_, err = $x; if $err != nil { $*_ } else if $_ { $*_ }", + "$*_, err = $x; if $err != nil { $*_ } else { $*_ }", + "$*_, err = $x; if $err != nil { $*_ }", + ). + Where(m["err"].Text == "err" && !m["err"].Type.Is("error") && m["x"].Text != "recover()"). + Report("err variable not error type") +} + +// Identical if and else bodies +func ifbodythenbody(m dsl.Matcher) { + m.Match("if $*_ { $body } else { $body }"). + Report("identical if and else bodies") + + // Lots of false positives. + // m.Match("if $*_ { $body } else if $*_ { $body }"). + // Report("identical if and else bodies") +} + +// Odd inequality: A - B < 0 instead of != +// Too many false positives. +/* +func subtractnoteq(m dsl.Matcher) { + m.Match("$a - $b < 0").Report("consider $a != $b") + m.Match("$a - $b > 0").Report("consider $a != $b") + m.Match("0 < $a - $b").Report("consider $a != $b") + m.Match("0 > $a - $b").Report("consider $a != $b") +} +*/ + +// Self-assignment +func selfassign(m dsl.Matcher) { + m.Match("$x = $x").Report("useless self-assignment") +} + +// Odd nested ifs +func oddnestedif(m dsl.Matcher) { + m.Match("if $x { if $x { $*_ }; $*_ }", + "if $x == $y { if $x != $y {$*_ }; $*_ }", + "if $x != $y { if $x == $y {$*_ }; $*_ }", + "if $x { if !$x { $*_ }; $*_ }", + "if !$x { if $x { $*_ }; $*_ }"). + Report("odd nested ifs") + + m.Match("for $x { if $x { $*_ }; $*_ }", + "for $x == $y { if $x != $y {$*_ }; $*_ }", + "for $x != $y { if $x == $y {$*_ }; $*_ }", + "for $x { if !$x { $*_ }; $*_ }", + "for !$x { if $x { $*_ }; $*_ }"). + Report("odd nested for/ifs") +} + +// odd bitwise expressions +func oddbitwise(m dsl.Matcher) { + m.Match("$x | $x", + "$x | ^$x", + "^$x | $x"). + Report("odd bitwise OR") + + m.Match("$x & $x", + "$x & ^$x", + "^$x & $x"). + Report("odd bitwise AND") + + m.Match("$x &^ $x"). + Report("odd bitwise AND-NOT") +} + +// odd sequence of if tests with return +func ifreturn(m dsl.Matcher) { + m.Match("if $x { return $*_ }; if $x {$*_ }").Report("odd sequence of if test") + m.Match("if $x { return $*_ }; if !$x {$*_ }").Report("odd sequence of if test") + m.Match("if !$x { return $*_ }; if $x {$*_ }").Report("odd sequence of if test") + m.Match("if $x == $y { return $*_ }; if $x != $y {$*_ }").Report("odd sequence of if test") + m.Match("if $x != $y { return $*_ }; if $x == $y {$*_ }").Report("odd sequence of if test") +} + +func oddifsequence(m dsl.Matcher) { + /* + m.Match("if $x { $*_ }; if $x {$*_ }").Report("odd sequence of if test") + + m.Match("if $x == $y { $*_ }; if $y == $x {$*_ }").Report("odd sequence of if tests") + m.Match("if $x != $y { $*_ }; if $y != $x {$*_ }").Report("odd sequence of if tests") + + m.Match("if $x < $y { $*_ }; if $y > $x {$*_ }").Report("odd sequence of if tests") + m.Match("if $x <= $y { $*_ }; if $y >= $x {$*_ }").Report("odd sequence of if tests") + + m.Match("if $x > $y { $*_ }; if $y < $x {$*_ }").Report("odd sequence of if tests") + m.Match("if $x >= $y { $*_ }; if $y <= $x {$*_ }").Report("odd sequence of if tests") + */ +} + +// odd sequence of nested if tests +func nestedifsequence(m dsl.Matcher) { + /* + m.Match("if $x < $y { if $x >= $y {$*_ }; $*_ }").Report("odd sequence of nested if tests") + m.Match("if $x <= $y { if $x > $y {$*_ }; $*_ }").Report("odd sequence of nested if tests") + m.Match("if $x > $y { if $x <= $y {$*_ }; $*_ }").Report("odd sequence of nested if tests") + m.Match("if $x >= $y { if $x < $y {$*_ }; $*_ }").Report("odd sequence of nested if tests") + */ +} + +// odd sequence of assignments +func identicalassignments(m dsl.Matcher) { + m.Match("$x = $y; $y = $x").Report("odd sequence of assignments") +} + +func oddcompoundop(m dsl.Matcher) { + m.Match("$x += $x + $_", + "$x += $x - $_"). + Report("odd += expression") + + m.Match("$x -= $x + $_", + "$x -= $x - $_"). + Report("odd -= expression") +} + +func constswitch(m dsl.Matcher) { + m.Match("switch $x { $*_ }", "switch $*_; $x { $*_ }"). + Where(m["x"].Const && !m["x"].Text.Matches(`^runtime\.`)). + Report("constant switch") +} + +func oddcomparisons(m dsl.Matcher) { + m.Match( + "$x - $y == 0", + "$x - $y != 0", + "$x - $y < 0", + "$x - $y <= 0", + "$x - $y > 0", + "$x - $y >= 0", + "$x ^ $y == 0", + "$x ^ $y != 0", + ).Report("odd comparison") +} + +func oddmathbits(m dsl.Matcher) { + m.Match( + "64 - bits.LeadingZeros64($x)", + "32 - bits.LeadingZeros32($x)", + "16 - bits.LeadingZeros16($x)", + "8 - bits.LeadingZeros8($x)", + ).Report("odd math/bits expression: use bits.Len*() instead?") +} + +// func floateq(m dsl.Matcher) { +// m.Match( +// "$x == $y", +// "$x != $y", +// ). +// Where(m["x"].Type.Is("float32") && !m["x"].Const && !m["y"].Text.Matches("0(.0+)?") && !m.File().Name.Matches("floating_comparision.go")). +// Report("floating point tested for equality") + +// m.Match( +// "$x == $y", +// "$x != $y", +// ). +// Where(m["x"].Type.Is("float64") && !m["x"].Const && !m["y"].Text.Matches("0(.0+)?") && !m.File().Name.Matches("floating_comparision.go")). +// Report("floating point tested for equality") + +// m.Match("switch $x { $*_ }", "switch $*_; $x { $*_ }"). +// Where(m["x"].Type.Is("float32")). +// Report("floating point as switch expression") + +// m.Match("switch $x { $*_ }", "switch $*_; $x { $*_ }"). +// Where(m["x"].Type.Is("float64")). +// Report("floating point as switch expression") + +// } + +func badexponent(m dsl.Matcher) { + m.Match( + "2 ^ $x", + "10 ^ $x", + ). + Report("caret (^) is not exponentiation") +} + +func floatloop(m dsl.Matcher) { + m.Match( + "for $i := $x; $i < $y; $i += $z { $*_ }", + "for $i = $x; $i < $y; $i += $z { $*_ }", + ). + Where(m["i"].Type.Is("float64")). + Report("floating point for loop counter") + + m.Match( + "for $i := $x; $i < $y; $i += $z { $*_ }", + "for $i = $x; $i < $y; $i += $z { $*_ }", + ). + Where(m["i"].Type.Is("float32")). + Report("floating point for loop counter") +} + +func urlredacted(m dsl.Matcher) { + m.Match( + "log.Println($x, $*_)", + "log.Println($*_, $x, $*_)", + "log.Println($*_, $x)", + "log.Printf($*_, $x, $*_)", + "log.Printf($*_, $x)", + + "log.Println($x, $*_)", + "log.Println($*_, $x, $*_)", + "log.Println($*_, $x)", + "log.Printf($*_, $x, $*_)", + "log.Printf($*_, $x)", + ). + Where(m["x"].Type.Is("*url.URL")). + Report("consider $x.Redacted() when outputting URLs") +} + +func sprinterr(m dsl.Matcher) { + m.Match(`fmt.Sprint($err)`, + `fmt.Sprintf("%s", $err)`, + `fmt.Sprintf("%v", $err)`, + ). + Where(m["err"].Type.Is("error")). + Report("maybe call $err.Error() instead of fmt.Sprint()?") +} + +// disable this check, because it can not apply to generic type +//func largeloopcopy(m dsl.Matcher) { +// m.Match( +// `for $_, $v := range $_ { $*_ }`, +// ). +// Where(m["v"].Type.Size > 1024). +// Report(`loop copies large value each iteration`) +//} + +func joinpath(m dsl.Matcher) { + m.Match( + `strings.Join($_, "/")`, + `strings.Join($_, "\\")`, + "strings.Join($_, `\\`)", + ). + Report(`did you mean path.Join() or filepath.Join() ?`) +} + +func readfull(m dsl.Matcher) { + m.Match(`$n, $err := io.ReadFull($_, $slice) + if $err != nil || $n != len($slice) { + $*_ + }`, + `$n, $err := io.ReadFull($_, $slice) + if $n != len($slice) || $err != nil { + $*_ + }`, + `$n, $err = io.ReadFull($_, $slice) + if $err != nil || $n != len($slice) { + $*_ + }`, + `$n, $err = io.ReadFull($_, $slice) + if $n != len($slice) || $err != nil { + $*_ + }`, + `if $n, $err := io.ReadFull($_, $slice); $n != len($slice) || $err != nil { + $*_ + }`, + `if $n, $err := io.ReadFull($_, $slice); $err != nil || $n != len($slice) { + $*_ + }`, + `if $n, $err = io.ReadFull($_, $slice); $n != len($slice) || $err != nil { + $*_ + }`, + `if $n, $err = io.ReadFull($_, $slice); $err != nil || $n != len($slice) { + $*_ + }`, + ).Report("io.ReadFull() returns err == nil iff n == len(slice)") +} + +func nilerr(m dsl.Matcher) { + m.Match( + `if err == nil { return err }`, + `if err == nil { return $*_, err }`, + ). + Report(`return nil error instead of nil value`) +} + +func mailaddress(m dsl.Matcher) { + m.Match( + "fmt.Sprintf(`\"%s\" <%s>`, $NAME, $EMAIL)", + "fmt.Sprintf(`\"%s\"<%s>`, $NAME, $EMAIL)", + "fmt.Sprintf(`%s <%s>`, $NAME, $EMAIL)", + "fmt.Sprintf(`%s<%s>`, $NAME, $EMAIL)", + `fmt.Sprintf("\"%s\"<%s>", $NAME, $EMAIL)`, + `fmt.Sprintf("\"%s\" <%s>", $NAME, $EMAIL)`, + `fmt.Sprintf("%s<%s>", $NAME, $EMAIL)`, + `fmt.Sprintf("%s <%s>", $NAME, $EMAIL)`, + ). + Report("use net/mail Address.String() instead of fmt.Sprintf()"). + Suggest("(&mail.Address{Name:$NAME, Address:$EMAIL}).String()") +} + +func errnetclosed(m dsl.Matcher) { + m.Match( + `strings.Contains($err.Error(), $text)`, + ). + Where(m["text"].Text.Matches("\".*closed network connection.*\"")). + Report(`String matching against error texts is fragile; use net.ErrClosed instead`). + Suggest(`errors.Is($err, net.ErrClosed)`) +} + +func httpheaderadd(m dsl.Matcher) { + m.Match( + `$H.Add($KEY, $VALUE)`, + ). + Where(m["H"].Type.Is("http.Header")). + Report("use http.Header.Set method instead of Add to overwrite all existing header values"). + Suggest(`$H.Set($KEY, $VALUE)`) +} + +func hmacnew(m dsl.Matcher) { + m.Match("hmac.New(func() hash.Hash { return $x }, $_)", + `$f := func() hash.Hash { return $x } + $*_ + hmac.New($f, $_)`, + ).Where(m["x"].Pure). + Report("invalid hash passed to hmac.New()") +} + +func writestring(m dsl.Matcher) { + m.Match(`io.WriteString($w, string($b))`). + Where(m["b"].Type.Is("[]byte")). + Suggest("$w.Write($b)") +} + +func badlock(m dsl.Matcher) { + // Shouldn't give many false positives without type filter + // as Lock+Unlock pairs in combination with defer gives us pretty + // a good chance to guess correctly. If we constrain the type to sync.Mutex + // then it'll be harder to match embedded locks and custom methods + // that may forward the call to the sync.Mutex (or other synchronization primitive). + + m.Match(`$mu.Lock(); defer $mu.RUnlock()`).Report(`maybe $mu.RLock() was intended?`) + m.Match(`$mu.RLock(); defer $mu.Unlock()`).Report(`maybe $mu.Lock() was intended?`) +} diff --git a/states/autocomplete/auto_complete_file.go b/states/autocomplete/auto_complete_file.go index 804c36a..61bf133 100644 --- a/states/autocomplete/auto_complete_file.go +++ b/states/autocomplete/auto_complete_file.go @@ -24,7 +24,6 @@ func (c *fileCandidate) NextCandidates(_ []acCandidate) []acCandidate { } func (c *fileCandidate) Suggest(target cComp) map[string]string { - ctag := target.cTag var err error if strings.HasPrefix(ctag, "~") { diff --git a/states/backup_mock_connect.go b/states/backup_mock_connect.go index 80ba2ba..0464cee 100644 --- a/states/backup_mock_connect.go +++ b/states/backup_mock_connect.go @@ -12,15 +12,16 @@ import ( "github.com/cockroachdb/errors" "github.com/golang/protobuf/proto" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/server/v3/embed" + "go.etcd.io/etcd/server/v3/etcdserver/api/v3client" + "github.com/milvus-io/birdwatcher/configs" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd" "github.com/milvus-io/birdwatcher/states/etcd/remove" "github.com/milvus-io/birdwatcher/states/etcd/show" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "go.etcd.io/etcd/server/v3/embed" - "go.etcd.io/etcd/server/v3/etcdserver/api/v3client" ) const ( @@ -171,7 +172,6 @@ func (s *embedEtcdMockState) readWorkspaceMeta(path string) { } func getEmbedEtcdInstance(server *embed.Etcd, cli *clientv3.Client, instanceName string, config *configs.Config) State { - basePath := path.Join(instanceName, metaPath) state := &embedEtcdMockState{ @@ -213,7 +213,6 @@ func getPrintMetricsCmd(state *embedEtcdMockState) *cobra.Command { Use: "print-metrics", Short: "print metrics restored from backup file", Run: func(cmd *cobra.Command, args []string) { - node, err := cmd.Flags().GetString("node") if err != nil { fmt.Println(err.Error()) @@ -257,7 +256,6 @@ func getListMetricsNodeCmd(state *embedEtcdMockState) *cobra.Command { cmd.Flags().String("node", "", "select node metrics to print") return cmd - } func readFixLengthHeader[T proto.Message](rd *bufio.Reader, header T) error { diff --git a/states/balance_explain.go b/states/balance_explain.go index 2a101d5..c4c3191 100644 --- a/states/balance_explain.go +++ b/states/balance_explain.go @@ -6,15 +6,15 @@ import ( "sort" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" ) const ( @@ -33,7 +33,7 @@ func ExplainBalanceCommand(cli clientv3.KV, basePath string) *cobra.Command { Use: "explain-balance", Short: "explain segments and channels current balance status", RunE: func(cmd *cobra.Command, args []string) error { - //0. set up collection, policy, servers and params + // 0. set up collection, policy, servers and params collectionID, err := cmd.Flags().GetInt64(collectionLabel) if err != nil { collectionID = 0 @@ -43,7 +43,7 @@ func ExplainBalanceCommand(cli clientv3.KV, basePath string) *cobra.Command { policyName = scoreBasedBalancePolicy } - //1. set up segment distribution view, replicas and segmentInfos + // 1. set up segment distribution view, replicas and segmentInfos sessions, err := ListServers(cli, basePath, queryNode) if err != nil { return err @@ -59,9 +59,9 @@ func ExplainBalanceCommand(cli clientv3.KV, basePath string) *cobra.Command { fmt.Printf("no replicas available for collection %d, cannot explain balance \n", collectionID) return nil } - segmentsInfos, err := common.ListSegmentsVersion(context.Background(), cli, basePath, etcdversion.GetVersion()) + segmentsInfos, _ := common.ListSegmentsVersion(context.Background(), cli, basePath, etcdversion.GetVersion()) - //2. explain balance + // 2. explain balance explainPolicy := policies[policyName] globalFactor, err := cmd.Flags().GetFloat64(globalRowCountFactorLabel) if err != nil { @@ -76,8 +76,10 @@ func ExplainBalanceCommand(cli clientv3.KV, basePath string) *cobra.Command { reverseTolerationFactor = 1.3 } reports := explainPolicy(distView, replicas, segmentsInfos, - &ScoreBalanceParam{globalFactor, unbalanceTolerationFactor, - reverseTolerationFactor}) + &ScoreBalanceParam{ + globalFactor, unbalanceTolerationFactor, + reverseTolerationFactor, + }) fmt.Println("explain balance reports:") for _, report := range reports { fmt.Print(report) @@ -137,7 +139,8 @@ type segmentDistExplainFunc func(dist map[int64][]*querypbv2.SegmentVersionInfo, segmentInfos []*models.Segment, scoreBalanceParam *ScoreBalanceParam) []string func scoreBasedBalanceExplain(dist map[int64][]*querypbv2.SegmentVersionInfo, replicas []*models.Replica, - segmentInfos []*models.Segment, scoreBalanceParam *ScoreBalanceParam) []string { + segmentInfos []*models.Segment, scoreBalanceParam *ScoreBalanceParam, +) []string { fmt.Printf("replica count:%d \n", len(replicas)) segmentInfoMap := make(map[int64]*models.Segment, len(segmentInfos)) for _, seg := range segmentInfos { @@ -146,7 +149,7 @@ func scoreBasedBalanceExplain(dist map[int64][]*querypbv2.SegmentVersionInfo, re sort.Slice(replicas, func(i, j int) bool { return (replicas)[i].ID <= (replicas)[j].ID }) - //generate explanation reports for scoreBasedBalance + // generate explanation reports for scoreBasedBalance reports := make([]string, 0) for _, replica := range replicas { if replica != nil { @@ -181,7 +184,8 @@ type ScoreBalanceParam struct { } func explainReplica(replica *models.Replica, dist map[int64][]*querypbv2.SegmentVersionInfo, - segmentInfoMap map[int64]*models.Segment, param *ScoreBalanceParam) string { + segmentInfoMap map[int64]*models.Segment, param *ScoreBalanceParam, +) string { nodeItems := make([]*NodeItem, 0, len(replica.NodeIDs)) for _, nodeID := range replica.NodeIDs { nodeSegments := dist[nodeID] @@ -206,8 +210,10 @@ func explainReplica(replica *models.Replica, dist map[int64][]*querypbv2.Segment } } priority := int64(param.globalRowCountFactor*float64(nodeRowSum)) + nodeCollectionRowSum - nodeItems = append(nodeItems, &NodeItem{nodeID, priority, - nodeCollectionSegments, nodeRowSum, nodeCollectionRowSum}) + nodeItems = append(nodeItems, &NodeItem{ + nodeID, priority, + nodeCollectionSegments, nodeRowSum, nodeCollectionRowSum, + }) } sort.Slice(nodeItems, func(i, j int) bool { return nodeItems[i].priority <= nodeItems[j].priority @@ -220,7 +226,7 @@ func explainReplica(replica *models.Replica, dist map[int64][]*querypbv2.Segment report += fmt.Sprintf("[node: %d, priority: %d, node_row_sum: %d, node_collection_row_sum: %d]\n", item.nodeID, item.priority, item.nodeRowSum, item.nodeCollectionRowSum) } - //calculate unbalance rate + // calculate unbalance rate toNode, fromNode := nodeItems[0], nodeItems[len(nodeItems)-1] unbalanceDiff := fromNode.priority - toNode.priority continueBalance := false diff --git a/states/binlog.go b/states/binlog.go index 41504fd..1462e4e 100644 --- a/states/binlog.go +++ b/states/binlog.go @@ -8,13 +8,14 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/minio/minio-go/v7" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/milvus-io/birdwatcher/storage" - "github.com/minio/minio-go/v7" - "github.com/samber/lo" ) type ScanBinlogsParam struct { @@ -126,7 +127,8 @@ func (s *InstanceState) TestScanBinlogsCommand(ctx context.Context, p *ScanBinlo // ScanBinlogs scans provided segment with delete record excluded. func (s *InstanceState) ScanBinlogs(ctx context.Context, minioClient *minio.Client, bucketName string, rootPath string, collection *models.Collection, segment *models.Segment, - selectField func(fieldID int64) bool, fn func(map[int64]*storage.BinlogReader)) { + selectField func(fieldID int64) bool, fn func(map[int64]*storage.BinlogReader), +) { pkField, has := lo.Find(collection.Schema.Fields, func(field models.FieldSchema) bool { return field.IsPrimaryKey }) diff --git a/states/check_partition_key.go b/states/check_partition_key.go index a2396cb..106ce93 100644 --- a/states/check_partition_key.go +++ b/states/check_partition_key.go @@ -11,14 +11,15 @@ import ( "github.com/cockroachdb/errors" "github.com/gosuri/uilive" + "github.com/minio/minio-go/v7" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/milvus-io/birdwatcher/storage" - "github.com/minio/minio-go/v7" - "github.com/samber/lo" ) type CheckPartitionKeyParam struct { @@ -125,7 +126,6 @@ func (s *InstanceState) CheckPartitionKeyCommand(ctx context.Context, p *CheckPa segments, err := common.ListSegmentsVersion(ctx, s.client, s.basePath, etcdversion.GetVersion(), func(segment *models.Segment) bool { return segment.CollectionID == collection.ID }) - if err != nil { return err } @@ -268,7 +268,6 @@ func (s *InstanceState) CheckPartitionKeyCommand(ctx context.Context, p *CheckPa } else { fmt.Printf("Collection %s found %d partition key error\n", collection.Schema.Name, collectionErrs) } - } return nil } diff --git a/states/configuration.go b/states/configuration.go index e806b67..e63231a 100644 --- a/states/configuration.go +++ b/states/configuration.go @@ -6,6 +6,10 @@ import ( "fmt" "strings" + "github.com/samber/lo" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" @@ -13,9 +17,6 @@ import ( querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" rootcoordpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/rootcoordpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/samber/lo" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type GetConfigurationParam struct { diff --git a/states/consume.go b/states/consume.go index b32e02b..9f3b72a 100644 --- a/states/consume.go +++ b/states/consume.go @@ -7,6 +7,7 @@ import ( "github.com/cockroachdb/errors" "github.com/golang/protobuf/proto" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/mq" "github.com/milvus-io/birdwatcher/mq/ifc" @@ -28,7 +29,6 @@ type ConsumeParam struct { } func (s *InstanceState) ConsumeCommand(ctx context.Context, p *ConsumeParam) error { - var messageID ifc.MessageID switch p.StartPosition { case "cp": @@ -61,7 +61,6 @@ func (s *InstanceState) ConsumeCommand(ctx context.Context, p *ConsumeParam) err c, err := mq.NewConsumer(p.MqType, p.MqAddress, p.Topic, ifc.MqOption{ SubscriptionInitPos: subPos, }) - if err != nil { return err } @@ -124,7 +123,8 @@ func (s *InstanceState) ConsumeCommand(ctx context.Context, p *ConsumeParam) err func ParseMsg(msgType commonpb.MsgType, payload []byte) (interface { fmt.Stringer GetShardName() string -}, error) { +}, error, +) { var msg interface { proto.Message GetShardName() string diff --git a/states/current_version.go b/states/current_version.go index f655112..44f4a7a 100644 --- a/states/current_version.go +++ b/states/current_version.go @@ -5,10 +5,11 @@ import ( "fmt" "github.com/cockroachdb/errors" + "github.com/spf13/cobra" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" ) // CurrentVersionCommand returns command for show current-version. diff --git a/states/disconnected.go b/states/disconnected.go index 61324c9..5979d9e 100644 --- a/states/disconnected.go +++ b/states/disconnected.go @@ -1,8 +1,9 @@ package states import ( - "github.com/milvus-io/birdwatcher/configs" "github.com/spf13/cobra" + + "github.com/milvus-io/birdwatcher/configs" ) type disconnectState struct { diff --git a/states/distribution.go b/states/distribution.go index c03d1ff..071b3c1 100644 --- a/states/distribution.go +++ b/states/distribution.go @@ -5,14 +5,15 @@ import ( "fmt" "time" - commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" - querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/samber/lo" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + + commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" + querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) // GetDistributionCommand returns command to iterate all querynodes to list distribution. diff --git a/states/download_pk.go b/states/download_pk.go index aae09c1..2d030d4 100644 --- a/states/download_pk.go +++ b/states/download_pk.go @@ -10,13 +10,14 @@ import ( "github.com/gosuri/uilive" "github.com/manifoldco/promptui" - "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" - "github.com/milvus-io/birdwatcher/states/etcd/common" - etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" + "github.com/milvus-io/birdwatcher/states/etcd/common" + etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" ) func getDownloadPKCmd(cli clientv3.KV, basePath string) *cobra.Command { @@ -54,7 +55,6 @@ func getDownloadPKCmd(cli clientv3.KV, basePath string) *cobra.Command { segments, err := common.ListSegments(cli, basePath, func(segment *datapb.SegmentInfo) bool { return segment.CollectionID == collectionID }) - if err != nil { return err } @@ -160,7 +160,6 @@ func getMinioClient() (*minio.Client, error) { Creds: cred, Secure: useSSL, }) - if err != nil { return nil, err } @@ -169,7 +168,7 @@ func getMinioClient() (*minio.Client, error) { } func downloadPks(cli *minio.Client, bucketName string, collID, pkID int64, segments []*datapb.SegmentInfo) { - err := os.Mkdir(fmt.Sprintf("%d", collID), 0777) + err := os.Mkdir(fmt.Sprintf("%d", collID), 0o777) if err != nil { fmt.Println("Failed to create folder,", err.Error()) } @@ -188,7 +187,7 @@ func downloadPks(cli *minio.Client, bucketName string, collID, pkID int64, segme } folder := fmt.Sprintf("%d/%d", collID, segment.ID) - err := os.MkdirAll(folder, 0777) + err := os.MkdirAll(folder, 0o777) if err != nil { fmt.Println("Failed to create sub-folder", err.Error()) return @@ -216,9 +215,7 @@ func downloadPks(cli *minio.Client, bucketName string, collID, pkID int64, segme } progress := (i + 1) * 100 / len(segments) fmt.Fprintf(pd, pf, progress, i+1, len(segments)) - } fmt.Println() fmt.Printf("pk file download completed for collection :%d, %d file(s) downloaded\n", collID, count) - } diff --git a/states/download_segment.go b/states/download_segment.go index ddd05c3..3802448 100644 --- a/states/download_segment.go +++ b/states/download_segment.go @@ -11,11 +11,12 @@ import ( "time" "github.com/manifoldco/promptui" + "github.com/minio/minio-go/v7" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/minio/minio-go/v7" ) type DownloadSegmentParam struct { @@ -62,7 +63,7 @@ func (s *InstanceState) downloadSegment(ctx context.Context, minioClient *minio. for _, fieldBinlog := range segment.GetBinlogs() { folder := fmt.Sprintf("%s/%d", p, fieldBinlog.FieldID) - err := os.MkdirAll(folder, 0777) + err := os.MkdirAll(folder, 0o777) if err != nil { fmt.Println("Failed to create sub-folder", err.Error()) return err @@ -103,7 +104,6 @@ func getMinioAccess() (*minio.Client, string, error) { if err != nil { fmt.Println("cannot get minio client", err.Error()) return nil, "", err - } exists, err := minioClient.BucketExists(context.Background(), bucketName) if !exists { diff --git a/states/etcd/audit/audit.go b/states/etcd/audit/audit.go index d191742..79643f5 100644 --- a/states/etcd/audit/audit.go +++ b/states/etcd/audit/audit.go @@ -5,8 +5,9 @@ import ( "fmt" "os" - "github.com/milvus-io/birdwatcher/models" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" ) type FileAuditKV struct { diff --git a/states/etcd/audit/audit_write.go b/states/etcd/audit/audit_write.go index 2811a5d..c1f850b 100644 --- a/states/etcd/audit/audit_write.go +++ b/states/etcd/audit/audit_write.go @@ -5,8 +5,9 @@ import ( "fmt" "github.com/golang/protobuf/proto" - "github.com/milvus-io/birdwatcher/models" "go.etcd.io/etcd/api/v3/mvccpb" + + "github.com/milvus-io/birdwatcher/models" ) func (c *FileAuditKV) writeHeader(op models.AuditOpType, entriesNum int32) { diff --git a/states/etcd/common/alias.go b/states/etcd/common/alias.go index a36845f..a1ed435 100644 --- a/states/etcd/common/alias.go +++ b/states/etcd/common/alias.go @@ -5,10 +5,11 @@ import ( "errors" "path" - "github.com/milvus-io/birdwatcher/models" - etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" ) const ( diff --git a/states/etcd/common/channel.go b/states/etcd/common/channel.go index 364a9fd..2cc21d2 100644 --- a/states/etcd/common/channel.go +++ b/states/etcd/common/channel.go @@ -9,6 +9,9 @@ import ( "time" "github.com/golang/protobuf/proto" + "github.com/samber/lo" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/proto/v2.0/internalpb" @@ -16,8 +19,6 @@ import ( datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" msgpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/msgpb" schemapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/schemapb" - "github.com/samber/lo" - clientv3 "go.etcd.io/etcd/client/v3" ) // ListChannelWatchV1 list v2.1 channel watch info meta. @@ -50,7 +51,6 @@ func ListChannelWatch(ctx context.Context, cli clientv3.KV, basePath string, ver } result = lo.Map(infos, func(info datapb.ChannelWatchInfo, idx int) *models.ChannelWatch { return models.GetChannelWatchInfo[*datapb.ChannelWatchInfo, datapb.ChannelWatchState, *datapb.VchannelInfo, *internalpb.MsgPosition](&info, paths[idx]) - }) case models.GTEVersion2_2: infos, paths, err := ListProtoObjects[datapbv2.ChannelWatchInfo](ctx, cli, prefix) diff --git a/states/etcd/common/collection.go b/states/etcd/common/collection.go index 1b076b8..9039159 100644 --- a/states/etcd/common/collection.go +++ b/states/etcd/common/collection.go @@ -11,14 +11,15 @@ import ( "time" "github.com/golang/protobuf/proto" + "github.com/samber/lo" + "go.etcd.io/etcd/api/v3/mvccpb" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/etcdpb" "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" schemapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/schemapb" - "github.com/samber/lo" - "go.etcd.io/etcd/api/v3/mvccpb" - clientv3 "go.etcd.io/etcd/client/v3" ) const ( @@ -35,6 +36,8 @@ const ( CollectionLoadPrefixV2 = "querycoord-collection-loadinfo" PartitionLoadedPrefixLegacy = "queryCoord-partitionMeta" PartitionLoadedPrefix = "querycoord-partition-loadinfo" + + CompactionTaskPrefix = "datacoord-meta/compaction-task" ) var ( @@ -60,7 +63,6 @@ func ListCollections(cli clientv3.KV, basePath string, filter func(*etcdpb.Colle // ListCollectionsVersion returns collection information as provided version. func ListCollectionsVersion(ctx context.Context, cli clientv3.KV, basePath string, version string, filters ...func(*models.Collection) bool) ([]*models.Collection, error) { - prefixes := []string{ path.Join(basePath, CollectionMetaPrefix), path.Join(basePath, DBCollectionMetaPrefix), @@ -119,7 +121,6 @@ func ListCollectionsVersion(ctx context.Context, cli clientv3.KV, basePath strin // GetCollectionByIDVersion retruns collection info from etcd with provided version & id. func GetCollectionByIDVersion(ctx context.Context, cli clientv3.KV, basePath string, version string, collID int64) (*models.Collection, error) { - var result []*mvccpb.KeyValue // meta before database @@ -184,7 +185,6 @@ func getCollectionFields(ctx context.Context, cli clientv3.KV, basePath string, fmt.Println(err.Error()) } return lo.Map(fields, func(field schemapbv2.FieldSchema, _ int) *schemapbv2.FieldSchema { return &field }), nil - } func FillFieldSchemaIfEmpty(cli clientv3.KV, basePath string, collection *etcdpb.CollectionInfo) error { diff --git a/states/etcd/common/collection_history.go b/states/etcd/common/collection_history.go index 4a94ef0..72b0888 100644 --- a/states/etcd/common/collection_history.go +++ b/states/etcd/common/collection_history.go @@ -7,12 +7,13 @@ import ( "strconv" "strings" - "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/proto/v2.0/etcdpb" - etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/protobuf/runtime/protoiface" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/proto/v2.0/etcdpb" + etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" ) // ListCollectionHistory list collection history from snapshots. @@ -48,7 +49,7 @@ func ListCollectionHistory(ctx context.Context, cli clientv3.KV, basePath string } result = lo.Map(colls, func(coll etcdpbv2.CollectionInfo, idx int) *models.CollectionHistory { ch := &models.CollectionHistory{} - //TODO add history field schema + // TODO add history field schema ch.Collection = *models.NewCollectionFromV2_2(&coll, paths[idx], nil) ch.Ts = parseHistoryTs(paths[idx]) return ch @@ -95,7 +96,6 @@ func ListHistoryCollection[T any, P interface { } func RemoveCollectionHistory(ctx context.Context, cli clientv3.KV, basePath string, version string, collectionID int64) error { - prefix := path.Join(basePath, "snapshots/root-coord/collection", strconv.FormatInt(collectionID, 10)) colls, paths, _, err := ListHistoryCollection[etcdpbv2.CollectionInfo](ctx, cli, prefix) if err != nil { diff --git a/states/etcd/common/collection_loaded.go b/states/etcd/common/collection_loaded.go index 72a187f..358c77f 100644 --- a/states/etcd/common/collection_loaded.go +++ b/states/etcd/common/collection_loaded.go @@ -5,11 +5,12 @@ import ( "errors" "path" + "github.com/samber/lo" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - "github.com/samber/lo" - clientv3 "go.etcd.io/etcd/client/v3" ) // ListCollectionLoadedInfo returns collection loaded info with provided version. diff --git a/states/etcd/common/compaction_task.go b/states/etcd/common/compaction_task.go new file mode 100644 index 0000000..0f392c6 --- /dev/null +++ b/states/etcd/common/compaction_task.go @@ -0,0 +1,39 @@ +package common + +import ( + "context" + "path" + + "github.com/samber/lo" + clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" +) + +// ListCompactionTask returns compaction task information as provided filters. +func ListCompactionTask(ctx context.Context, cli clientv3.KV, basePath string, filters ...func(task *models.CompactionTask) bool) ([]*models.CompactionTask, error) { + prefixes := []string{ + path.Join(basePath, CompactionTaskPrefix), + } + var result []*models.CompactionTask + + for _, prefix := range prefixes { + compactions, keys, err := ListProtoObjectsAdv[datapb.CompactionTask](ctx, cli, prefix, func(_ string, value []byte) bool { + return true + }) + if err != nil { + return nil, err + } + result = append(result, lo.FilterMap(compactions, func(info datapb.CompactionTask, idx int) (*models.CompactionTask, bool) { + c := models.NewCompactionTask(&info, keys[idx]) + for _, filter := range filters { + if !filter(c) { + return nil, false + } + } + return c, true + })...) + } + return result, nil +} diff --git a/states/etcd/common/database.go b/states/etcd/common/database.go index 45fe6fc..240ce15 100644 --- a/states/etcd/common/database.go +++ b/states/etcd/common/database.go @@ -4,10 +4,11 @@ import ( "context" "path" - "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" ) const ( @@ -21,7 +22,6 @@ func ListDatabase(ctx context.Context, cli clientv3.KV, basePath string) ([]*mod dbs, keys, err := ListProtoObjects(ctx, cli, prefix, func(*etcdpb.DatabaseInfo) bool { return true }) - if err != nil { return nil, err } diff --git a/states/etcd/common/index.go b/states/etcd/common/index.go index 3add0b0..beb374e 100644 --- a/states/etcd/common/index.go +++ b/states/etcd/common/index.go @@ -5,9 +5,10 @@ import ( "path" "time" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/proto/v2.0/etcdpb" "github.com/milvus-io/birdwatcher/proto/v2.0/indexpb" - clientv3 "go.etcd.io/etcd/client/v3" ) // ListIndex list all index with all filter satified. diff --git a/states/etcd/common/legacy.go b/states/etcd/common/legacy.go index fc657d6..b3cba14 100644 --- a/states/etcd/common/legacy.go +++ b/states/etcd/common/legacy.go @@ -6,9 +6,10 @@ import ( "time" "github.com/golang/protobuf/proto" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" - clientv3 "go.etcd.io/etcd/client/v3" ) const ( diff --git a/states/etcd/common/partition.go b/states/etcd/common/partition.go index 38d8272..920deb9 100644 --- a/states/etcd/common/partition.go +++ b/states/etcd/common/partition.go @@ -5,10 +5,11 @@ import ( "fmt" "path" - "github.com/milvus-io/birdwatcher/models" - etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + etcdpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/etcdpb" ) const ( @@ -20,7 +21,6 @@ func ListCollectionPartitions(ctx context.Context, cli clientv3.KV, basePath str prefix := path.Join(basePath, PartitionPrefix, fmt.Sprintf("%d", collectionID)) infos, keys, err := ListProtoObjects[etcdpbv2.PartitionInfo](ctx, cli, prefix) - if err != nil { return nil, err } diff --git a/states/etcd/common/partition_loaded.go b/states/etcd/common/partition_loaded.go index 79ba493..29e19d8 100644 --- a/states/etcd/common/partition_loaded.go +++ b/states/etcd/common/partition_loaded.go @@ -5,10 +5,11 @@ import ( "errors" "path" - "github.com/milvus-io/birdwatcher/models" - querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" "github.com/samber/lo" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" ) func ListPartitionLoadedInfo(ctx context.Context, cli clientv3.KV, basePath string, version string, filters ...func(*models.PartitionLoaded) bool) ([]*models.PartitionLoaded, error) { diff --git a/states/etcd/common/replica.go b/states/etcd/common/replica.go index 8042ba1..33dbc4a 100644 --- a/states/etcd/common/replica.go +++ b/states/etcd/common/replica.go @@ -5,10 +5,11 @@ import ( "fmt" "path" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/milvuspb" "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - clientv3 "go.etcd.io/etcd/client/v3" ) // ListReplica list current replica info @@ -53,18 +54,17 @@ func ListReplica(ctx context.Context, cli clientv3.KV, basePath string, collecti ID: r.GetID(), CollectionID: r.GetCollectionID(), NodeIDs: r.GetNodes(), - ResourceGroup: "", //TODO + ResourceGroup: "", // TODO Version: ">=2.2.0", }) } return results, nil - } + func listReplicas(ctx context.Context, cli clientv3.KV, basePath string, filters ...func(*milvuspb.ReplicaInfo) bool) ([]milvuspb.ReplicaInfo, error) { prefix := path.Join(basePath, "queryCoord-ReplicaMeta") replicas, _, err := ListProtoObjects(ctx, cli, prefix, filters...) - if err != nil { return nil, err } diff --git a/states/etcd/common/segment.go b/states/etcd/common/segment.go index 6601259..cb87f34 100644 --- a/states/etcd/common/segment.go +++ b/states/etcd/common/segment.go @@ -8,12 +8,13 @@ import ( "time" "github.com/golang/protobuf/proto" + "github.com/samber/lo" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" - "github.com/samber/lo" - clientv3 "go.etcd.io/etcd/client/v3" ) const ( @@ -309,7 +310,6 @@ func RemoveSegmentByID(ctx context.Context, cli clientv3.KV, basePath string, co } func UpdateSegments(ctx context.Context, cli clientv3.KV, basePath string, collectionID int64, fn func(segment *datapbv2.SegmentInfo)) error { - prefix := path.Join(basePath, fmt.Sprintf("%s/%d", SegmentMetaPrefix, collectionID)) + "/" segments, keys, err := ListProtoObjects[datapbv2.SegmentInfo](ctx, cli, prefix) if err != nil { @@ -329,7 +329,6 @@ func UpdateSegments(ctx context.Context, cli clientv3.KV, basePath string, colle if err != nil { return err } - } return nil } diff --git a/states/etcd/common/session.go b/states/etcd/common/session.go index 44ce7d7..e4c4374 100644 --- a/states/etcd/common/session.go +++ b/states/etcd/common/session.go @@ -6,8 +6,9 @@ import ( "path" "time" - "github.com/milvus-io/birdwatcher/models" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" ) const ( diff --git a/states/etcd/download/distribution.go b/states/etcd/download/distribution.go index bea7b49..f63f027 100644 --- a/states/etcd/download/distribution.go +++ b/states/etcd/download/distribution.go @@ -7,16 +7,17 @@ import ( "os" "time" - "github.com/milvus-io/birdwatcher/models" - commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" - querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - "github.com/milvus-io/birdwatcher/states/etcd/common" - etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/samber/lo" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + + "github.com/milvus-io/birdwatcher/models" + commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" + querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" + "github.com/milvus-io/birdwatcher/states/etcd/common" + etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" ) func PullGlobalDistributionDetails(cli clientv3.KV, basePath string) *cobra.Command { diff --git a/states/etcd/remove/binlog.go b/states/etcd/remove/binlog.go index e53ca75..64f0776 100644 --- a/states/etcd/remove/binlog.go +++ b/states/etcd/remove/binlog.go @@ -148,7 +148,6 @@ func BinlogCommand(cli clientv3.KV, basePath string) *cobra.Command { } fmt.Printf("Remove one binlog %s/%d from etcd succeeds.\n", key, logID) } - }, } diff --git a/states/etcd/remove/channel.go b/states/etcd/remove/channel.go index b49a1e5..a4d5f06 100644 --- a/states/etcd/remove/channel.go +++ b/states/etcd/remove/channel.go @@ -5,11 +5,12 @@ import ( "fmt" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // ChannelCommand returns remove channel command. diff --git a/states/etcd/remove/collection_clean.go b/states/etcd/remove/collection_clean.go index e307cb9..9edf5ad 100644 --- a/states/etcd/remove/collection_clean.go +++ b/states/etcd/remove/collection_clean.go @@ -90,7 +90,8 @@ func CollectionCleanCommand(cli clientv3.KV, basePath string) *cobra.Command { fieldsPrefix, fieldsSnapShotPrefix, partitionsPrefix, - partitionsSnapShotPrefix} + partitionsSnapShotPrefix, + } for _, prefix := range prefixes { fmt.Printf("start cleaning leaked collection meta, prefix: %s\n", prefix) diff --git a/states/etcd/remove/collection_dropping.go b/states/etcd/remove/collection_dropping.go index 5fcf489..b3ea54a 100644 --- a/states/etcd/remove/collection_dropping.go +++ b/states/etcd/remove/collection_dropping.go @@ -5,11 +5,12 @@ import ( "fmt" "path" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // CollectionDropCommand returns `remove collection-drop` command. @@ -65,7 +66,6 @@ func CollectionDropCommand(cli clientv3.KV, basePath string) *cobra.Command { } func cleanCollectionDropMeta(cli clientv3.KV, basePath string, collection *models.Collection, run bool) { - fmt.Println("Clean collection(drop) meta:") var ops []clientv3.Op if collection.Key() == "" { diff --git a/states/etcd/remove/component.go b/states/etcd/remove/component.go index 7c55e06..ba7a059 100644 --- a/states/etcd/remove/component.go +++ b/states/etcd/remove/component.go @@ -1,8 +1,9 @@ package remove import ( - "github.com/milvus-io/birdwatcher/configs" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/configs" ) type ComponentRemove struct { diff --git a/states/etcd/remove/etcd_config.go b/states/etcd/remove/etcd_config.go index baf0591..f6ad24a 100644 --- a/states/etcd/remove/etcd_config.go +++ b/states/etcd/remove/etcd_config.go @@ -4,10 +4,10 @@ import ( "context" "fmt" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/states/etcd/common" ) // EtcdConfigCommand returns set etcd-config command. diff --git a/states/etcd/remove/segment.go b/states/etcd/remove/segment.go index 05a5723..9f062a7 100644 --- a/states/etcd/remove/segment.go +++ b/states/etcd/remove/segment.go @@ -6,10 +6,11 @@ import ( "time" "github.com/golang/protobuf/proto" - "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) // SegmentCommand returns remove segment command. @@ -44,12 +45,12 @@ func SegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { // dry run, display segment first if !run { - //show.PrintSegmentInfo(segments[0], false) + // show.PrintSegmentInfo(segments[0], false) fmt.Printf("segment info %v", segments[0]) return } - //TODO put audit log + // TODO put audit log info := segments[0] backupSegmentInfo(info) fmt.Println("[WARNING] about to remove segment from etcd") @@ -70,7 +71,7 @@ func SegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { func backupSegmentInfo(info *datapb.SegmentInfo) { now := time.Now() filePath := fmt.Sprintf("bw_etcd_segment_%d.%s.bak", info.GetID(), now.Format("060102-150405")) - f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600) if err != nil { fmt.Println("failed to open backup segment file", err.Error()) return diff --git a/states/etcd/remove/segment_collection_dropped.go b/states/etcd/remove/segment_collection_dropped.go index 0b9b4f1..c57be13 100644 --- a/states/etcd/remove/segment_collection_dropped.go +++ b/states/etcd/remove/segment_collection_dropped.go @@ -4,12 +4,13 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // SegmentCollectionDroppedCommand returns `remove collection-drop` command. @@ -30,7 +31,7 @@ func SegmentCollectionDroppedCommand(cli clientv3.KV, basePath string) *cobra.Co } var collections []*models.Collection - collections, err = common.ListCollectionsVersion(context.Background(), cli, basePath, etcdversion.GetVersion(), func(coll *models.Collection) bool { + collections, _ = common.ListCollectionsVersion(context.Background(), cli, basePath, etcdversion.GetVersion(), func(coll *models.Collection) bool { return coll.ID == collectionID }) if len(collections) != 0 { @@ -49,7 +50,7 @@ func SegmentCollectionDroppedCommand(cli clientv3.KV, basePath string) *cobra.Co // dry run, display segment first if !run { - //show.PrintSegmentInfo(segments[0], false) + // show.PrintSegmentInfo(segments[0], false) for _, info := range segments { fmt.Printf("segment %d with collection %d will be removed.\n", info.GetID(), info.GetCollectionID()) } diff --git a/states/etcd/remove/segment_orphan.go b/states/etcd/remove/segment_orphan.go index 6ec208d..4d59f18 100644 --- a/states/etcd/remove/segment_orphan.go +++ b/states/etcd/remove/segment_orphan.go @@ -5,11 +5,12 @@ import ( "errors" "fmt" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/samber/lo" ) type SegmentOrphan struct { diff --git a/states/etcd/repair/add_index_param_retrive_friendly.go b/states/etcd/repair/add_index_param_retrive_friendly.go index 1e79165..99f7037 100644 --- a/states/etcd/repair/add_index_param_retrive_friendly.go +++ b/states/etcd/repair/add_index_param_retrive_friendly.go @@ -3,12 +3,12 @@ package repair import ( "fmt" + "github.com/golang/protobuf/proto" "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" - "github.com/golang/protobuf/proto" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" indexpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/indexpb" - clientv3 "go.etcd.io/etcd/client/v3" ) // AddIndexParamsCommand return repair segment command. diff --git a/states/etcd/repair/channel.go b/states/etcd/repair/channel.go index c345880..3226431 100644 --- a/states/etcd/repair/channel.go +++ b/states/etcd/repair/channel.go @@ -5,13 +5,14 @@ import ( "fmt" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" ) // ChannelCommand returns repair channel command. diff --git a/states/etcd/repair/checkpoint.go b/states/etcd/repair/checkpoint.go index d0539f6..0d2af38 100644 --- a/states/etcd/repair/checkpoint.go +++ b/states/etcd/repair/checkpoint.go @@ -48,11 +48,10 @@ func CheckpointCommand(cli clientv3.KV, basePath string) *cobra.Command { return } - //coll, err := common.GetCollectionByID(cli, basePath, collID) + // coll, err := common.GetCollectionByID(cli, basePath, collID) ctx, cancel := context.WithCancel(context.Background()) defer cancel() coll, err := common.GetCollectionByIDVersion(ctx, cli, basePath, etcdversion.GetVersion(), collID) - if err != nil { fmt.Println("failed to get collection", err.Error()) return diff --git a/states/etcd/repair/collection_legacy.go b/states/etcd/repair/collection_legacy.go index 5fe625d..b4a5f39 100644 --- a/states/etcd/repair/collection_legacy.go +++ b/states/etcd/repair/collection_legacy.go @@ -20,7 +20,6 @@ func (c *ComponentRepair) CollectionLegacyDroppedCommand(ctx context.Context, p collections, err := common.ListCollectionsVersion(ctx, c.client, c.basePath, etcdversion.GetVersion(), func(coll *models.Collection) bool { return coll.DBID == 0 && len(coll.Schema.Fields) == 0 && (p.CollectionID == 0 || p.CollectionID == coll.ID) }) - if err != nil { return err } diff --git a/states/etcd/repair/component.go b/states/etcd/repair/component.go index 9be0eb0..c83e37b 100644 --- a/states/etcd/repair/component.go +++ b/states/etcd/repair/component.go @@ -1,8 +1,9 @@ package repair import ( - "github.com/milvus-io/birdwatcher/configs" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/configs" ) type ComponentRepair struct { diff --git a/states/etcd/repair/index_parmas.go b/states/etcd/repair/index_parmas.go index 99a505d..fd54d84 100644 --- a/states/etcd/repair/index_parmas.go +++ b/states/etcd/repair/index_parmas.go @@ -4,10 +4,10 @@ import ( "fmt" "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" indexpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/indexpb" - clientv3 "go.etcd.io/etcd/client/v3" ) // DiskAnnIndexParamsCommand return repair segment command. diff --git a/states/etcd/repair/manual_compaction.go b/states/etcd/repair/manual_compaction.go index 2133110..0dbad8b 100644 --- a/states/etcd/repair/manual_compaction.go +++ b/states/etcd/repair/manual_compaction.go @@ -5,13 +5,14 @@ import ( "fmt" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/proto/v2.0/milvuspb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" ) func ManualCompactionCommand(cli clientv3.KV, basePath string) *cobra.Command { diff --git a/states/etcd/repair/segment.go b/states/etcd/repair/segment.go index 2b15ec4..2c58891 100644 --- a/states/etcd/repair/segment.go +++ b/states/etcd/repair/segment.go @@ -6,6 +6,9 @@ import ( "path" "github.com/golang/protobuf/proto" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" @@ -13,8 +16,6 @@ import ( "github.com/milvus-io/birdwatcher/proto/v2.0/indexpb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // SegmentCommand return repair segment command. @@ -24,7 +25,6 @@ func SegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { Aliases: []string{"segments"}, Short: "do segment & index meta check and try to repair", Run: func(cmd *cobra.Command, args []string) { - collID, err := cmd.Flags().GetInt64("collection") if err != nil { fmt.Println(err.Error()) @@ -100,17 +100,16 @@ func SegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { segIdxs, ok := seg2Idx[segment.GetID()] if !ok { // skip index check for no index found - //TODO try v2 index information + // TODO try v2 index information continue } coll, ok := collections[segment.CollectionID] if !ok { - //coll, err = common.GetCollectionByID(cli, basePath, segment.CollectionID) + // coll, err = common.GetCollectionByID(cli, basePath, segment.CollectionID) ctx, cancel := context.WithCancel(context.Background()) defer cancel() coll, err := common.GetCollectionByIDVersion(ctx, cli, basePath, etcdversion.GetVersion(), collID) - if err != nil { fmt.Printf("failed to query collection(id=%d) info error: %s", segment.CollectionID, err.Error()) continue @@ -217,7 +216,6 @@ func SegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { fmt.Println("failed to write back repaired segment meta") } } - }, } @@ -270,7 +268,7 @@ func checkBinlogIndex(segment *datapb.SegmentInfo, indexMeta *indexpb.IndexMeta) func integrityCheck(segment *datapb.SegmentInfo) bool { var rowCount int64 - //use 0-th field as base + // use 0-th field as base for _, binlog := range segment.GetBinlogs()[0].GetBinlogs() { rowCount += binlog.EntriesNum } @@ -298,5 +296,4 @@ func writeRepairedSegment(cli clientv3.KV, basePath string, segment *datapb.Segm } _, err = cli.Put(context.Background(), p, string(bs)) return err - } diff --git a/states/etcd/repair/segment_empty.go b/states/etcd/repair/segment_empty.go index 25d346e..64af756 100644 --- a/states/etcd/repair/segment_empty.go +++ b/states/etcd/repair/segment_empty.go @@ -3,11 +3,12 @@ package repair import ( "fmt" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // EmptySegmentCommand returns repair empty-segment command. @@ -41,7 +42,6 @@ func EmptySegmentCommand(cli clientv3.KV, basePath string) *cobra.Command { fmt.Printf("remove segment %d failed, err: %s\n", info.GetID(), err.Error()) } } - } } diff --git a/states/etcd/set/etcd_config.go b/states/etcd/set/etcd_config.go index 3c41eda..727bd64 100644 --- a/states/etcd/set/etcd_config.go +++ b/states/etcd/set/etcd_config.go @@ -4,10 +4,10 @@ import ( "context" "fmt" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/states/etcd/common" ) // EtcdConfigCommand returns set etcd-config command. diff --git a/states/etcd/show/alias.go b/states/etcd/show/alias.go index 7a9e2c3..beaf69b 100644 --- a/states/etcd/show/alias.go +++ b/states/etcd/show/alias.go @@ -6,12 +6,13 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/samber/lo" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/milvus-io/birdwatcher/utils" - "github.com/samber/lo" ) type AliasParam struct { @@ -24,7 +25,6 @@ func (c *ComponentShow) AliasCommand(ctx context.Context, p *AliasParam) (*Alias aliases, err := common.ListAliasVersion(ctx, c.client, c.basePath, etcdversion.GetVersion(), func(a *models.Alias) bool { return p.DBID == -1 || p.DBID == a.DBID }) - if err != nil { return nil, errors.Wrap(err, "failed to list alias info") } diff --git a/states/etcd/show/channel_watched.go b/states/etcd/show/channel_watched.go index 55d0b1b..f5934dd 100644 --- a/states/etcd/show/channel_watched.go +++ b/states/etcd/show/channel_watched.go @@ -7,6 +7,7 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" @@ -54,8 +55,8 @@ func (rs *ChannelsWatched) printChannelWatchInfo(sb *strings.Builder, info *mode fmt.Fprintln(sb, "=============================") fmt.Fprintf(sb, "key: %s\n", info.Key()) fmt.Fprintf(sb, "Channel Name:%s \t WatchState: %s\n", info.Vchan.ChannelName, info.State.String()) - //t, _ := ParseTS(uint64(info.GetStartTs())) - //to, _ := ParseTS(uint64(info.GetTimeoutTs())) + // t, _ := ParseTS(uint64(info.GetStartTs())) + // to, _ := ParseTS(uint64(info.GetTimeoutTs())) t := time.Unix(info.StartTs, 0) to := time.Unix(0, info.TimeoutTs) fmt.Fprintf(sb, "Channel Watch start from: %s, timeout at: %s\n", t.Format(tsPrintFormat), to.Format(tsPrintFormat)) diff --git a/states/etcd/show/checkpoint.go b/states/etcd/show/checkpoint.go index 412bb91..4bd9465 100644 --- a/states/etcd/show/checkpoint.go +++ b/states/etcd/show/checkpoint.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/internalpb" @@ -29,7 +30,7 @@ func (c *ComponentShow) CheckpointCommand(ctx context.Context, p *CheckpointPara checkpoints := make([]*Checkpoint, 0, len(coll.Channels)) for _, channel := range coll.Channels { - var checkpoint = &Checkpoint{ + checkpoint := &Checkpoint{ Channel: &models.Channel{ PhysicalName: channel.PhysicalName, VirtualName: channel.VirtualName, diff --git a/states/etcd/show/collection_loaded.go b/states/etcd/show/collection_loaded.go index 98c4512..d6015b8 100644 --- a/states/etcd/show/collection_loaded.go +++ b/states/etcd/show/collection_loaded.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" diff --git a/states/etcd/show/compaction.go b/states/etcd/show/compaction.go new file mode 100644 index 0000000..018a99b --- /dev/null +++ b/states/etcd/show/compaction.go @@ -0,0 +1,131 @@ +package show + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/milvus-io/birdwatcher/framework" + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/states/etcd/common" +) + +// CompactionCommand returns sub command for showCmd. +// show compaction [options...] +type CompactionTaskParam struct { + framework.ParamBase `use:"show compactions" desc:"list current available compactions from DataCoord"` + CollectionName string `name:"collectionName" default:"" desc:"collection name to display"` + State string `name:"state" default:"" desc:"compaction state to filter"` + CollectionID int64 `name:"collectionID" default:"0" desc:"collection id to filter"` + PartitionID int64 `name:"partitionID" default:"0" desc:"partitionID id to filter"` + TriggerID int64 `name:"triggerID" default:"0" desc:"TriggerID to filter"` + PlanID int64 ` name:"planID" default:"" desc:"PlanID to filter"` + Detail bool `name:"detail" default:"false" desc:"flags indicating whether printing input/result segmentIDs"` +} + +func (c *ComponentShow) CompactionTaskCommand(ctx context.Context, p *CompactionTaskParam) (*CompactionTasks, error) { + var compactionTasks []*models.CompactionTask + var err error + var total int64 + + // perform get by id to accelerate + + compactionTasks, err = common.ListCompactionTask(ctx, c.client, c.basePath, func(task *models.CompactionTask) bool { + total++ + if p.CollectionName != "" && task.GetSchema().GetName() != p.CollectionName { + return false + } + if p.CollectionID > 0 && task.GetCollectionID() != p.CollectionID { + return false + } + if p.PartitionID > 0 && task.GetPartitionID() != p.PartitionID { + return false + } + if p.TriggerID > 0 && task.GetTriggerID() != p.TriggerID { + return false + } + + if p.PlanID > 0 && task.GetPlanID() != p.TriggerID { + return false + } + if p.State != "" && !strings.EqualFold(p.State, task.GetState().String()) { + return false + } + return true + }) + + if err != nil { + return nil, err + } + return &CompactionTasks{ + tasks: compactionTasks, + total: total, + param: p, + }, nil +} + +type CompactionTasks struct { + tasks []*models.CompactionTask + total int64 + param *CompactionTaskParam +} + +func (rs *CompactionTasks) PrintAs(format framework.Format) string { + switch format { + case framework.FormatDefault, framework.FormatPlain: + sb := &strings.Builder{} + for _, t := range rs.tasks { + if rs.param.Detail { + printCompactionTask(sb, t, rs.param.Detail) + } else { + printCompactionTaskSimple(sb, t) + } + } + fmt.Fprintln(sb, "================================================================================") + fmt.Printf("--- Total compactions: %d\t Matched compactions: %d\n", rs.total, len(rs.tasks)) + return sb.String() + } + return "" +} + +func (rs *CompactionTasks) Entities() any { + return rs.tasks +} + +func printCompactionTaskSimple(sb *strings.Builder, task *models.CompactionTask) { + fmt.Printf("JobID: %d\tTaskID: %d\t Type:%s\t State:%s\n", task.GetTriggerID(), task.GetPlanID(), task.GetType().String(), task.GetState().String()) +} + +func printCompactionTask(sb *strings.Builder, task *models.CompactionTask, detailSegmentIDs bool) { + fmt.Println("================================================================================") + if task.GetPartitionID() != 0 { + fmt.Printf("Collection ID: %d\tCollection Name: %s\t PartitionID:%d\t Channel:%s\n", task.GetCollectionID(), task.GetSchema().GetName(), task.GetPartitionID(), task.GetChannel()) + } else { + fmt.Printf("Collection ID: %d\tCollection Name: %s\t Channel:%s\n", task.GetCollectionID(), task.GetSchema().GetName(), task.GetChannel()) + } + fmt.Printf("JobID: %d\tTaskID: %d\t Type:%s\t State:%s\n", task.GetTriggerID(), task.GetPlanID(), task.GetType().String(), task.GetState().String()) + + t := time.Unix(task.GetStartTime(), 0) + fmt.Printf("Start Time: %s\n", t.Format("2006-01-02 15:04:05")) + if task.GetEndTime() > 0 { + endT := time.Unix(task.GetEndTime(), 0) + fmt.Printf("End Time: %s\n", endT.Format("2006-01-02 15:04:05")) + } + + if task.GetClusteringKeyField() != nil { + fmt.Printf("ClusterField Name:%s\t DataType:%s\n", task.GetClusteringKeyField().GetName(), task.GetClusteringKeyField().GetDataType().String()) + } + + if task.GetNodeID() > 0 { + fmt.Printf("WorkerID :%d\n", task.GetNodeID()) + } + if task.GetTotalRows() > 0 { + fmt.Printf("Total Rows :%d\n", task.GetTotalRows()) + } + + if detailSegmentIDs { + fmt.Printf("Input Segments:%v\n", task.GetInputSegments()) + fmt.Printf("Target Segments:%v\n", task.GetResultSegments()) + } +} diff --git a/states/etcd/show/component.go b/states/etcd/show/component.go index ff6e3ae..1c107c6 100644 --- a/states/etcd/show/component.go +++ b/states/etcd/show/component.go @@ -1,8 +1,9 @@ package show import ( - "github.com/milvus-io/birdwatcher/configs" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/configs" ) type ComponentShow struct { diff --git a/states/etcd/show/database.go b/states/etcd/show/database.go index 49bbf86..77737fc 100644 --- a/states/etcd/show/database.go +++ b/states/etcd/show/database.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" diff --git a/states/etcd/show/legacy_qc_channel.go b/states/etcd/show/legacy_qc_channel.go index f964d9d..b4a54ae 100644 --- a/states/etcd/show/legacy_qc_channel.go +++ b/states/etcd/show/legacy_qc_channel.go @@ -8,12 +8,12 @@ import ( "time" "github.com/golang/protobuf/proto" - "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) const ( @@ -72,7 +72,7 @@ func listQueryCoordUnsubChannelInfos(cli clientv3.KV, basePath string) ([]*query func printDMChannelWatchInfo(infos []*querypb.DmChannelWatchInfo) { common.SortByCollection(infos) for _, info := range infos { - //TODO beautify output + // TODO beautify output fmt.Println(info.String()) } } diff --git a/states/etcd/show/legacy_qc_cluster.go b/states/etcd/show/legacy_qc_cluster.go index 8f5639e..35b25e9 100644 --- a/states/etcd/show/legacy_qc_cluster.go +++ b/states/etcd/show/legacy_qc_cluster.go @@ -4,10 +4,11 @@ import ( "fmt" "path" - "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) const ( diff --git a/states/etcd/show/legacy_qc_task.go b/states/etcd/show/legacy_qc_task.go index 489e8ac..8cae903 100644 --- a/states/etcd/show/legacy_qc_task.go +++ b/states/etcd/show/legacy_qc_task.go @@ -8,7 +8,6 @@ import ( "path/filepath" "sort" "strconv" - "time" "github.com/spf13/cobra" diff --git a/states/etcd/show/legacy_qc_task_model.go b/states/etcd/show/legacy_qc_task_model.go index 31b1dc3..8f90414 100644 --- a/states/etcd/show/legacy_qc_task_model.go +++ b/states/etcd/show/legacy_qc_task_model.go @@ -186,7 +186,7 @@ func unmarshalQueryTask(taskID UniqueID, t string) (queryCoordTask, error) { } newTask = releasePartitionTask case commonpb.MsgType_LoadSegments: - //TODO::trigger condition may be different + // TODO::trigger condition may be different loadReq := querypb.LoadSegmentsRequest{} err = proto.Unmarshal([]byte(t), &loadReq) if err != nil { @@ -199,7 +199,7 @@ func unmarshalQueryTask(taskID UniqueID, t string) (queryCoordTask, error) { } newTask = loadSegmentTask case commonpb.MsgType_ReleaseSegments: - //TODO::trigger condition may be different + // TODO::trigger condition may be different loadReq := querypb.ReleaseSegmentsRequest{} err = proto.Unmarshal([]byte(t), &loadReq) if err != nil { @@ -211,7 +211,7 @@ func unmarshalQueryTask(taskID UniqueID, t string) (queryCoordTask, error) { } newTask = releaseSegmentTask case commonpb.MsgType_WatchDmChannels: - //TODO::trigger condition may be different + // TODO::trigger condition may be different req := querypb.WatchDmChannelsRequest{} err = proto.Unmarshal([]byte(t), &req) if err != nil { @@ -226,10 +226,10 @@ func unmarshalQueryTask(taskID UniqueID, t string) (queryCoordTask, error) { case commonpb.MsgType_WatchDeltaChannels: fmt.Println("legacy WatchDeltaChannels type found, ignore") case commonpb.MsgType_WatchQueryChannels: - //Deprecated WatchQueryChannel + // Deprecated WatchQueryChannel fmt.Println("legacy WatchQueryChannels type found, ignore") case commonpb.MsgType_LoadBalanceSegments: - //TODO::trigger condition may be different + // TODO::trigger condition may be different loadReq := querypb.LoadBalanceRequest{} err = proto.Unmarshal([]byte(t), &loadReq) if err != nil { @@ -528,7 +528,7 @@ func (wdt *watchDmChannelTask) msgBase() *commonpb.MsgBase { func (wdt *watchDmChannelTask) marshal() ([]byte, error) { return nil, nil - //return proto.Marshal(thinWatchDmChannelsRequest(wdt.WatchDmChannelsRequest)) + // return proto.Marshal(thinWatchDmChannelsRequest(wdt.WatchDmChannelsRequest)) } func (wdt *watchDmChannelTask) msgType() commonpb.MsgType { @@ -594,7 +594,7 @@ func (lbt *loadBalanceTask) String() string { ts := lbt.timestamp() time, logic := utils.ParseTS(ts) timeStr := fmt.Sprintf("time:%s, logicTs:%d", time, logic) - ret := fmt.Sprintf("%s\t%s\t%s", baseStr, typeStr, timeStr) //fmt.Sprintf("%s\t%s\t%s\ninfo:%s", baseStr, typeStr, timeStr, lbt.LoadBalanceRequest.String()) + ret := fmt.Sprintf("%s\t%s\t%s", baseStr, typeStr, timeStr) // fmt.Sprintf("%s\t%s\t%s\ninfo:%s", baseStr, typeStr, timeStr, lbt.LoadBalanceRequest.String()) return ret } diff --git a/states/etcd/show/partition.go b/states/etcd/show/partition.go index 0157853..a8218a1 100644 --- a/states/etcd/show/partition.go +++ b/states/etcd/show/partition.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" diff --git a/states/etcd/show/replica.go b/states/etcd/show/replica.go index b89b2bc..dd250ec 100644 --- a/states/etcd/show/replica.go +++ b/states/etcd/show/replica.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" diff --git a/states/etcd/show/segment.go b/states/etcd/show/segment.go index 58cc872..936da22 100644 --- a/states/etcd/show/segment.go +++ b/states/etcd/show/segment.go @@ -56,7 +56,6 @@ func (c *ComponentShow) SegmentCommand(ctx context.Context, p *SegmentParam) err ) for _, info := range segments { - if info.State != models.SegmentStateDropped { totalRC += info.NumOfRows healthy++ @@ -105,9 +104,7 @@ func (c *ComponentShow) SegmentCommand(ctx context.Context, p *SegmentParam) err } } } - } - } if p.Format == "statistics" { var totalBinlogLogSize int64 diff --git a/states/etcd/show/segment_loaded.go b/states/etcd/show/segment_loaded.go index 7e8f661..0647cd0 100644 --- a/states/etcd/show/segment_loaded.go +++ b/states/etcd/show/segment_loaded.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" diff --git a/states/etcd/show/session.go b/states/etcd/show/session.go index c6d1b27..d9a6117 100644 --- a/states/etcd/show/session.go +++ b/states/etcd/show/session.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" diff --git a/states/etcd/version/version.go b/states/etcd/version/version.go index 45f72b0..e690200 100644 --- a/states/etcd/version/version.go +++ b/states/etcd/version/version.go @@ -1,8 +1,6 @@ package version -var ( - currentVersion string -) +var currentVersion string // SetVersion set current version manually. func SetVersion(ver string) { diff --git a/states/etcd_backup.go b/states/etcd_backup.go index 18fddb6..c6e2b09 100644 --- a/states/etcd_backup.go +++ b/states/etcd_backup.go @@ -17,6 +17,11 @@ import ( "github.com/golang/protobuf/proto" "github.com/gosuri/uilive" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" @@ -29,10 +34,6 @@ import ( querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" rootcoordpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/rootcoordpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" ) type milvusComponent string @@ -72,7 +73,6 @@ func (c *milvusComponent) Type() string { // getBackupEtcdCmd returns command for backup etcd // usage: backup [component] [options...] func getBackupEtcdCmd(cli clientv3.KV, basePath string) *cobra.Command { - component := compAll cmd := &cobra.Command{ Use: "backup", @@ -134,7 +134,7 @@ func getBackupEtcdCmd(cli clientv3.KV, basePath string) *cobra.Command { func getBackupFile(component string) (*os.File, error) { now := time.Now() filePath := fmt.Sprintf("bw_etcd_%s.%s.bak.gz", component, now.Format("060102-150405")) - f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600) if err != nil { return nil, err } @@ -373,7 +373,6 @@ func backupAppMetrics(cli clientv3.KV, basePath string, w *bufio.Writer) error { } return nil - } func backupConfiguration(cli clientv3.KV, basePath string, w *bufio.Writer) error { @@ -466,7 +465,7 @@ func writeBackupBytes(w *bufio.Writer, data []byte) { func readBackupBytes(rd io.Reader) ([]byte, uint64, error) { lb := make([]byte, 8) var nextBytes uint64 - bsRead, err := io.ReadFull(rd, lb) //rd.Read(lb) + bsRead, err := io.ReadFull(rd, lb) // rd.Read(lb) // all file read if err == io.EOF { return nil, nextBytes, err diff --git a/states/etcd_connect.go b/states/etcd_connect.go index cd0b86e..b8131af 100644 --- a/states/etcd_connect.go +++ b/states/etcd_connect.go @@ -11,22 +11,21 @@ import ( "time" "github.com/cockroachdb/errors" - "github.com/milvus-io/birdwatcher/configs" - "github.com/milvus-io/birdwatcher/framework" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" "go.uber.org/zap" "google.golang.org/grpc" + + "github.com/milvus-io/birdwatcher/configs" + "github.com/milvus-io/birdwatcher/framework" ) const ( metaPath = `meta` ) -var ( - // ErrNotMilvsuRootPath sample error for non-valid root path. - ErrNotMilvsuRootPath = errors.New("is not a Milvus RootPath") -) +// ErrNotMilvsuRootPath sample error for non-valid root path. +var ErrNotMilvsuRootPath = errors.New("is not a Milvus RootPath") func pingInstance(ctx context.Context, cli clientv3.KV, rootPath string, metaPath string) error { key := path.Join(rootPath, metaPath, "session/id") @@ -179,7 +178,6 @@ func (s *etcdConnectedState) SetupCommands() { // getEtcdConnectedState returns etcdConnectedState for unknown instance func getEtcdConnectedState(cli *clientv3.Client, addr string, config *configs.Config) State { - state := &etcdConnectedState{ cmdState: cmdState{ label: fmt.Sprintf("Etcd(%s)", addr), @@ -258,7 +256,6 @@ func findMilvusInstance(ctx context.Context, cli clientv3.KV) ([]string, error) current := "" for { resp, err := cli.Get(ctx, current, clientv3.WithKeysOnly(), clientv3.WithLimit(1), clientv3.WithFromKey()) - if err != nil { return nil, err } diff --git a/states/etcd_restore.go b/states/etcd_restore.go index 66f8b06..4b267f5 100644 --- a/states/etcd_restore.go +++ b/states/etcd_restore.go @@ -14,9 +14,10 @@ import ( "github.com/golang/protobuf/proto" "github.com/gosuri/uilive" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" - clientv3 "go.etcd.io/etcd/client/v3" ) func restoreFromV1File(cli clientv3.KV, rd io.Reader, header *models.BackupHeader) error { @@ -33,8 +34,7 @@ func restoreFromV1File(cli clientv3.KV, rd io.Reader, header *models.BackupHeade defer progressDisplay.Stop() for { - - bsRead, err := io.ReadFull(rd, lb) //rd.Read(lb) + bsRead, err := io.ReadFull(rd, lb) // rd.Read(lb) // all file read if err == io.EOF { return nil @@ -65,7 +65,7 @@ func restoreFromV1File(cli clientv3.KV, rd io.Reader, header *models.BackupHeade entry := &commonpb.KeyDataPair{} err = proto.Unmarshal(bs, entry) if err != nil { - //Skip for now + // Skip for now fmt.Printf("fail to parse line: %s, skip for now\n", err.Error()) continue } @@ -81,7 +81,6 @@ func restoreFromV1File(cli clientv3.KV, rd io.Reader, header *models.BackupHeade progress := i * 100 / int(header.Entries) fmt.Fprintf(progressDisplay, progressFmt, progress, i, header.Entries) - } } @@ -91,7 +90,7 @@ func restoreV2File(rd *bufio.Reader, state *embedEtcdMockState) error { var ph models.PartHeader err = readFixLengthHeader(rd, &ph) if err != nil { - //TODO check EOF + // TODO check EOF return nil } @@ -109,9 +108,9 @@ func restoreV2File(rd *bufio.Reader, state *embedEtcdMockState) error { state.defaultMetrics[fmt.Sprintf("%s-%d", session.ServerName, session.ServerID)] = defaultMetrics }) case int32(models.Configurations): - //testRestoreConfigurations(rd, ph) + // testRestoreConfigurations(rd, ph) case int32(models.AppMetrics): - //testRestoreConfigurations(rd, ph) + // testRestoreConfigurations(rd, ph) } } } @@ -154,10 +153,10 @@ func restoreEtcdFromBackV2(cli clientv3.KV, rd io.Reader, ph models.PartHeader) }() var lastPrint time.Time for { - bsRead, err := io.ReadFull(rd, lb) //rd.Read(lb) + bsRead, err := io.ReadFull(rd, lb) // rd.Read(lb) // all file read if err == io.EOF { - //return meta["instance"], nil + // return meta["instance"], nil errCh <- nil return } @@ -196,7 +195,7 @@ func restoreEtcdFromBackV2(cli clientv3.KV, rd io.Reader, ph models.PartHeader) entry := &commonpb.KeyDataPair{} err = proto.Unmarshal(bs, entry) if err != nil { - //Skip for now + // Skip for now fmt.Printf("fail to parse line: %s, skip for now\n", err.Error()) continue } @@ -336,7 +335,6 @@ func testRestoreConfigurations(rd io.Reader, ph models.PartHeader) error { } fmt.Println("configuration len:", len(bs)) - } } diff --git a/states/exit.go b/states/exit.go index 106d182..f61fd23 100644 --- a/states/exit.go +++ b/states/exit.go @@ -3,8 +3,9 @@ package states import ( "context" - "github.com/milvus-io/birdwatcher/framework" "github.com/spf13/cobra" + + "github.com/milvus-io/birdwatcher/framework" ) // ExitErr is the error indicates user needs to exit application. diff --git a/states/force_release.go b/states/force_release.go index b93bd74..51f8d49 100644 --- a/states/force_release.go +++ b/states/force_release.go @@ -6,13 +6,14 @@ import ( "path" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) type ForceReleaseParam struct { @@ -108,7 +109,6 @@ func getReleaseDroppedCollectionCmd(cli clientv3.KV, basePath string) *cobra.Com } run, err := cmd.Flags().GetBool("run") if err == nil && run { - for _, id := range missing { fmt.Printf("Start to remove loaded meta from querycoord, collection id %d...", id) err := releaseQueryCoordLoadMeta(cli, basePath, id) @@ -131,7 +131,6 @@ func releaseQueryCoordLoadMeta(cli clientv3.KV, basePath string, collectionID in ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel() _, err := cli.Delete(ctx, p) - if err != nil { return err } @@ -139,7 +138,6 @@ func releaseQueryCoordLoadMeta(cli clientv3.KV, basePath string, collectionID in segments, err := common.ListLoadedSegments(cli, basePath, func(info *querypb.SegmentInfo) bool { return info.CollectionID == collectionID }) - if err != nil { return err } diff --git a/states/frame_screen.go b/states/frame_screen.go index c44bfae..891b065 100644 --- a/states/frame_screen.go +++ b/states/frame_screen.go @@ -8,8 +8,9 @@ import ( "github.com/fatih/color" "github.com/gosuri/uilive" - "github.com/milvus-io/birdwatcher/eventlog" "go.uber.org/atomic" + + "github.com/milvus-io/birdwatcher/eventlog" ) type FrameScreen struct { @@ -76,7 +77,7 @@ func (s *FrameScreen) printEvents(display *uilive.Writer, m *sync.Map, events [] if qcOk { qctext = colorReady.Sprintf(" Ready ") } - fmt.Fprintf(display, fmt.Sprintf("RootCoord[%s] QueryCoord[%s]\n", rctext, qctext)) + fmt.Fprintf(display, "RootCoord[%s] QueryCoord[%s]\n", rctext, qctext) start := 0 if len(events) > 10 { @@ -86,6 +87,6 @@ func (s *FrameScreen) printEvents(display *uilive.Writer, m *sync.Map, events [] for i := start; i < len(events); i++ { evt := events[i] lvl := evt.GetLevel() - fmt.Fprintf(s.lines[i+1], fmt.Sprintf("[%s][%s]%s\n", time.Unix(0, evt.GetTs()).Format("01/02 15:04:05"), levelColor[lvl].Sprint(lvl.String()), string(evt.Data))) + fmt.Fprintf(s.lines[i+1], "[%s][%s]%s\n", time.Unix(0, evt.GetTs()).Format("01/02 15:04:05"), levelColor[lvl].Sprint(lvl.String()), string(evt.Data)) } } diff --git a/states/garbage_collect.go b/states/garbage_collect.go index d9f342d..a41da11 100644 --- a/states/garbage_collect.go +++ b/states/garbage_collect.go @@ -11,12 +11,13 @@ import ( "time" "github.com/manifoldco/promptui" - "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" - "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/minio/minio-go/v7" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" + "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) func getGarbageCollectCmd(cli clientv3.KV, basePath string) *cobra.Command { @@ -45,7 +46,7 @@ func getGarbageCollectCmd(cli clientv3.KV, basePath string) *cobra.Command { return } - exists, err := minioClient.BucketExists(context.Background(), bucketName) + exists, _ := minioClient.BucketExists(context.Background(), bucketName) if !exists { fmt.Printf("bucket %s not exists\n", bucketName) return @@ -58,14 +59,13 @@ func getGarbageCollectCmd(cli clientv3.KV, basePath string) *cobra.Command { } const ( - //TODO silverxia change to configuration + // TODO silverxia change to configuration insertLogPrefix = `insert_log` statsLogPrefix = `stats_log` deltaLogPrefix = `delta_log` ) func garbageCollect(cli clientv3.KV, basePath string, minioClient *minio.Client, minioRootPath string, bucketName string) { - segments, err := common.ListSegments(cli, basePath, func(*datapb.SegmentInfo) bool { return true }) if err != nil { fmt.Println("failed to list segments:", err.Error()) @@ -101,7 +101,6 @@ func garbageCollect(cli clientv3.KV, basePath string, minioClient *minio.Client, deltalog[l.GetLogPath()] = struct{}{} } } - } // walk only data cluster related prefixes @@ -153,7 +152,6 @@ func garbageCollect(cli clientv3.KV, basePath string, minioClient *minio.Client, } w.WriteString(", not relate meta found, maybe garbage\n") - } } w.Flush() diff --git a/states/healthz.go b/states/healthz.go index 5fb752b..3ce0375 100644 --- a/states/healthz.go +++ b/states/healthz.go @@ -6,15 +6,16 @@ import ( "fmt" "strings" + "github.com/samber/lo" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/samber/lo" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type HealthzCheckParam struct { @@ -57,7 +58,6 @@ type HealthzCheckReport struct { } func (c *InstanceState) HealthzCheckCommand(ctx context.Context, p *HealthzCheckParam) (*framework.PresetResultSet, error) { - results, err := c.checkSegmentTarget(ctx) if err != nil { return nil, err diff --git a/states/inspect_primary_key.go b/states/inspect_primary_key.go index fdda768..2744f7a 100644 --- a/states/inspect_primary_key.go +++ b/states/inspect_primary_key.go @@ -7,17 +7,17 @@ import ( "path" "strconv" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/milvus-io/birdwatcher/storage" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) func getInspectPKCmd(cli clientv3.KV, basePath string) *cobra.Command { - cmd := &cobra.Command{ Use: "inspect-pk [segment id]", Short: "inspect pk num&dup condition", @@ -55,7 +55,6 @@ func getInspectPKCmd(cli clientv3.KV, basePath string) *cobra.Command { ctx, cancel := context.WithCancel(context.Background()) defer cancel() coll, err := common.GetCollectionByIDVersion(ctx, cli, basePath, etcdversion.GetVersion(), segment.GetCollectionID()) - if err != nil { fmt.Println("Collection not found for id", segment.CollectionID) return @@ -120,9 +119,7 @@ func getInspectPKCmd(cli clientv3.KV, basePath string) *cobra.Command { fmt.Printf("found mismatch segment %d, info:%d, binlog count:%d", segment.ID, segment.NumOfRows, total) } } - } - }, } diff --git a/states/instance.go b/states/instance.go index 52b98e9..9b1fb84 100644 --- a/states/instance.go +++ b/states/instance.go @@ -6,14 +6,15 @@ import ( "path" "time" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/configs" "github.com/milvus-io/birdwatcher/states/etcd" "github.com/milvus-io/birdwatcher/states/etcd/audit" "github.com/milvus-io/birdwatcher/states/etcd/remove" "github.com/milvus-io/birdwatcher/states/etcd/repair" "github.com/milvus-io/birdwatcher/states/etcd/show" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" ) // InstanceState provides command for single milvus instance. @@ -83,7 +84,7 @@ func (s *InstanceState) SetupCommands() { // segment-loaded GetDistributionCommand(cli, basePath), - //balance-explain + // balance-explain ExplainBalanceCommand(cli, basePath), // @@ -93,7 +94,7 @@ func (s *InstanceState) SetupCommands() { GetProbeCmd(cli, basePath), // remove-segment-by-id - //removeSegmentByID(cli, basePath), + // removeSegmentByID(cli, basePath), // garbage-collect getGarbageCollectCmd(cli, basePath), // release-dropped-collection @@ -108,7 +109,7 @@ func (s *InstanceState) SetupCommands() { etcd.DownloadCommand(cli, basePath), ) - //cmd.AddCommand(etcd.RawCommands(cli)...) + // cmd.AddCommand(etcd.RawCommands(cli)...) s.mergeFunctionCommands(cmd, s) s.cmdState.rootCmd = cmd s.setupFn = s.SetupCommands @@ -129,7 +130,7 @@ func getDryModeCmd(state *InstanceState, etcdState State) *cobra.Command { func getInstanceState(cli clientv3.KV, instanceName, metaPath string, etcdState State, config *configs.Config) State { var kv clientv3.KV name := fmt.Sprintf("audit_%s.log", time.Now().Format("2006_0102_150405")) - file, err := os.OpenFile(name, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + file, err := os.OpenFile(name, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { fmt.Println("failed to open audit.log file!") kv = cli diff --git a/states/kill.go b/states/kill.go index 3568491..71a96c9 100644 --- a/states/kill.go +++ b/states/kill.go @@ -9,15 +9,15 @@ import ( "strings" "time" - "github.com/milvus-io/birdwatcher/models" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" ) // getEtcdKillCmd returns command for kill component session // usage: kill component func getEtcdKillCmd(cli clientv3.KV, basePath string) *cobra.Command { - component := compAll cmd := &cobra.Command{ Use: "kill", @@ -49,7 +49,6 @@ func etcdKillComponent(cli clientv3.KV, key string, id int64) error { ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) defer cancel() resp, err := cli.Get(ctx, key) - if err != nil { return err } diff --git a/states/load_backup.go b/states/load_backup.go index 8207864..75acece 100644 --- a/states/load_backup.go +++ b/states/load_backup.go @@ -11,10 +11,11 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/mitchellh/go-homedir" + "github.com/milvus-io/birdwatcher/configs" "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" - "github.com/mitchellh/go-homedir" ) type LoadBackupParam struct { diff --git a/states/management.go b/states/management.go index 700fa40..59ebbec 100644 --- a/states/management.go +++ b/states/management.go @@ -10,6 +10,10 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/samber/lo" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "github.com/milvus-io/birdwatcher/eventlog" "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" @@ -19,9 +23,6 @@ import ( querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" rootcoordpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/rootcoordpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/samber/lo" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type ListMetricsPortParam struct { @@ -58,7 +59,6 @@ func (s *InstanceState) ListMetricsPortCommand(ctx context.Context, p *ListMetri fmt.Println(session.ServerName, session.IP(), item.GetValue()) } } - } return nil @@ -116,7 +116,6 @@ func getEventLogPort(ctx context.Context, ip string, metricPort string) int { } resp, err := http.DefaultClient.Do(req) - if err != nil { return -1 } @@ -189,7 +188,6 @@ func (s *InstanceState) prepareListenerClients(ctx context.Context) ([]*eventlog return } m.Store(addr, listener) - }(session) } @@ -223,8 +221,8 @@ func getConfigurationSource(session *models.Session, conn *grpc.ClientConn) conf case "rootcoord": client = rootcoordpbv2.NewRootCoordClient(conn) // case "proxy": - //client:= milvuspb.NewMilvusServiceClient(conn) - //state.SetNext(getProxy) + // client:= milvuspb.NewMilvusServiceClient(conn) + // state.SetNext(getProxy) case "milvus": } return client diff --git a/states/metrics.go b/states/metrics.go index 99ba1dc..c8081a7 100644 --- a/states/metrics.go +++ b/states/metrics.go @@ -6,10 +6,11 @@ import ( "net/http" "strings" - "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/states/etcd/common" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/states/etcd/common" ) func getFetchMetricsCmd(cli clientv3.KV, basePath string) *cobra.Command { @@ -26,7 +27,7 @@ func getFetchMetricsCmd(cli clientv3.KV, basePath string) *cobra.Command { for _, session := range sessions { metrics, defaultMetrics, _ := fetchInstanceMetrics(session) fmt.Println(session) - //TODO parse metrics + // TODO parse metrics fmt.Println(metrics) fmt.Println(defaultMetrics) } diff --git a/states/minio.go b/states/minio.go index 272f6e1..4761855 100644 --- a/states/minio.go +++ b/states/minio.go @@ -5,15 +5,16 @@ import ( "github.com/cockroachdb/errors" "github.com/manifoldco/promptui" + "github.com/minio/minio-go/v7" + "github.com/samber/lo" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/oss" rootcoordpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/rootcoordpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/minio/minio-go/v7" - "github.com/samber/lo" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) type TestMinioCfgParam struct { @@ -124,7 +125,6 @@ func (s *InstanceState) GetMinioClientFromCfg(ctx context.Context, minioAddr str } func (s *InstanceState) GetMinioClientFromPrompt(ctx context.Context) (client *minio.Client, bucketName, rootPath string, err error) { - p := promptui.Prompt{ Label: "BucketName", } diff --git a/states/open.go b/states/open.go index 534cbb6..98149a5 100644 --- a/states/open.go +++ b/states/open.go @@ -7,6 +7,7 @@ import ( "path" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" ) diff --git a/states/parse_file.go b/states/parse_file.go index 038e01f..9c9cf8f 100644 --- a/states/parse_file.go +++ b/states/parse_file.go @@ -15,6 +15,7 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/storage" ) @@ -228,7 +229,7 @@ func (s *disconnectState) AssembleIndexFilesCommand(ctx context.Context, p *Asse } outputPath := fmt.Sprintf("%s_%s", prefix, time.Now().Format("060102150406")) - output, err := os.OpenFile(outputPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + output, err := os.OpenFile(outputPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600) if err != nil { return err } diff --git a/states/pprof.go b/states/pprof.go index 64efe9a..552f443 100644 --- a/states/pprof.go +++ b/states/pprof.go @@ -12,6 +12,7 @@ import ( "time" "github.com/cockroachdb/errors" + "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/states/etcd/common" @@ -24,7 +25,6 @@ type PprofParam struct { } func (s *InstanceState) GetPprofCommand(ctx context.Context, p *PprofParam) error { - switch p.Type { case "goroutine", "heap", "profile", "allocs": default: @@ -38,7 +38,7 @@ func (s *InstanceState) GetPprofCommand(ctx context.Context, p *PprofParam) erro now := time.Now() filePath := fmt.Sprintf("bw_pprof_%s.%s.tar.gz", p.Type, now.Format("060102-150405")) - f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600) + f, err := os.OpenFile(filePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o600) if err != nil { return err } @@ -73,7 +73,7 @@ func (s *InstanceState) GetPprofCommand(ctx context.Context, p *PprofParam) erro Name: fmt.Sprintf("%s_%d_%s", session.ServerName, session.ServerID, p.Type), Size: int64(len(result.data)), - Mode: 0600, + Mode: 0o600, }) _, err = tw.Write(result.data) diff --git a/states/probe.go b/states/probe.go index 2030ee5..87dd9da 100644 --- a/states/probe.go +++ b/states/probe.go @@ -14,20 +14,19 @@ import ( "time" "github.com/golang/protobuf/proto" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" indexpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/indexpb" - "github.com/milvus-io/birdwatcher/proto/v2.2/internalpb" internalpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/internalpb" "github.com/milvus-io/birdwatcher/proto/v2.2/planpb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" schemapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/schemapb" "github.com/milvus-io/birdwatcher/states/etcd/common" etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" ) func GetProbeCmd(cli clientv3.KV, basePath string) *cobra.Command { @@ -104,7 +103,6 @@ func getProbeQueryCmd(cli clientv3.KV, basePath string) *cobra.Command { } for _, shard := range leaders.GetShards() { - for _, nodeID := range shard.GetNodeIds() { qn, ok := qns[nodeID] if !ok { @@ -129,7 +127,6 @@ func getProbeQueryCmd(cli clientv3.KV, basePath string) *cobra.Command { } } } - }, } @@ -342,13 +339,11 @@ func getQueryCoordClient(sessions []*models.Session) (querypbv2.QueryCoordClient client := querypbv2.NewQueryCoordClient(conn) return client, nil - } return nil, errors.New("querycoord session not found") } func getQueryNodeClients(sessions []*models.Session) (map[int64]querypbv2.QueryNodeClient, error) { - result := make(map[int64]querypbv2.QueryNodeClient) for _, session := range sessions { @@ -399,7 +394,6 @@ func getMockSearchRequest(ctx context.Context, cli clientv3.KV, basePath string, indexes, _, err := common.ListProtoObjects(ctx, cli, path.Join(basePath, "field-index"), func(index *indexpbv2.FieldIndex) bool { return index.GetIndexInfo().GetIndexID() == indexID }) - if err != nil { return nil, err } @@ -410,16 +404,16 @@ func getMockSearchRequest(ctx context.Context, cli clientv3.KV, basePath string, } vector := genFloatVector(dim) - req := &internalpb.SearchRequest{ + req := &internalpbv2.SearchRequest{ Base: &commonpbv2.MsgBase{ - MsgType: commonpb.MsgType_Search, + MsgType: commonpbv2.MsgType_Search, }, CollectionID: coll.ID, PartitionIDs: []int64{}, Dsl: "", PlaceholderGroup: vector2PlaceholderGroupBytes(vector), DslType: commonpbv2.DslType_BoolExprV1, - GuaranteeTimestamp: 1, //Eventually first + GuaranteeTimestamp: 1, // Eventually first Nq: 1, } @@ -490,7 +484,6 @@ func getMockSearchRequest(ctx context.Context, cli clientv3.KV, basePath string, default: return nil, fmt.Errorf("probing index type %s not supported yet", indexType) } - } func getSearchPlan(isBinary bool, pkFieldID, vectorFieldID int64, topk int64, metricType string, searchParam string) []byte { diff --git a/states/pulsarctl_connect.go b/states/pulsarctl_connect.go index a74c1fb..281a62c 100644 --- a/states/pulsarctl_connect.go +++ b/states/pulsarctl_connect.go @@ -4,11 +4,12 @@ import ( "context" "fmt" - "github.com/milvus-io/birdwatcher/framework" "github.com/spf13/cobra" pulsarctl "github.com/streamnative/pulsarctl/pkg/pulsar" "github.com/streamnative/pulsarctl/pkg/pulsar/common" "github.com/streamnative/pulsarctl/pkg/pulsar/utils" + + "github.com/milvus-io/birdwatcher/framework" ) type PulsarctlParam struct { @@ -19,7 +20,6 @@ type PulsarctlParam struct { } func (s *disconnectState) PulsarctlCommand(ctx context.Context, p *PulsarctlParam) error { - config := common.Config{ WebServiceURL: p.Address, AuthPlugin: p.AuthPlugin, diff --git a/states/states.go b/states/states.go index b32a487..85da8fe 100644 --- a/states/states.go +++ b/states/states.go @@ -11,10 +11,11 @@ import ( "strings" "syscall" - "github.com/milvus-io/birdwatcher/framework" - "github.com/milvus-io/birdwatcher/states/autocomplete" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/milvus-io/birdwatcher/framework" + "github.com/milvus-io/birdwatcher/states/autocomplete" ) // State is the interface for application state. @@ -205,7 +206,7 @@ func parseMethod(state State, mt reflect.Method) (*cobra.Command, []string, bool } } - //fmt.Println(mt.Name) + // fmt.Println(mt.Name) cp := reflect.New(paramType.Elem()).Interface().(framework.CmdParam) fUse, fDesc := GetCmdFromFlag(cp) if len(use) == 0 { @@ -359,7 +360,6 @@ func setupFlags(p framework.CmdParam, flags *pflag.FlagSet) { } func parseFlags(p framework.CmdParam, flags *pflag.FlagSet) error { - v := reflect.ValueOf(p) if v.Kind() != reflect.Pointer { return errors.New("param is not pointer") diff --git a/states/update_log_level.go b/states/update_log_level.go index 32f1a72..516d7dc 100644 --- a/states/update_log_level.go +++ b/states/update_log_level.go @@ -98,7 +98,6 @@ func getUpdateLogLevelCmd(cli clientv3.KV, basePath string) *cobra.Command { if targetRole == "" || (targetServerID == -1 && targetRole == session.ServerName) || (targetRole == session.ServerName && targetServerID == session.ServerID) { - foundComponent = true err := changeLogLevel(httpClient, session, targetLevel) if err != nil { diff --git a/states/util.go b/states/util.go index 263b719..31b99ca 100644 --- a/states/util.go +++ b/states/util.go @@ -21,18 +21,18 @@ import ( "encoding/json" "errors" "fmt" - "sort" "strconv" "strings" "time" + clientv3 "go.etcd.io/etcd/client/v3" + "github.com/milvus-io/birdwatcher/common" "github.com/milvus-io/birdwatcher/framework" "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" stateCommon "github.com/milvus-io/birdwatcher/states/etcd/common" - clientv3 "go.etcd.io/etcd/client/v3" ) const ( diff --git a/states/verify_segment.go b/states/verify_segment.go index a1548b3..94ec214 100644 --- a/states/verify_segment.go +++ b/states/verify_segment.go @@ -5,12 +5,13 @@ import ( "fmt" "strings" - "github.com/milvus-io/birdwatcher/models" - "github.com/milvus-io/birdwatcher/states/etcd/common" - etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/minio/minio-go/v7" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/models" + "github.com/milvus-io/birdwatcher/states/etcd/common" + etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" ) func getVerifySegmentCmd(cli clientv3.KV, basePath string) *cobra.Command { @@ -32,7 +33,6 @@ func getVerifySegmentCmd(cli clientv3.KV, basePath string) *cobra.Command { segments, err := common.ListSegmentsVersion(context.Background(), cli, basePath, etcdversion.GetVersion(), func(seg *models.Segment) bool { return seg.CollectionID == collectionID && seg.State == models.SegmentStateFlushed }) - if err != nil { fmt.Println("failed to list segment info", err.Error()) } @@ -92,7 +92,6 @@ func getVerifySegmentCmd(cli clientv3.KV, basePath string) *cobra.Command { fmt.Printf("Segment(%d) %s done\n", segment.ID, item.tag) } - } }, } diff --git a/states/visit.go b/states/visit.go index e918b1e..bc4cc9f 100644 --- a/states/visit.go +++ b/states/visit.go @@ -7,6 +7,11 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + clientv3 "go.etcd.io/etcd/client/v3" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" @@ -17,10 +22,6 @@ import ( commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" internalpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/internalpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/spf13/cobra" - clientv3 "go.etcd.io/etcd/client/v3" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" ) func getSessionTypes() []string { @@ -196,7 +197,6 @@ func getMetricsCmd(client metricsSource) *cobra.Command { Short: "show the metrics provided by current server", Aliases: []string{"GetMetrics"}, Run: func(cmd *cobra.Command, args []string) { - resp, err := client.GetMetrics(context.Background(), &milvuspb.GetMetricsRequest{ Base: &commonpb.MsgBase{}, Request: `{"metric_type": "system_info"}`, diff --git a/states/visit_datacoord.go b/states/visit_datacoord.go index 758c8a4..8dc0301 100644 --- a/states/visit_datacoord.go +++ b/states/visit_datacoord.go @@ -3,11 +3,12 @@ package states import ( "fmt" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type dataCoordState struct { @@ -28,7 +29,7 @@ func (s *dataCoordState) SetupCommands() { getMetricsCmd(s.client), // configuration getConfigurationCmd(s.clientv2, s.session.ServerID), - //back + // back getBackCmd(s, s.prevState), // exit @@ -42,7 +43,6 @@ func (s *dataCoordState) SetupCommands() { } func getDataCoordState(client datapb.DataCoordClient, conn *grpc.ClientConn, prev State, session *models.Session) State { - state := &dataCoordState{ cmdState: cmdState{ label: fmt.Sprintf("DataCoord-%d(%s)", session.ServerID, session.Address), diff --git a/states/visit_datanode.go b/states/visit_datanode.go index 9e52f99..ac3124b 100644 --- a/states/visit_datanode.go +++ b/states/visit_datanode.go @@ -3,11 +3,12 @@ package states import ( "fmt" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/datapb" datapbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/datapb" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type dataNodeState struct { @@ -28,7 +29,7 @@ func (s *dataNodeState) SetupCommands() { getMetricsCmd(s.client), // configuration getConfigurationCmd(s.clientv2, s.session.ServerID), - //back + // back getBackCmd(s, s.prevState), // exit getExitCmd(s), @@ -41,7 +42,6 @@ func (s *dataNodeState) SetupCommands() { } func getDataNodeState(client datapb.DataNodeClient, conn *grpc.ClientConn, prev State, session *models.Session) State { - state := &dataNodeState{ cmdState: cmdState{ label: fmt.Sprintf("DataNode-%d(%s)", session.ServerID, session.Address), diff --git a/states/visit_indexcoord.go b/states/visit_indexcoord.go index 0497a56..65562bb 100644 --- a/states/visit_indexcoord.go +++ b/states/visit_indexcoord.go @@ -4,12 +4,13 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/indexpb" indexpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/indexpb" "github.com/milvus-io/birdwatcher/states/etcd/common" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type indexCoordState struct { @@ -32,7 +33,7 @@ func (s *indexCoordState) SetupCommands() { getConfigurationCmd(s.clientv2, s.session.ServerID), // build index progress getDescribeIndex(s.clientv2, s.session.ServerID), - //back + // back getBackCmd(s, s.prevState), // exit getExitCmd(s), @@ -45,7 +46,6 @@ func (s *indexCoordState) SetupCommands() { } func getIndexCoordState(client indexpb.IndexCoordClient, conn *grpc.ClientConn, prev State, session *models.Session) State { - state := &indexCoordState{ cmdState: cmdState{ label: fmt.Sprintf("IndexCoord-%d(%s)", session.ServerID, session.Address), diff --git a/states/visit_indexnode.go b/states/visit_indexnode.go index 4b5b40a..5ccb8dd 100644 --- a/states/visit_indexnode.go +++ b/states/visit_indexnode.go @@ -3,11 +3,12 @@ package states import ( "fmt" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/indexpb" indexpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/indexpb" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type indexNodeState struct { @@ -28,7 +29,7 @@ func (s *indexNodeState) SetupCommands() { getMetricsCmd(s.client), // configuration getConfigurationCmd(s.clientv2, s.session.ServerID), - //back + // back getBackCmd(s, s.prevState), // exit getExitCmd(s), diff --git a/states/visit_querycoord.go b/states/visit_querycoord.go index ebede42..e058814 100644 --- a/states/visit_querycoord.go +++ b/states/visit_querycoord.go @@ -8,12 +8,13 @@ import ( "strconv" "text/tabwriter" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type queryCoordState struct { diff --git a/states/visit_querynode.go b/states/visit_querynode.go index e30625e..75e85f3 100644 --- a/states/visit_querynode.go +++ b/states/visit_querynode.go @@ -5,14 +5,14 @@ import ( "fmt" "strconv" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/commonpb" "github.com/milvus-io/birdwatcher/proto/v2.0/querypb" commonpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/commonpb" querypbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/querypb" - - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type queryNodeState struct { diff --git a/states/visit_rootcoord.go b/states/visit_rootcoord.go index 5f18217..ff0ef32 100644 --- a/states/visit_rootcoord.go +++ b/states/visit_rootcoord.go @@ -3,11 +3,12 @@ package states import ( "fmt" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "github.com/milvus-io/birdwatcher/models" "github.com/milvus-io/birdwatcher/proto/v2.0/rootcoordpb" rootcoordpbv2 "github.com/milvus-io/birdwatcher/proto/v2.2/rootcoordpb" - "github.com/spf13/cobra" - "google.golang.org/grpc" ) type rootCoordState struct { @@ -40,7 +41,6 @@ func (s *rootCoordState) SetupCommands() { } func getRootCoordState(client rootcoordpb.RootCoordClient, conn *grpc.ClientConn, prev State, session *models.Session) State { - state := &rootCoordState{ session: session, cmdState: cmdState{ diff --git a/states/web.go b/states/web.go index e8b5ff5..a879e1a 100644 --- a/states/web.go +++ b/states/web.go @@ -6,10 +6,11 @@ import ( "time" "github.com/gin-gonic/gin" - "github.com/milvus-io/birdwatcher/states/etcd/common" - etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" "github.com/spf13/cobra" clientv3 "go.etcd.io/etcd/client/v3" + + "github.com/milvus-io/birdwatcher/states/etcd/common" + etcdversion "github.com/milvus-io/birdwatcher/states/etcd/version" ) // getCmdCmd returns exit command for input state. diff --git a/storage/binlog_reader.go b/storage/binlog_reader.go index 876e50d..102ebd0 100644 --- a/storage/binlog_reader.go +++ b/storage/binlog_reader.go @@ -178,7 +178,6 @@ func readData[T any, Reader interface { file.ColumnChunkReader ReadBatch(int64, []T, []int16, []int16) (int64, int, error) }](f io.Reader, colIdx int) ([]T, error) { - eventReader := newEventReader() header, err := eventReader.readHeader(f) if err != nil { diff --git a/storage/event_data.go b/storage/event_data.go index e1cb0c5..16d953b 100644 --- a/storage/event_data.go +++ b/storage/event_data.go @@ -46,7 +46,6 @@ func (data *descriptorEventData) GetEventDataFixPartSize() int32 { // GetMemoryUsageInBytes returns the memory size of DescriptorEventDataFixPart. func (data *descriptorEventData) GetMemoryUsageInBytes() int32 { return data.GetEventDataFixPartSize() + int32(binary.Size(data.PostHeaderLengths)) + int32(binary.Size(data.ExtraLength)) + data.ExtraLength - } // AddExtra add extra params to description event. @@ -345,36 +344,42 @@ func newInsertEventData() *insertEventData { EndTimestamp: 0, } } + func newDeleteEventData() *deleteEventData { return &deleteEventData{ StartTimestamp: 0, EndTimestamp: 0, } } + func newCreateCollectionEventData() *createCollectionEventData { return &createCollectionEventData{ StartTimestamp: 0, EndTimestamp: 0, } } + func newDropCollectionEventData() *dropCollectionEventData { return &dropCollectionEventData{ StartTimestamp: 0, EndTimestamp: 0, } } + func newCreatePartitionEventData() *createPartitionEventData { return &createPartitionEventData{ StartTimestamp: 0, EndTimestamp: 0, } } + func newDropPartitionEventData() *dropPartitionEventData { return &dropPartitionEventData{ StartTimestamp: 0, EndTimestamp: 0, } } + func newIndexFileEventData() *indexFileEventData { return &indexFileEventData{ StartTimestamp: 0, diff --git a/storage/event_header.go b/storage/event_header.go index b20fcf7..07c6292 100644 --- a/storage/event_header.go +++ b/storage/event_header.go @@ -21,9 +21,7 @@ const ( EventTypeEnd ) -var ( - commonEndian = binary.LittleEndian -) +var commonEndian = binary.LittleEndian type baseEventHeader struct { Timestamp uint64 @@ -66,7 +64,7 @@ func readDescriptorEventHeader(buffer io.Reader) (*descriptorEventHeader, error) func newDescriptorEventHeader() *descriptorEventHeader { header := descriptorEventHeader{ - Timestamp: 0, //tsoutil.ComposeTS(time.Now().UnixNano()/int64(time.Millisecond), 0), + Timestamp: 0, // tsoutil.ComposeTS(time.Now().UnixNano()/int64(time.Millisecond), 0), TypeCode: DescriptorEventType, } return &header @@ -75,7 +73,7 @@ func newDescriptorEventHeader() *descriptorEventHeader { func newEventHeader(eventTypeCode EventTypeCode) *eventHeader { return &eventHeader{ baseEventHeader: baseEventHeader{ - Timestamp: 0, //tsoutil.ComposeTS(time.Now().UnixNano()/int64(time.Millisecond), 0), + Timestamp: 0, // tsoutil.ComposeTS(time.Now().UnixNano()/int64(time.Millisecond), 0), TypeCode: eventTypeCode, EventLength: -1, NextPosition: -1, diff --git a/storage/event_reader.go b/storage/event_reader.go index 34e0e72..5bc65f7 100644 --- a/storage/event_reader.go +++ b/storage/event_reader.go @@ -7,11 +7,9 @@ import ( ) // EventReader binlog event reader from Milvus -type EventReader struct { -} +type EventReader struct{} func (reader *EventReader) readHeader(in io.Reader) (*eventHeader, error) { - header, err := readEventHeader(in) if err != nil { return nil, err diff --git a/storage/index_reader.go b/storage/index_reader.go index f279cb6..32595b6 100644 --- a/storage/index_reader.go +++ b/storage/index_reader.go @@ -6,12 +6,12 @@ import ( "io" "os" - "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" "github.com/samber/lo" + + "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" ) -type IndexReader struct { -} +type IndexReader struct{} func NewIndexReader(f *os.File) (*IndexReader, descriptorEvent, error) { reader := &IndexReader{} @@ -67,7 +67,6 @@ func (reader *IndexReader) NextEventReader(f *os.File, dataType schemapb.DataTyp return nil, err } return [][]byte{result}, nil - } return nil, errors.New("unexpected data type") } diff --git a/storage/parquet_reader.go b/storage/parquet_reader.go index 798e4d9..8a1d686 100644 --- a/storage/parquet_reader.go +++ b/storage/parquet_reader.go @@ -2,6 +2,7 @@ package storage import ( "github.com/apache/arrow/go/v8/parquet/file" + "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" ) diff --git a/storage/parquet_writer.go b/storage/parquet_writer.go index 6d13f9e..1a55786 100644 --- a/storage/parquet_writer.go +++ b/storage/parquet_writer.go @@ -12,8 +12,9 @@ import ( "github.com/apache/arrow/go/v8/parquet/compress" "github.com/apache/arrow/go/v8/parquet/pqarrow" "github.com/cockroachdb/errors" - "github.com/milvus-io/birdwatcher/models" "github.com/samber/lo" + + "github.com/milvus-io/birdwatcher/models" ) func ToArrowDataType(dataType models.DataType, dim int) arrow.DataType { @@ -57,7 +58,6 @@ type ParquetWriter struct { } func NewParquetWriter(collection *models.Collection) *ParquetWriter { - fields := lo.Map(collection.Schema.Fields, func(field models.FieldSchema, _ int) arrow.Field { dim, _ := field.GetDim() return arrow.Field{ @@ -136,7 +136,6 @@ func (w *ParquetWriter) AppendBinaryVector(field string, vec []byte) error { } func (w *ParquetWriter) Flush(writer io.Writer) error { - columns := make([]arrow.Column, 0, len(w.builders)) arrs := make([]arrow.Array, 0, len(w.builders)) diff --git a/storage/payload_reader.go b/storage/payload_reader.go index d63722c..d634310 100644 --- a/storage/payload_reader.go +++ b/storage/payload_reader.go @@ -7,8 +7,9 @@ import ( "github.com/apache/arrow/go/v8/arrow" "github.com/apache/arrow/go/v8/parquet" "github.com/apache/arrow/go/v8/parquet/file" - "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" "github.com/samber/lo" + + "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" ) type ParquetPayloadReader struct { @@ -113,7 +114,6 @@ func readPayloadAll[T any, Reader interface { file.ColumnChunkReader ReadBatch(int64, []T, []int16, []int16) (int64, int, error) }](r *file.Reader, colIdx int) ([]T, error) { - var rowCount int64 for i := 0; i < r.NumRowGroups(); i++ { rowCount += r.RowGroup(i).NumRows() diff --git a/storage/primary_keys.go b/storage/primary_keys.go index c7efa00..2c8559a 100644 --- a/storage/primary_keys.go +++ b/storage/primary_keys.go @@ -18,8 +18,9 @@ package storage import ( "github.com/cockroachdb/errors" - "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" "github.com/samber/lo" + + "github.com/milvus-io/birdwatcher/proto/v2.0/schemapb" ) // PrimaryKeys is the interface holding a slice of PrimaryKey @@ -50,7 +51,7 @@ func (pks *Int64PrimaryKeys) Append(values ...PrimaryKey) error { for _, pk := range values { iPk, ok := pk.(*Int64PrimaryKey) if !ok { - return errors.New("pk type not match") //merr.WrapErrParameterInvalid("Int64PrimaryKey", "non-int64 pk") + return errors.New("pk type not match") // merr.WrapErrParameterInvalid("Int64PrimaryKey", "non-int64 pk") } iValues = append(iValues, iPk.Value) }