From 4c52c270139e13e843b863e261bebc64683d3e21 Mon Sep 17 00:00:00 2001 From: srfrog Date: Sun, 14 Oct 2018 23:07:32 -0700 Subject: [PATCH 01/25] saving state --- dgraph/cmd/cmd.go | 55 ++++++++++++ dgraph/cmd/cmd_ee.go | 32 +++++++ dgraph/cmd/root.go | 31 ------- dgraphee/README.md | 4 + dgraphee/cmd/backup.go | 117 +++++++++++++++++++++++++ dgraphee/cmd/backup.proto | 25 ++++++ dgraphee/cmd/backup/backup.go | 69 +++++++++++++++ dgraphee/cmd/backup/file_handler.go | 68 +++++++++++++++ dgraphee/cmd/backup/handler.go | 46 ++++++++++ dgraphee/cmd/backup/run.go | 131 ++++++++++++++++++++++++++++ 10 files changed, 547 insertions(+), 31 deletions(-) create mode 100644 dgraph/cmd/cmd.go create mode 100644 dgraph/cmd/cmd_ee.go create mode 100644 dgraphee/README.md create mode 100644 dgraphee/cmd/backup.go create mode 100644 dgraphee/cmd/backup.proto create mode 100644 dgraphee/cmd/backup/backup.go create mode 100644 dgraphee/cmd/backup/file_handler.go create mode 100644 dgraphee/cmd/backup/handler.go create mode 100644 dgraphee/cmd/backup/run.go diff --git a/dgraph/cmd/cmd.go b/dgraph/cmd/cmd.go new file mode 100644 index 00000000000..44e71ec523c --- /dev/null +++ b/dgraph/cmd/cmd.go @@ -0,0 +1,55 @@ +/* + * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors + * + * Licensed 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 cmd + +import ( + "github.com/dgraph-io/dgraph/dgraph/cmd/bulk" + "github.com/dgraph-io/dgraph/dgraph/cmd/cert" + "github.com/dgraph-io/dgraph/dgraph/cmd/conv" + "github.com/dgraph-io/dgraph/dgraph/cmd/debug" + "github.com/dgraph-io/dgraph/dgraph/cmd/live" + "github.com/dgraph-io/dgraph/dgraph/cmd/server" + "github.com/dgraph-io/dgraph/dgraph/cmd/version" + "github.com/dgraph-io/dgraph/dgraph/cmd/zero" + "github.com/dgraph-io/dgraph/x" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func bindAll(subcommands ...*x.SubCommand) { + for _, sc := range subcommands { + RootCmd.AddCommand(sc.Cmd) + sc.Conf = viper.New() + sc.Conf.BindPFlags(sc.Cmd.Flags()) + sc.Conf.BindPFlags(RootCmd.PersistentFlags()) + sc.Conf.AutomaticEnv() + sc.Conf.SetEnvPrefix(sc.EnvPrefix) + cobra.OnInitialize(func() { + cfg := rootConf.GetString("config") + if cfg == "" { + return + } + sc.Conf.SetConfigFile(cfg) + x.Check(x.Wrapf(sc.Conf.ReadInConfig(), "reading config")) + }) + } +} + +func init() { + bindAll(&bulk.Bulk, &cert.Cert, &conv.Conv, &live.Live, &server.Server, &zero.Zero, + &version.Version, &debug.Debug) +} diff --git a/dgraph/cmd/cmd_ee.go b/dgraph/cmd/cmd_ee.go new file mode 100644 index 00000000000..82bb4040ea4 --- /dev/null +++ b/dgraph/cmd/cmd_ee.go @@ -0,0 +1,32 @@ +// // +build dgraphee + +/* + * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors + * + * Licensed 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 cmd + +import "github.com/dgraph-io/dgraph/dgraphee/cmd/backup" + +func init() { + println(` + * + * Dgraph Enterprise Edition. + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + `) + + bindAll(&backup.Backup) +} diff --git a/dgraph/cmd/root.go b/dgraph/cmd/root.go index 6c8ddaddcaa..399ea4ba491 100644 --- a/dgraph/cmd/root.go +++ b/dgraph/cmd/root.go @@ -21,14 +21,6 @@ import ( "fmt" "os" - "github.com/dgraph-io/dgraph/dgraph/cmd/bulk" - "github.com/dgraph-io/dgraph/dgraph/cmd/cert" - "github.com/dgraph-io/dgraph/dgraph/cmd/conv" - "github.com/dgraph-io/dgraph/dgraph/cmd/debug" - "github.com/dgraph-io/dgraph/dgraph/cmd/live" - "github.com/dgraph-io/dgraph/dgraph/cmd/server" - "github.com/dgraph-io/dgraph/dgraph/cmd/version" - "github.com/dgraph-io/dgraph/dgraph/cmd/zero" "github.com/dgraph-io/dgraph/x" "github.com/spf13/cobra" flag "github.com/spf13/pflag" @@ -76,27 +68,4 @@ func init() { "Allow trace endpoint to be accessible from remote") rootConf.BindPFlags(RootCmd.PersistentFlags()) flag.CommandLine.AddGoFlagSet(goflag.CommandLine) - - var subcommands = []*x.SubCommand{ - &bulk.Bulk, &cert.Cert, &conv.Conv, &live.Live, &server.Server, &zero.Zero, - &version.Version, &debug.Debug, - } - for _, sc := range subcommands { - RootCmd.AddCommand(sc.Cmd) - sc.Conf = viper.New() - sc.Conf.BindPFlags(sc.Cmd.Flags()) - sc.Conf.BindPFlags(RootCmd.PersistentFlags()) - sc.Conf.AutomaticEnv() - sc.Conf.SetEnvPrefix(sc.EnvPrefix) - } - cobra.OnInitialize(func() { - cfg := rootConf.GetString("config") - if cfg == "" { - return - } - for _, sc := range subcommands { - sc.Conf.SetConfigFile(cfg) - x.Check(x.Wrapf(sc.Conf.ReadInConfig(), "reading config")) - } - }) } diff --git a/dgraphee/README.md b/dgraphee/README.md new file mode 100644 index 00000000000..a41c42f2c1c --- /dev/null +++ b/dgraphee/README.md @@ -0,0 +1,4 @@ +# Dgraph Enterprise Edition (EE) + +The files stored here correspond to the Dgraph Enterprise Edition features, which are _not_ under the Apache 2 License. + diff --git a/dgraphee/cmd/backup.go b/dgraphee/cmd/backup.go new file mode 100644 index 00000000000..6273c15d87e --- /dev/null +++ b/dgraphee/cmd/backup.go @@ -0,0 +1,117 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package zero + +import ( + "hash/crc32" + "io" + "sync" + + "github.com/dgraph-io/dgraph/edgraph" + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" +) + +func (s *edgraph.Server) Backup(req *pb.BackupRequest, stream pb.Zero_BackupServer) error { + var wg sync.WaitGroup + ckvs, cerr := make(chan *pb.KVS, 100), make(chan error, 1) + wg.Add(1) + go processKVS(&wg, stream, ckvs, cerr) + + for _, group := range s.KnownGroups() { + pl := s.Leader(group) + if pl == nil { + x.Printf("Backup: No healthy connection found to leader of group %d\n", group) + continue + } + + x.Printf("Backup: Requesting snapshot: group %d\n", group) + ctx, worker := s.Node.ctx, pb.NewWorkerClient(pl.Get()) + kvs, err := worker.StreamSnapshot(ctx, &pb.Snapshot{}) + if err != nil { + return err + } + + count := 0 + for kvs := range fetchKVS(kvs, cerr) { + select { + case ckvs <- kvs: + count += len(kvs.Kv) + case <-ctx.Done(): + close(ckvs) + return ctx.Err() + case err := <-cerr: + x.Println("Failure:", err) + close(ckvs) + return err + } + } + x.Printf("Backup: Group %d sent %d keys.\n", group, count) + } + + close(ckvs) + wg.Wait() + + // check for any errors from processKVS + if err := <-cerr; err != nil { + x.Println("Error:", err) + return err + } + + return nil +} + +// fetchKVS gets streamed snapshot from worker. +func fetchKVS(stream pb.Worker_StreamSnapshotClient, cerr chan error) chan *pb.KVS { + out := make(chan *pb.KVS) + go func() { + for { + kvs, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + cerr <- err + break + } + out <- kvs + } + close(out) + }() + return out +} + +// processKVS unrolls the KVS list values and streams them back to the client. +// Postprocessing should happen at the client side. +func processKVS(wg *sync.WaitGroup, stream pb.Zero_BackupServer, in chan *pb.KVS, + cerr chan error) { + defer wg.Done() + + h := crc32.NewIEEE() + for kvs := range in { + for _, kv := range kvs.Kv { + if kv.Version == 0 { + continue + } + b, err := kv.Marshal() + if err != nil { + cerr <- err + return + } + + resp := &pb.BackupResponse{ + Data: b, + Length: uint64(len(b)), + Checksum: h.Sum(b), + } + if err := stream.Send(resp); err != nil { + cerr <- err + return + } + } + } + cerr <- nil +} diff --git a/dgraphee/cmd/backup.proto b/dgraphee/cmd/backup.proto new file mode 100644 index 00000000000..bccffad7af7 --- /dev/null +++ b/dgraphee/cmd/backup.proto @@ -0,0 +1,25 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +syntax = "proto3"; + +package pb; + +import "gogoproto/gogo.proto"; +// import "api.proto"; + +option (gogoproto.marshaler_all) = true; +option (gogoproto.sizer_all) = true; +option (gogoproto.unmarshaler_all) = true; +option (gogoproto.goproto_getters_all) = true; + +message BackupRequest { + uint64 start_ts = 1; +} + message BackupResponse { + bytes data = 1; + uint64 length = 2; + bytes checksum = 3; +} diff --git a/dgraphee/cmd/backup/backup.go b/dgraphee/cmd/backup/backup.go new file mode 100644 index 00000000000..20917ae3354 --- /dev/null +++ b/dgraphee/cmd/backup/backup.go @@ -0,0 +1,69 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "bytes" + "context" + "hash/crc32" + "io" + "io/ioutil" + "time" + + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" + "github.com/matttproud/golang_protobuf_extensions/pbutil" + "google.golang.org/grpc" +) + +type backup struct { + target, source handler + incremental bool + dst string + start time.Time // To get time elapsel. + zeroconn *grpc.ClientConn +} + +func (b *backup) process() error { + tempFile, err := ioutil.TempFile(opt.tmpDir, "dgraph-backup-*") + if err != nil { + return err + } + defer tempFile.Close() + + zc := pb.NewZeroClient(b.zeroconn) + stream, err := zc.Backup(context.Background(), &pb.BackupRequest{}) + if err != nil { + return err + } + + h := crc32.NewIEEE() + for { + res, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + return err + } + + csum := h.Sum(res.Data) + if !bytes.Equal(csum, res.Checksum) { + x.Printf("Warning: data checksum failed: %x != %x\n", csum, res.Checksum) + continue + } + + if _, err := pbutil.WriteDelimited(tempFile, res); err != nil { + return x.Errorf("Backup: could not save to temp file: %s\n", err) + } + } + + if err := b.target.Copy(tempFile.Name(), b.dst); err != nil { + return x.Errorf("Backup: could not copy to destination: %s\n", err) + } + + return nil +} diff --git a/dgraphee/cmd/backup/file_handler.go b/dgraphee/cmd/backup/file_handler.go new file mode 100644 index 00000000000..1b9d9563ede --- /dev/null +++ b/dgraphee/cmd/backup/file_handler.go @@ -0,0 +1,68 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "io" + "os" + "path/filepath" + + "github.com/dgraph-io/dgraph/x" +) + +const dgraphBackupFullPrefix = "full-" +const dgraphBackupPartialPrefix = "part-" +const dgraphBackupSuffix = ".dgraph-backup" + +type fileHandler struct { + path string +} + +func (h *fileHandler) Session(_, path string) error { + h.path = path + return os.Chdir(h.path) +} + +func (h *fileHandler) List() ([]string, error) { + return filepath.Glob(filepath.Join(h.path, "*"+dgraphBackupSuffix)) +} + +func (h *fileHandler) Copy(in, out string) error { + if filepath.Base(out) == out { + out = filepath.Join(h.path, out) + } + + if h.Exists(out) { + return x.Errorf("file already exists: %q", out) + } + + src, err := os.Open(in) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.Create(out) + if err != nil { + return err + } + defer dst.Close() + + if _, err = io.Copy(dst, src); err != nil { + return err + } + + return dst.Sync() +} + +func (h *fileHandler) Exists(path string) bool { + _, err := os.Stat(path) + return os.IsExist(err) +} + +func init() { + handlers["file"] = &fileHandler{} +} diff --git a/dgraphee/cmd/backup/handler.go b/dgraphee/cmd/backup/handler.go new file mode 100644 index 00000000000..c7b9a5aad03 --- /dev/null +++ b/dgraphee/cmd/backup/handler.go @@ -0,0 +1,46 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "net/url" + + "github.com/dgraph-io/dgraph/x" +) + +// handler interface is implemented by uri scheme handlers. +// +// Session() will read any supported environment variables and authenticate if needed. +// List() returns a sorted slice of files at a location; such as remote or local. +// Copy() copies a local file (from tmpDir) to a new destination, possibly remote. +// Exists() tests if a file exists. +type handler interface { + Session(string, string) error + List() ([]string, error) + Copy(string, string) error + Exists(string) bool +} + +// handlers map uri scheme to a handler +var handlers = make(map[string]handler, 0) + +func findHandler(uri string) (handler, error) { + u, err := url.Parse(uri) + if err != nil { + return nil, err + } + if u.Scheme == "" { + u.Scheme = "file" + } + h, ok := handlers[u.Scheme] + if !ok { + return nil, x.Errorf("invalid scheme %q", u.Scheme) + } + if err := h.Session(u.Host, u.Path); err != nil { + return nil, err + } + return h, nil +} diff --git a/dgraphee/cmd/backup/run.go b/dgraphee/cmd/backup/run.go new file mode 100644 index 00000000000..3dcf5880a77 --- /dev/null +++ b/dgraphee/cmd/backup/run.go @@ -0,0 +1,131 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "fmt" + "net/http" + _ "net/http/pprof" + "os" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + + "github.com/dgraph-io/dgraph/x" + "github.com/spf13/cobra" +) + +var opt struct { + zero string + tmpDir string + target string + source string +} + +var tlsConf x.TLSHelperConfig + +var Backup x.SubCommand + +func init() { + Backup.Cmd = &cobra.Command{ + Use: "backup", + Short: "Run Dgraph backup", + Run: func(cmd *cobra.Command, args []string) { + defer x.StartProfile(Backup.Conf).Stop() + if err := run(); err != nil { + x.Printf("Backup: %s\n", err) + os.Exit(1) + } + }, + } + Backup.EnvPrefix = "DGRAPH_BACKUP" + + flag := Backup.Cmd.Flags() + flag.StringVarP(&opt.zero, "zero", "z", "127.0.0.1:5080", "Dgraphzero gRPC server address") + flag.StringVar(&opt.tmpDir, "tmpdir", "", "Directory to store temporary files") + flag.StringVarP(&opt.target, "target", "t", "", "URI path target to store the backups") + flag.StringVarP(&opt.source, "source", "s", "", "URI path source containing full backups") + x.RegisterTLSFlags(flag) + Backup.Cmd.MarkFlagRequired("target") +} + +func run() error { + x.LoadTLSConfig(&tlsConf, Backup.Conf) + x.Printf("%#v\n", opt) + + go http.ListenAndServe("localhost:6060", nil) + + b, err := setup() + if err != nil { + return err + } + fmt.Printf("Backup: saving to: %s ...\n", b.dst) + if err := b.process(); err != nil { + return err + } + fmt.Printf("Backup: time elapsed: %s\n", time.Since(b.start)) + + return nil +} + +func setup() (*backup, error) { + h, err := findHandler(opt.target) + if err != nil { + return nil, x.Errorf("Backup: failed to find target handler: %s", err) + } + + connzero, err := setupConnection(opt.zero, true) + if err != nil { + return nil, x.Errorf("Backup: unable to connect to zero at %q: %s", opt.zero, err) + } + + start := time.Now() + b := &backup{ + start: start, + zeroconn: connzero, + target: h, + dst: dgraphBackupFullPrefix + start.Format(time.RFC3339) + dgraphBackupSuffix, + } + + if opt.source != "" { + b.source, err = findHandler(opt.source) + if err != nil { + return nil, x.Errorf("Backup: failed to find a source handler: %s", err) + } + } + + b.incremental = b.source != nil + + return b, nil +} + +func setupConnection(host string, insecure bool) (*grpc.ClientConn, error) { + if insecure { + return grpc.Dial(host, + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(x.GrpcMaxSize), + grpc.MaxCallSendMsgSize(x.GrpcMaxSize)), + grpc.WithInsecure(), + grpc.WithBlock(), + grpc.WithTimeout(10*time.Second)) + } + + tlsConf.ConfigType = x.TLSClientConfig + tlsConf.CertRequired = false + tlsCfg, _, err := x.GenerateTLSConfig(tlsConf) + if err != nil { + return nil, err + } + + return grpc.Dial(host, + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(x.GrpcMaxSize), + grpc.MaxCallSendMsgSize(x.GrpcMaxSize)), + grpc.WithTransportCredentials(credentials.NewTLS(tlsCfg)), + grpc.WithBlock(), + grpc.WithTimeout(10*time.Second)) +} From 0de29eae2f0b681a05f6365b5de7f9835c4d92f9 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 16 Oct 2018 14:32:17 -0700 Subject: [PATCH 02/25] saving changes --- dgraphee/cmd/backup.go | 117 -------------------------------------- dgraphee/cmd/backup.proto | 25 -------- protos/pb.proto | 1 + 3 files changed, 1 insertion(+), 142 deletions(-) delete mode 100644 dgraphee/cmd/backup.go delete mode 100644 dgraphee/cmd/backup.proto diff --git a/dgraphee/cmd/backup.go b/dgraphee/cmd/backup.go deleted file mode 100644 index 6273c15d87e..00000000000 --- a/dgraphee/cmd/backup.go +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package zero - -import ( - "hash/crc32" - "io" - "sync" - - "github.com/dgraph-io/dgraph/edgraph" - "github.com/dgraph-io/dgraph/protos/pb" - "github.com/dgraph-io/dgraph/x" -) - -func (s *edgraph.Server) Backup(req *pb.BackupRequest, stream pb.Zero_BackupServer) error { - var wg sync.WaitGroup - ckvs, cerr := make(chan *pb.KVS, 100), make(chan error, 1) - wg.Add(1) - go processKVS(&wg, stream, ckvs, cerr) - - for _, group := range s.KnownGroups() { - pl := s.Leader(group) - if pl == nil { - x.Printf("Backup: No healthy connection found to leader of group %d\n", group) - continue - } - - x.Printf("Backup: Requesting snapshot: group %d\n", group) - ctx, worker := s.Node.ctx, pb.NewWorkerClient(pl.Get()) - kvs, err := worker.StreamSnapshot(ctx, &pb.Snapshot{}) - if err != nil { - return err - } - - count := 0 - for kvs := range fetchKVS(kvs, cerr) { - select { - case ckvs <- kvs: - count += len(kvs.Kv) - case <-ctx.Done(): - close(ckvs) - return ctx.Err() - case err := <-cerr: - x.Println("Failure:", err) - close(ckvs) - return err - } - } - x.Printf("Backup: Group %d sent %d keys.\n", group, count) - } - - close(ckvs) - wg.Wait() - - // check for any errors from processKVS - if err := <-cerr; err != nil { - x.Println("Error:", err) - return err - } - - return nil -} - -// fetchKVS gets streamed snapshot from worker. -func fetchKVS(stream pb.Worker_StreamSnapshotClient, cerr chan error) chan *pb.KVS { - out := make(chan *pb.KVS) - go func() { - for { - kvs, err := stream.Recv() - if err == io.EOF { - break - } - if err != nil { - cerr <- err - break - } - out <- kvs - } - close(out) - }() - return out -} - -// processKVS unrolls the KVS list values and streams them back to the client. -// Postprocessing should happen at the client side. -func processKVS(wg *sync.WaitGroup, stream pb.Zero_BackupServer, in chan *pb.KVS, - cerr chan error) { - defer wg.Done() - - h := crc32.NewIEEE() - for kvs := range in { - for _, kv := range kvs.Kv { - if kv.Version == 0 { - continue - } - b, err := kv.Marshal() - if err != nil { - cerr <- err - return - } - - resp := &pb.BackupResponse{ - Data: b, - Length: uint64(len(b)), - Checksum: h.Sum(b), - } - if err := stream.Send(resp); err != nil { - cerr <- err - return - } - } - } - cerr <- nil -} diff --git a/dgraphee/cmd/backup.proto b/dgraphee/cmd/backup.proto deleted file mode 100644 index bccffad7af7..00000000000 --- a/dgraphee/cmd/backup.proto +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -syntax = "proto3"; - -package pb; - -import "gogoproto/gogo.proto"; -// import "api.proto"; - -option (gogoproto.marshaler_all) = true; -option (gogoproto.sizer_all) = true; -option (gogoproto.unmarshaler_all) = true; -option (gogoproto.goproto_getters_all) = true; - -message BackupRequest { - uint64 start_ts = 1; -} - message BackupResponse { - bytes data = 1; - uint64 length = 2; - bytes checksum = 3; -} diff --git a/protos/pb.proto b/protos/pb.proto index 933706030ca..e181c63cf4f 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -25,6 +25,7 @@ syntax = "proto3"; package pb; import "api.proto"; +import "backup.proto"; /* import "gogoproto/gogo.proto"; */ From 396c38aca91b5a7c29929a6cd4fc03069a05ed21 Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 17 Oct 2018 14:26:55 -0700 Subject: [PATCH 03/25] saving state --- dgraph/cmd/cmd.go | 55 -- dgraph/cmd/cmd_ee.go | 32 - dgraph/cmd/root.go | 31 + dgraphee/cmd/backup/backup.go | 2 +- dgraphee/cmd/backup/file_handler.go | 68 -- dgraphee/cmd/backup/handler.go | 2 +- dgraphee/cmd/backup/run.go | 7 +- protos/Makefile | 2 +- protos/pb.proto | 33 +- protos/pb/pb.pb.go | 972 +++++++++++++++++++++------- worker/worker.go | 20 +- 11 files changed, 806 insertions(+), 418 deletions(-) delete mode 100644 dgraph/cmd/cmd.go delete mode 100644 dgraph/cmd/cmd_ee.go delete mode 100644 dgraphee/cmd/backup/file_handler.go diff --git a/dgraph/cmd/cmd.go b/dgraph/cmd/cmd.go deleted file mode 100644 index 44e71ec523c..00000000000 --- a/dgraph/cmd/cmd.go +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors - * - * Licensed 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 cmd - -import ( - "github.com/dgraph-io/dgraph/dgraph/cmd/bulk" - "github.com/dgraph-io/dgraph/dgraph/cmd/cert" - "github.com/dgraph-io/dgraph/dgraph/cmd/conv" - "github.com/dgraph-io/dgraph/dgraph/cmd/debug" - "github.com/dgraph-io/dgraph/dgraph/cmd/live" - "github.com/dgraph-io/dgraph/dgraph/cmd/server" - "github.com/dgraph-io/dgraph/dgraph/cmd/version" - "github.com/dgraph-io/dgraph/dgraph/cmd/zero" - "github.com/dgraph-io/dgraph/x" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -func bindAll(subcommands ...*x.SubCommand) { - for _, sc := range subcommands { - RootCmd.AddCommand(sc.Cmd) - sc.Conf = viper.New() - sc.Conf.BindPFlags(sc.Cmd.Flags()) - sc.Conf.BindPFlags(RootCmd.PersistentFlags()) - sc.Conf.AutomaticEnv() - sc.Conf.SetEnvPrefix(sc.EnvPrefix) - cobra.OnInitialize(func() { - cfg := rootConf.GetString("config") - if cfg == "" { - return - } - sc.Conf.SetConfigFile(cfg) - x.Check(x.Wrapf(sc.Conf.ReadInConfig(), "reading config")) - }) - } -} - -func init() { - bindAll(&bulk.Bulk, &cert.Cert, &conv.Conv, &live.Live, &server.Server, &zero.Zero, - &version.Version, &debug.Debug) -} diff --git a/dgraph/cmd/cmd_ee.go b/dgraph/cmd/cmd_ee.go deleted file mode 100644 index 82bb4040ea4..00000000000 --- a/dgraph/cmd/cmd_ee.go +++ /dev/null @@ -1,32 +0,0 @@ -// // +build dgraphee - -/* - * Copyright 2017-2018 Dgraph Labs, Inc. and Contributors - * - * Licensed 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 cmd - -import "github.com/dgraph-io/dgraph/dgraphee/cmd/backup" - -func init() { - println(` - * - * Dgraph Enterprise Edition. - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - `) - - bindAll(&backup.Backup) -} diff --git a/dgraph/cmd/root.go b/dgraph/cmd/root.go index 399ea4ba491..6c8ddaddcaa 100644 --- a/dgraph/cmd/root.go +++ b/dgraph/cmd/root.go @@ -21,6 +21,14 @@ import ( "fmt" "os" + "github.com/dgraph-io/dgraph/dgraph/cmd/bulk" + "github.com/dgraph-io/dgraph/dgraph/cmd/cert" + "github.com/dgraph-io/dgraph/dgraph/cmd/conv" + "github.com/dgraph-io/dgraph/dgraph/cmd/debug" + "github.com/dgraph-io/dgraph/dgraph/cmd/live" + "github.com/dgraph-io/dgraph/dgraph/cmd/server" + "github.com/dgraph-io/dgraph/dgraph/cmd/version" + "github.com/dgraph-io/dgraph/dgraph/cmd/zero" "github.com/dgraph-io/dgraph/x" "github.com/spf13/cobra" flag "github.com/spf13/pflag" @@ -68,4 +76,27 @@ func init() { "Allow trace endpoint to be accessible from remote") rootConf.BindPFlags(RootCmd.PersistentFlags()) flag.CommandLine.AddGoFlagSet(goflag.CommandLine) + + var subcommands = []*x.SubCommand{ + &bulk.Bulk, &cert.Cert, &conv.Conv, &live.Live, &server.Server, &zero.Zero, + &version.Version, &debug.Debug, + } + for _, sc := range subcommands { + RootCmd.AddCommand(sc.Cmd) + sc.Conf = viper.New() + sc.Conf.BindPFlags(sc.Cmd.Flags()) + sc.Conf.BindPFlags(RootCmd.PersistentFlags()) + sc.Conf.AutomaticEnv() + sc.Conf.SetEnvPrefix(sc.EnvPrefix) + } + cobra.OnInitialize(func() { + cfg := rootConf.GetString("config") + if cfg == "" { + return + } + for _, sc := range subcommands { + sc.Conf.SetConfigFile(cfg) + x.Check(x.Wrapf(sc.Conf.ReadInConfig(), "reading config")) + } + }) } diff --git a/dgraphee/cmd/backup/backup.go b/dgraphee/cmd/backup/backup.go index 20917ae3354..763ed142ca9 100644 --- a/dgraphee/cmd/backup/backup.go +++ b/dgraphee/cmd/backup/backup.go @@ -3,7 +3,7 @@ * */ -package backup +package main import ( "bytes" diff --git a/dgraphee/cmd/backup/file_handler.go b/dgraphee/cmd/backup/file_handler.go deleted file mode 100644 index 1b9d9563ede..00000000000 --- a/dgraphee/cmd/backup/file_handler.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package backup - -import ( - "io" - "os" - "path/filepath" - - "github.com/dgraph-io/dgraph/x" -) - -const dgraphBackupFullPrefix = "full-" -const dgraphBackupPartialPrefix = "part-" -const dgraphBackupSuffix = ".dgraph-backup" - -type fileHandler struct { - path string -} - -func (h *fileHandler) Session(_, path string) error { - h.path = path - return os.Chdir(h.path) -} - -func (h *fileHandler) List() ([]string, error) { - return filepath.Glob(filepath.Join(h.path, "*"+dgraphBackupSuffix)) -} - -func (h *fileHandler) Copy(in, out string) error { - if filepath.Base(out) == out { - out = filepath.Join(h.path, out) - } - - if h.Exists(out) { - return x.Errorf("file already exists: %q", out) - } - - src, err := os.Open(in) - if err != nil { - return err - } - defer src.Close() - - dst, err := os.Create(out) - if err != nil { - return err - } - defer dst.Close() - - if _, err = io.Copy(dst, src); err != nil { - return err - } - - return dst.Sync() -} - -func (h *fileHandler) Exists(path string) bool { - _, err := os.Stat(path) - return os.IsExist(err) -} - -func init() { - handlers["file"] = &fileHandler{} -} diff --git a/dgraphee/cmd/backup/handler.go b/dgraphee/cmd/backup/handler.go index c7b9a5aad03..2ceb568c6be 100644 --- a/dgraphee/cmd/backup/handler.go +++ b/dgraphee/cmd/backup/handler.go @@ -3,7 +3,7 @@ * */ -package backup +package main import ( "net/url" diff --git a/dgraphee/cmd/backup/run.go b/dgraphee/cmd/backup/run.go index 3dcf5880a77..f9521521503 100644 --- a/dgraphee/cmd/backup/run.go +++ b/dgraphee/cmd/backup/run.go @@ -3,7 +3,7 @@ * */ -package backup +package main import ( "fmt" @@ -12,11 +12,10 @@ import ( "os" "time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/dgraph-io/dgraph/x" "github.com/spf13/cobra" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) var opt struct { diff --git a/protos/Makefile b/protos/Makefile index 3bca3d113fb..fc814de76fa 100644 --- a/protos/Makefile +++ b/protos/Makefile @@ -15,7 +15,7 @@ # PROTO_PATH := ${GOPATH}/src:. -PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/gogo/protobuf +PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/dgraph-io/dgraph PROTO_PATH := ${PROTO_PATH}:${GOPATH}/src/github.com/dgraph-io/dgo/protos .PHONY: help diff --git a/protos/pb.proto b/protos/pb.proto index e181c63cf4f..63b567e420a 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -25,7 +25,6 @@ syntax = "proto3"; package pb; import "api.proto"; -import "backup.proto"; /* import "gogoproto/gogo.proto"; */ @@ -411,15 +410,15 @@ service Zero { service Worker { // Data serving RPCs. - rpc Mutate (Mutations) returns (api.TxnContext) {} - rpc ServeTask (Query) returns (Result) {} - rpc StreamSnapshot (Snapshot) returns (stream KVS) {} - rpc Sort (SortMessage) returns (SortResult) {} - rpc Schema (SchemaRequest) returns (SchemaResult) {} - rpc PurgeTs (api.Payload) returns (Num) {} - + rpc Mutate (Mutations) returns (api.TxnContext) {} + rpc ServeTask (Query) returns (Result) {} + rpc StreamSnapshot (Snapshot) returns (stream KVS) {} + rpc Sort (SortMessage) returns (SortResult) {} + rpc Schema (SchemaRequest) returns (SchemaResult) {} + rpc PurgeTs (api.Payload) returns (Num) {} + rpc Backup (BackupRequest) returns (BackupResponse) {} rpc Export (ExportPayload) returns (ExportPayload) {} - rpc ReceivePredicate(stream KVS) returns (api.Payload) {} + rpc ReceivePredicate(stream KVS) returns (api.Payload) {} rpc MovePredicate(MovePredicatePayload) returns (api.Payload) {} } @@ -441,4 +440,20 @@ message SnapshotMeta { uint32 group_id = 2; } +message BackupRequest { + uint64 start_ts = 1; + string endpoint = 2; +} + +message BackupResponse { + string message = 1; + enum Status { + NONE = 0; + SUCCESS = 1; + DUPLICATE = 2; + FAILED = 3; + } + Status status = 2; +} + // vim: noexpandtab sw=2 ts=2 diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 7328812e672..a77bfacc8ae 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{17, 0} + return fileDescriptor_pb_76a78ed8de9876ee, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{24, 0} + return fileDescriptor_pb_76a78ed8de9876ee, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{24, 1} + return fileDescriptor_pb_76a78ed8de9876ee, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{34, 0} + return fileDescriptor_pb_76a78ed8de9876ee, []int{34, 0} } type ExportPayload_Status int32 @@ -179,7 +179,36 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{37, 0} + return fileDescriptor_pb_76a78ed8de9876ee, []int{37, 0} +} + +type BackupResponse_Status int32 + +const ( + BackupResponse_NONE BackupResponse_Status = 0 + BackupResponse_SUCCESS BackupResponse_Status = 1 + BackupResponse_DUPLICATE BackupResponse_Status = 2 + BackupResponse_FAILED BackupResponse_Status = 3 +) + +var BackupResponse_Status_name = map[int32]string{ + 0: "NONE", + 1: "SUCCESS", + 2: "DUPLICATE", + 3: "FAILED", +} +var BackupResponse_Status_value = map[string]int32{ + "NONE": 0, + "SUCCESS": 1, + "DUPLICATE": 2, + "FAILED": 3, +} + +func (x BackupResponse_Status) String() string { + return proto.EnumName(BackupResponse_Status_name, int32(x)) +} +func (BackupResponse_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_pb_76a78ed8de9876ee, []int{47, 0} } type List struct { @@ -193,7 +222,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{0} + return fileDescriptor_pb_76a78ed8de9876ee, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +270,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{1} + return fileDescriptor_pb_76a78ed8de9876ee, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +326,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{2} + return fileDescriptor_pb_76a78ed8de9876ee, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +399,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{3} + return fileDescriptor_pb_76a78ed8de9876ee, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +516,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{4} + return fileDescriptor_pb_76a78ed8de9876ee, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +563,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{5} + return fileDescriptor_pb_76a78ed8de9876ee, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +616,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{6} + return fileDescriptor_pb_76a78ed8de9876ee, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +707,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{7} + return fileDescriptor_pb_76a78ed8de9876ee, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +772,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{8} + return fileDescriptor_pb_76a78ed8de9876ee, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +847,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{9} + return fileDescriptor_pb_76a78ed8de9876ee, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +897,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{10} + return fileDescriptor_pb_76a78ed8de9876ee, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +974,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{11} + return fileDescriptor_pb_76a78ed8de9876ee, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1064,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{12} + return fileDescriptor_pb_76a78ed8de9876ee, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1125,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{13} + return fileDescriptor_pb_76a78ed8de9876ee, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1231,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{14} + return fileDescriptor_pb_76a78ed8de9876ee, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1329,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{15} + return fileDescriptor_pb_76a78ed8de9876ee, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1395,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{16} + return fileDescriptor_pb_76a78ed8de9876ee, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1485,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{17} + return fileDescriptor_pb_76a78ed8de9876ee, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1593,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{18} + return fileDescriptor_pb_76a78ed8de9876ee, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1675,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{19} + return fileDescriptor_pb_76a78ed8de9876ee, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1695,7 +1724,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{20} + return fileDescriptor_pb_76a78ed8de9876ee, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1762,7 +1791,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{21} + return fileDescriptor_pb_76a78ed8de9876ee, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1851,7 +1880,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{22} + return fileDescriptor_pb_76a78ed8de9876ee, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1901,7 +1930,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{23} + return fileDescriptor_pb_76a78ed8de9876ee, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1980,7 +2009,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{24} + return fileDescriptor_pb_76a78ed8de9876ee, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2093,7 +2122,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{25} + return fileDescriptor_pb_76a78ed8de9876ee, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2162,7 +2191,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{26} + return fileDescriptor_pb_76a78ed8de9876ee, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2217,7 +2246,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{27} + return fileDescriptor_pb_76a78ed8de9876ee, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2271,7 +2300,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{28} + return fileDescriptor_pb_76a78ed8de9876ee, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2318,7 +2347,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{29} + return fileDescriptor_pb_76a78ed8de9876ee, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2367,7 +2396,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{30} + return fileDescriptor_pb_76a78ed8de9876ee, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2431,7 +2460,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{31} + return fileDescriptor_pb_76a78ed8de9876ee, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2496,7 +2525,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{32} + return fileDescriptor_pb_76a78ed8de9876ee, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2557,7 +2586,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{33} + return fileDescriptor_pb_76a78ed8de9876ee, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2611,7 +2640,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{34} + return fileDescriptor_pb_76a78ed8de9876ee, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2711,7 +2740,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{35} + return fileDescriptor_pb_76a78ed8de9876ee, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2775,7 +2804,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{36} + return fileDescriptor_pb_76a78ed8de9876ee, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2849,7 +2878,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{37} + return fileDescriptor_pb_76a78ed8de9876ee, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2918,7 +2947,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{38} + return fileDescriptor_pb_76a78ed8de9876ee, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2973,7 +3002,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{39} + return fileDescriptor_pb_76a78ed8de9876ee, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3027,7 +3056,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{40} + return fileDescriptor_pb_76a78ed8de9876ee, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3074,7 +3103,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{41} + return fileDescriptor_pb_76a78ed8de9876ee, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3122,7 +3151,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{42} + return fileDescriptor_pb_76a78ed8de9876ee, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3177,7 +3206,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{43} + return fileDescriptor_pb_76a78ed8de9876ee, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3234,7 +3263,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{44} + return fileDescriptor_pb_76a78ed8de9876ee, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3296,7 +3325,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_9efe0d9dc85f5a85, []int{45} + return fileDescriptor_pb_76a78ed8de9876ee, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3339,6 +3368,116 @@ func (m *SnapshotMeta) GetGroupId() uint32 { return 0 } +type BackupRequest struct { + StartTs uint64 `protobuf:"varint,1,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` + Endpoint string `protobuf:"bytes,2,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BackupRequest) Reset() { *m = BackupRequest{} } +func (m *BackupRequest) String() string { return proto.CompactTextString(m) } +func (*BackupRequest) ProtoMessage() {} +func (*BackupRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_76a78ed8de9876ee, []int{46} +} +func (m *BackupRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BackupRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *BackupRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupRequest.Merge(dst, src) +} +func (m *BackupRequest) XXX_Size() int { + return m.Size() +} +func (m *BackupRequest) XXX_DiscardUnknown() { + xxx_messageInfo_BackupRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupRequest proto.InternalMessageInfo + +func (m *BackupRequest) GetStartTs() uint64 { + if m != nil { + return m.StartTs + } + return 0 +} + +func (m *BackupRequest) GetEndpoint() string { + if m != nil { + return m.Endpoint + } + return "" +} + +type BackupResponse struct { + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Status BackupResponse_Status `protobuf:"varint,2,opt,name=status,proto3,enum=pb.BackupResponse_Status" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *BackupResponse) Reset() { *m = BackupResponse{} } +func (m *BackupResponse) String() string { return proto.CompactTextString(m) } +func (*BackupResponse) ProtoMessage() {} +func (*BackupResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_76a78ed8de9876ee, []int{47} +} +func (m *BackupResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BackupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BackupResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (dst *BackupResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupResponse.Merge(dst, src) +} +func (m *BackupResponse) XXX_Size() int { + return m.Size() +} +func (m *BackupResponse) XXX_DiscardUnknown() { + xxx_messageInfo_BackupResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupResponse proto.InternalMessageInfo + +func (m *BackupResponse) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + +func (m *BackupResponse) GetStatus() BackupResponse_Status { + if m != nil { + return m.Status + } + return BackupResponse_NONE +} + func init() { proto.RegisterType((*List)(nil), "pb.List") proto.RegisterType((*TaskValue)(nil), "pb.TaskValue") @@ -3390,11 +3529,14 @@ func init() { proto.RegisterType((*Num)(nil), "pb.Num") proto.RegisterType((*AssignedIds)(nil), "pb.AssignedIds") proto.RegisterType((*SnapshotMeta)(nil), "pb.SnapshotMeta") + proto.RegisterType((*BackupRequest)(nil), "pb.BackupRequest") + proto.RegisterType((*BackupResponse)(nil), "pb.BackupResponse") proto.RegisterEnum("pb.DirectedEdge_Op", DirectedEdge_Op_name, DirectedEdge_Op_value) proto.RegisterEnum("pb.Posting_ValType", Posting_ValType_name, Posting_ValType_value) proto.RegisterEnum("pb.Posting_PostingType", Posting_PostingType_name, Posting_PostingType_value) proto.RegisterEnum("pb.SchemaUpdate_Directive", SchemaUpdate_Directive_name, SchemaUpdate_Directive_value) proto.RegisterEnum("pb.ExportPayload_Status", ExportPayload_Status_name, ExportPayload_Status_value) + proto.RegisterEnum("pb.BackupResponse_Status", BackupResponse_Status_name, BackupResponse_Status_value) } // Reference imports to suppress errors if they are not otherwise used. @@ -3934,6 +4076,7 @@ type WorkerClient interface { Sort(ctx context.Context, in *SortMessage, opts ...grpc.CallOption) (*SortResult, error) Schema(ctx context.Context, in *SchemaRequest, opts ...grpc.CallOption) (*SchemaResult, error) PurgeTs(ctx context.Context, in *api.Payload, opts ...grpc.CallOption) (*Num, error) + Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*BackupResponse, error) Export(ctx context.Context, in *ExportPayload, opts ...grpc.CallOption) (*ExportPayload, error) ReceivePredicate(ctx context.Context, opts ...grpc.CallOption) (Worker_ReceivePredicateClient, error) MovePredicate(ctx context.Context, in *MovePredicatePayload, opts ...grpc.CallOption) (*api.Payload, error) @@ -4024,6 +4167,15 @@ func (c *workerClient) PurgeTs(ctx context.Context, in *api.Payload, opts ...grp return out, nil } +func (c *workerClient) Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*BackupResponse, error) { + out := new(BackupResponse) + err := c.cc.Invoke(ctx, "/pb.Worker/Backup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *workerClient) Export(ctx context.Context, in *ExportPayload, opts ...grpc.CallOption) (*ExportPayload, error) { out := new(ExportPayload) err := c.cc.Invoke(ctx, "/pb.Worker/Export", in, out, opts...) @@ -4085,6 +4237,7 @@ type WorkerServer interface { Sort(context.Context, *SortMessage) (*SortResult, error) Schema(context.Context, *SchemaRequest) (*SchemaResult, error) PurgeTs(context.Context, *api.Payload) (*Num, error) + Backup(context.Context, *BackupRequest) (*BackupResponse, error) Export(context.Context, *ExportPayload) (*ExportPayload, error) ReceivePredicate(Worker_ReceivePredicateServer) error MovePredicate(context.Context, *MovePredicatePayload) (*api.Payload, error) @@ -4205,6 +4358,24 @@ func _Worker_PurgeTs_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Worker_Backup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BackupRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkerServer).Backup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.Worker/Backup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkerServer).Backup(ctx, req.(*BackupRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Worker_Export_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ExportPayload) if err := dec(in); err != nil { @@ -4291,6 +4462,10 @@ var _Worker_serviceDesc = grpc.ServiceDesc{ MethodName: "PurgeTs", Handler: _Worker_PurgeTs_Handler, }, + { + MethodName: "Backup", + Handler: _Worker_Backup_Handler, + }, { MethodName: "Export", Handler: _Worker_Export_Handler, @@ -6723,6 +6898,70 @@ func (m *SnapshotMeta) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *BackupRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.StartTs != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.StartTs)) + } + if len(m.Endpoint) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.Endpoint))) + i += copy(dAtA[i:], m.Endpoint) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *BackupResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BackupResponse) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Message) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.Message))) + i += copy(dAtA[i:], m.Message) + } + if m.Status != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.Status)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + func encodeVarintPb(dAtA []byte, offset int, v uint64) int { for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) @@ -7980,6 +8219,44 @@ func (m *SnapshotMeta) Size() (n int) { return n } +func (m *BackupRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.StartTs != 0 { + n += 1 + sovPb(uint64(m.StartTs)) + } + l = len(m.Endpoint) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *BackupResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Message) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } + if m.Status != 0 { + n += 1 + sovPb(uint64(m.Status)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovPb(x uint64) (n int) { for { n++ @@ -14973,6 +15250,204 @@ func (m *SnapshotMeta) Unmarshal(dAtA []byte) error { } return nil } +func (m *BackupRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BackupRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BackupRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTs", wireType) + } + m.StartTs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.StartTs |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BackupResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BackupResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BackupResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= (BackupResponse_Status(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPb(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthPb + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipPb(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 @@ -15078,199 +15553,204 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_9efe0d9dc85f5a85) } - -var fileDescriptor_pb_9efe0d9dc85f5a85 = []byte{ - // 3047 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4b, 0x73, 0xe3, 0xc6, - 0xd1, 0x02, 0x48, 0x82, 0x40, 0x93, 0xd4, 0xd2, 0xe3, 0xf5, 0x9a, 0xa6, 0x6d, 0xad, 0x0c, 0xef, - 0x43, 0xde, 0xb5, 0xf5, 0xc9, 0xb2, 0xbf, 0xf2, 0xe3, 0xa6, 0x15, 0xa9, 0x2d, 0x7a, 0xf5, 0xca, - 0x90, 0x92, 0x13, 0x1f, 0xcc, 0x82, 0x88, 0x11, 0x85, 0x08, 0x04, 0x60, 0x0c, 0xa8, 0xa2, 0x7c, - 0x48, 0x55, 0x2e, 0xf9, 0x0d, 0x3e, 0xe5, 0x90, 0xdc, 0x92, 0x3f, 0x90, 0xfc, 0x80, 0x54, 0xf9, - 0x98, 0x6b, 0x6e, 0xa9, 0xcd, 0x29, 0xe7, 0x54, 0x2a, 0x87, 0x5c, 0x52, 0xd3, 0x33, 0x78, 0x90, - 0x2b, 0x69, 0xed, 0x54, 0xe5, 0x44, 0xf4, 0x63, 0x7a, 0x66, 0xba, 0x7b, 0xfa, 0x45, 0x30, 0xa3, - 0x93, 0xf5, 0x28, 0x0e, 0x93, 0x90, 0xe8, 0xd1, 0x49, 0xdb, 0x72, 0x22, 0x4f, 0x82, 0x76, 0x1b, - 0xca, 0xbb, 0x1e, 0x4f, 0x08, 0x81, 0xf2, 0xd4, 0x73, 0x79, 0x4b, 0x5b, 0x2d, 0xad, 0x19, 0x14, - 0xbf, 0xed, 0x3d, 0xb0, 0x06, 0x0e, 0x3f, 0x3f, 0x76, 0xfc, 0x29, 0x23, 0x4d, 0x28, 0x5d, 0x38, - 0x7e, 0x4b, 0x5b, 0xd5, 0xd6, 0xea, 0x54, 0x7c, 0x92, 0x75, 0x30, 0x2f, 0x1c, 0x7f, 0x98, 0x5c, - 0x46, 0xac, 0xa5, 0xaf, 0x6a, 0x6b, 0xcb, 0x9b, 0xaf, 0xae, 0x47, 0x27, 0xeb, 0x87, 0x21, 0x4f, - 0xbc, 0x60, 0xbc, 0x7e, 0xec, 0xf8, 0x83, 0xcb, 0x88, 0xd1, 0xea, 0x85, 0xfc, 0xb0, 0x0f, 0xa0, - 0xd6, 0x8f, 0x47, 0x3b, 0xd3, 0x60, 0x94, 0x78, 0x61, 0x20, 0x76, 0x0c, 0x9c, 0x09, 0x43, 0x89, - 0x16, 0xc5, 0x6f, 0x81, 0x73, 0xe2, 0x31, 0x6f, 0x95, 0x56, 0x4b, 0x02, 0x27, 0xbe, 0x49, 0x0b, - 0xaa, 0x1e, 0xdf, 0x0e, 0xa7, 0x41, 0xd2, 0x2a, 0xaf, 0x6a, 0x6b, 0x26, 0x4d, 0x41, 0xfb, 0x1f, - 0x3a, 0x54, 0x7e, 0x32, 0x65, 0xf1, 0x25, 0xae, 0x4b, 0x92, 0x38, 0x95, 0x25, 0xbe, 0xc9, 0x6d, - 0xa8, 0xf8, 0x4e, 0x30, 0xe6, 0x2d, 0x1d, 0x85, 0x49, 0x80, 0xbc, 0x09, 0x96, 0x73, 0x9a, 0xb0, - 0x78, 0x38, 0xf5, 0xdc, 0x56, 0x69, 0x55, 0x5b, 0x33, 0xa8, 0x89, 0x88, 0x23, 0xcf, 0x25, 0x6f, - 0x80, 0xe9, 0x86, 0xc3, 0x51, 0x71, 0x2f, 0x37, 0xc4, 0xbd, 0xc8, 0xbb, 0x60, 0x4e, 0x3d, 0x77, - 0xe8, 0x7b, 0x3c, 0x69, 0x55, 0x56, 0xb5, 0xb5, 0xda, 0xa6, 0x29, 0x2e, 0x2b, 0x74, 0x47, 0xab, - 0x53, 0xcf, 0x45, 0x25, 0x3e, 0x02, 0x93, 0xc7, 0xa3, 0xe1, 0xe9, 0x34, 0x18, 0xb5, 0x0c, 0x64, - 0xba, 0x25, 0x98, 0x0a, 0xb7, 0xa6, 0x55, 0x2e, 0x01, 0x71, 0xad, 0x98, 0x5d, 0xb0, 0x98, 0xb3, - 0x56, 0x55, 0x6e, 0xa5, 0x40, 0xb2, 0x01, 0xb5, 0x53, 0x67, 0xc4, 0x92, 0x61, 0xe4, 0xc4, 0xce, - 0xa4, 0x65, 0xe6, 0x82, 0x76, 0x04, 0xfa, 0x50, 0x60, 0x39, 0x85, 0xd3, 0x0c, 0x20, 0x1f, 0x41, - 0x03, 0x21, 0x3e, 0x3c, 0xf5, 0xfc, 0x84, 0xc5, 0x2d, 0x0b, 0xd7, 0x2c, 0xe3, 0x1a, 0xc4, 0x0c, - 0x62, 0xc6, 0x68, 0x5d, 0x32, 0x49, 0x0c, 0x79, 0x1b, 0x80, 0xcd, 0x22, 0x27, 0x70, 0x87, 0x8e, - 0xef, 0xb7, 0x00, 0xcf, 0x60, 0x49, 0xcc, 0x96, 0xef, 0x93, 0xd7, 0xc5, 0xf9, 0x1c, 0x77, 0x98, - 0xf0, 0x56, 0x63, 0x55, 0x5b, 0x2b, 0x53, 0x43, 0x80, 0x03, 0x6e, 0x6f, 0x82, 0x85, 0x1e, 0x81, - 0x37, 0xbe, 0x0f, 0xc6, 0x85, 0x00, 0xa4, 0xe3, 0xd4, 0x36, 0x1b, 0x62, 0xcb, 0xcc, 0x69, 0xa8, - 0x22, 0xda, 0x2b, 0x60, 0xee, 0x3a, 0xc1, 0x38, 0xf5, 0x34, 0x61, 0x0a, 0x5c, 0x60, 0x51, 0xfc, - 0xb6, 0xbf, 0xd3, 0xc1, 0xa0, 0x8c, 0x4f, 0xfd, 0x84, 0x3c, 0x04, 0x10, 0x8a, 0x9e, 0x38, 0x49, - 0xec, 0xcd, 0x94, 0xd4, 0x5c, 0xd5, 0xd6, 0xd4, 0x73, 0xf7, 0x90, 0x44, 0x36, 0xa0, 0x8e, 0xd2, - 0x53, 0x56, 0x3d, 0x3f, 0x40, 0x76, 0x3e, 0x5a, 0x43, 0x16, 0xb5, 0xe2, 0x0e, 0x18, 0x68, 0x5b, - 0xe9, 0x5f, 0x0d, 0xaa, 0x20, 0x72, 0x1f, 0x96, 0xbd, 0x20, 0x11, 0xba, 0x1f, 0x25, 0x43, 0x97, - 0xf1, 0xd4, 0xf8, 0x8d, 0x0c, 0xdb, 0x61, 0x3c, 0x21, 0x1f, 0x82, 0x54, 0x60, 0xba, 0x61, 0x05, - 0x37, 0x5c, 0xce, 0x0c, 0xc3, 0xe5, 0x8e, 0xc8, 0xa3, 0x76, 0xfc, 0x00, 0x6a, 0xe2, 0x7e, 0xe9, - 0x0a, 0x03, 0x57, 0xd4, 0xf1, 0x36, 0x4a, 0x1d, 0x14, 0x04, 0x83, 0x62, 0x17, 0xaa, 0x11, 0x0e, - 0x26, 0x1d, 0x02, 0xbf, 0xed, 0x2e, 0x54, 0x0e, 0x62, 0x97, 0xc5, 0x57, 0xfa, 0x38, 0x81, 0xb2, - 0xcb, 0xf8, 0x08, 0x9f, 0x9f, 0x49, 0xf1, 0x3b, 0xf7, 0xfb, 0x52, 0xc1, 0xef, 0xed, 0x5f, 0x6b, - 0x50, 0xeb, 0x87, 0x71, 0xb2, 0xc7, 0x38, 0x77, 0xc6, 0x8c, 0xdc, 0x85, 0x4a, 0x28, 0xc4, 0x2a, - 0x0d, 0x5b, 0xe2, 0x4c, 0xb8, 0x0f, 0x95, 0xf8, 0x05, 0x3b, 0xe8, 0xd7, 0xdb, 0xe1, 0x36, 0x54, - 0xe4, 0x8b, 0x11, 0xaf, 0xa9, 0x42, 0x25, 0x20, 0x74, 0x1d, 0x9e, 0x9e, 0x72, 0x26, 0x75, 0x59, - 0xa1, 0x0a, 0xba, 0xde, 0xad, 0xfe, 0x1f, 0x40, 0x9c, 0xef, 0x47, 0x7a, 0x81, 0x7d, 0x06, 0x35, - 0xea, 0x9c, 0x26, 0xdb, 0x61, 0x90, 0xb0, 0x59, 0x42, 0x96, 0x41, 0xf7, 0x5c, 0x54, 0x91, 0x41, - 0x75, 0xcf, 0x15, 0x87, 0x1b, 0xc7, 0xe1, 0x34, 0x42, 0x0d, 0x35, 0xa8, 0x04, 0x50, 0x95, 0xae, - 0x1b, 0xe3, 0x89, 0x85, 0x2a, 0x5d, 0x37, 0x26, 0x77, 0xa1, 0xc6, 0x03, 0x27, 0xe2, 0x67, 0x61, - 0x22, 0x0e, 0x57, 0xc6, 0xc3, 0x41, 0x8a, 0x1a, 0x70, 0xfb, 0x4f, 0x1a, 0x18, 0x7b, 0x6c, 0x72, - 0xc2, 0xe2, 0x17, 0x76, 0x79, 0x03, 0x4c, 0x14, 0x3c, 0xf4, 0x5c, 0xb5, 0x51, 0x15, 0xe1, 0x9e, - 0x7b, 0xe5, 0x56, 0x77, 0xc0, 0xf0, 0x99, 0x23, 0x94, 0x2f, 0xfd, 0x4c, 0x41, 0x42, 0x37, 0xce, - 0x64, 0xe8, 0x32, 0xc7, 0xc5, 0x10, 0x63, 0x52, 0xc3, 0x99, 0x74, 0x98, 0xe3, 0x8a, 0xb3, 0xf9, - 0x0e, 0x4f, 0x86, 0xd3, 0xc8, 0x75, 0x12, 0x86, 0xa1, 0xa5, 0x2c, 0x1c, 0x87, 0x27, 0x47, 0x88, - 0x21, 0x8f, 0xe0, 0x95, 0x91, 0x3f, 0xe5, 0x22, 0xae, 0x79, 0xc1, 0x69, 0x38, 0x0c, 0x03, 0xff, - 0x12, 0xf5, 0x6b, 0xd2, 0x5b, 0x8a, 0xd0, 0x0b, 0x4e, 0xc3, 0x83, 0xc0, 0xbf, 0xb4, 0xff, 0xad, - 0x41, 0xe5, 0x29, 0xaa, 0x61, 0x03, 0xaa, 0x13, 0xbc, 0x50, 0xfa, 0x7a, 0xef, 0x08, 0x0d, 0x23, - 0x6d, 0x5d, 0xde, 0x94, 0x77, 0x83, 0x24, 0xbe, 0xa4, 0x29, 0x9b, 0x58, 0x91, 0x38, 0x27, 0x3e, - 0x4b, 0xb8, 0xf2, 0x88, 0xc2, 0x8a, 0x81, 0x24, 0xa8, 0x15, 0x8a, 0xad, 0xbd, 0x03, 0xf5, 0xa2, - 0x28, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4c, 0xc5, 0x27, 0x59, 0x85, 0x0a, 0x3e, 0x52, - 0xd4, 0x5c, 0x6d, 0x13, 0x84, 0x44, 0xb9, 0x84, 0x4a, 0xc2, 0xe7, 0xfa, 0xa7, 0x9a, 0x90, 0x53, - 0xdc, 0xa0, 0x28, 0xc7, 0xba, 0x5e, 0x8e, 0x5c, 0x52, 0x90, 0x63, 0xff, 0x4b, 0x83, 0xfa, 0x57, - 0x2c, 0x0e, 0x0f, 0xe3, 0x30, 0x0a, 0xb9, 0xe3, 0x13, 0x1b, 0x0c, 0x79, 0xbb, 0x2b, 0xf6, 0x57, - 0x14, 0xc1, 0x23, 0xef, 0x83, 0x66, 0x9c, 0x97, 0xad, 0x28, 0x64, 0x05, 0x60, 0xe2, 0xcc, 0x76, - 0x99, 0xc3, 0x59, 0xcf, 0x4d, 0xdd, 0x27, 0xc7, 0x90, 0x36, 0x98, 0x13, 0x67, 0x36, 0x98, 0x05, - 0x03, 0x8e, 0xd6, 0x2d, 0xd3, 0x0c, 0x26, 0x6f, 0x81, 0x35, 0x71, 0x66, 0xc2, 0x8f, 0x7b, 0xae, - 0xb2, 0x6e, 0x8e, 0x20, 0xef, 0x40, 0x29, 0x99, 0x05, 0x18, 0x14, 0x44, 0x1e, 0x10, 0xb9, 0x7b, - 0x30, 0x0b, 0x94, 0xc7, 0x53, 0x41, 0x4b, 0xb5, 0x61, 0xe6, 0xda, 0x68, 0x42, 0x69, 0xe4, 0xb9, - 0x98, 0x08, 0x2c, 0x2a, 0x3e, 0xed, 0x3f, 0x94, 0xe0, 0x96, 0x32, 0xc5, 0x99, 0x17, 0xf5, 0x13, - 0xe1, 0x37, 0x2d, 0xa8, 0xe2, 0x73, 0x65, 0xb1, 0xb2, 0x48, 0x0a, 0x92, 0x4f, 0xc0, 0x40, 0x17, - 0x4e, 0x0d, 0x7d, 0x37, 0x57, 0x4b, 0xb6, 0x5c, 0x1a, 0x5e, 0x59, 0x5c, 0xb1, 0x93, 0x8f, 0xa1, - 0xf2, 0x2d, 0x8b, 0x43, 0x19, 0x7e, 0x6a, 0x9b, 0x2b, 0x57, 0xad, 0x13, 0x06, 0x50, 0xcb, 0x24, - 0xf3, 0xff, 0x50, 0x7b, 0xf7, 0x44, 0xc0, 0x99, 0x84, 0x17, 0xcc, 0x6d, 0x55, 0xf1, 0x44, 0x45, - 0x03, 0xa7, 0xa4, 0x54, 0x5d, 0x66, 0xa6, 0xae, 0x76, 0x07, 0x6a, 0x85, 0xeb, 0x15, 0xfd, 0xad, - 0x21, 0x35, 0x7c, 0x77, 0xde, 0xdf, 0xac, 0xec, 0x25, 0x14, 0xdd, 0xb6, 0x03, 0x90, 0x5f, 0xf6, - 0xbf, 0x75, 0x7e, 0xfb, 0x97, 0x1a, 0xdc, 0xda, 0x0e, 0x83, 0x80, 0x61, 0x0d, 0x21, 0x4d, 0x97, - 0xfb, 0xad, 0x76, 0xad, 0xdf, 0xbe, 0x07, 0x15, 0x2e, 0x98, 0x95, 0xf4, 0x57, 0xaf, 0xb0, 0x05, - 0x95, 0x1c, 0x22, 0xc4, 0x4c, 0x9c, 0xd9, 0x30, 0x62, 0x81, 0xeb, 0x05, 0x63, 0xf4, 0x73, 0x69, - 0x81, 0x43, 0x89, 0xb1, 0x7f, 0xa3, 0x81, 0x21, 0x5d, 0x7e, 0x2e, 0xdc, 0x69, 0xf3, 0xe1, 0xee, - 0x2d, 0xb0, 0xa2, 0x98, 0xb9, 0xde, 0x28, 0xdd, 0xd5, 0xa2, 0x39, 0x42, 0x44, 0xe3, 0xd3, 0x30, - 0x1e, 0x31, 0x14, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, 0x4d, - 0x81, 0x10, 0xd1, 0x4a, 0x2c, 0xe1, 0x91, 0x33, 0x92, 0x45, 0x52, 0x89, 0x4a, 0x40, 0x44, 0x50, - 0x69, 0x39, 0xb4, 0x98, 0x49, 0x15, 0x64, 0xff, 0x4e, 0x87, 0x7a, 0xc7, 0x8b, 0xd9, 0x28, 0x61, - 0x6e, 0xd7, 0x1d, 0x23, 0x23, 0x0b, 0x12, 0x2f, 0xb9, 0x54, 0xd1, 0x5a, 0x41, 0x59, 0x32, 0xd5, - 0xe7, 0x0b, 0x46, 0x69, 0x8b, 0x12, 0xd6, 0xb8, 0x12, 0x20, 0x9b, 0x00, 0xb2, 0xcc, 0xc0, 0x3a, - 0xb7, 0x7c, 0x7d, 0x9d, 0x6b, 0x21, 0x9b, 0xf8, 0x14, 0x0a, 0x92, 0x6b, 0x3c, 0x19, 0xc9, 0x0d, - 0x2c, 0x82, 0xa7, 0xc2, 0x91, 0x31, 0x3b, 0x9f, 0x30, 0x1f, 0x1d, 0x15, 0xb3, 0xf3, 0x09, 0xf3, - 0xb3, 0x9a, 0xa8, 0x2a, 0x8f, 0x23, 0xbe, 0xc9, 0xbb, 0xa0, 0x87, 0x11, 0xde, 0x4f, 0x6d, 0x58, - 0xbc, 0xd8, 0xfa, 0x41, 0x44, 0xf5, 0x30, 0x12, 0x5e, 0x20, 0x8b, 0xba, 0x96, 0xa5, 0x9c, 0x5b, - 0x84, 0x07, 0x2c, 0x47, 0xa8, 0xa2, 0xd8, 0x77, 0x40, 0x3f, 0x88, 0x48, 0x15, 0x4a, 0xfd, 0xee, - 0xa0, 0xb9, 0x24, 0x3e, 0x3a, 0xdd, 0xdd, 0xa6, 0x66, 0x3f, 0xd7, 0xc0, 0xda, 0x9b, 0x26, 0x8e, - 0xf0, 0x29, 0x7e, 0x93, 0x51, 0xdf, 0x00, 0x93, 0x27, 0x4e, 0x8c, 0x79, 0x51, 0x97, 0x61, 0x02, - 0xe1, 0x01, 0x27, 0x0f, 0xa0, 0xc2, 0xdc, 0x31, 0x4b, 0x5f, 0x7b, 0x73, 0xf1, 0x9c, 0x54, 0x92, - 0xc9, 0x1a, 0x18, 0x7c, 0x74, 0xc6, 0x26, 0x4e, 0xab, 0x9c, 0x33, 0xf6, 0x11, 0x23, 0x53, 0x18, - 0x55, 0x74, 0xac, 0xc1, 0xe3, 0x30, 0xc2, 0xa2, 0xb4, 0xa2, 0x6a, 0xf0, 0x38, 0x8c, 0x44, 0x49, - 0xba, 0x09, 0xaf, 0x79, 0xe3, 0x20, 0x8c, 0xd9, 0xd0, 0x0b, 0x5c, 0x36, 0x1b, 0x8e, 0xc2, 0xe0, - 0xd4, 0xf7, 0x46, 0x09, 0xea, 0xd2, 0xa4, 0xaf, 0x4a, 0x62, 0x4f, 0xd0, 0xb6, 0x15, 0xc9, 0x7e, - 0x17, 0xac, 0x67, 0xec, 0x12, 0x0b, 0x42, 0x4e, 0xee, 0x80, 0x7e, 0x7e, 0xa1, 0x72, 0x9d, 0x21, - 0x4e, 0xf0, 0xec, 0x98, 0xea, 0xe7, 0x17, 0xb6, 0x0b, 0x66, 0x5f, 0x25, 0x7a, 0xf2, 0x9e, 0x08, - 0x89, 0x18, 0x5a, 0xd5, 0xc3, 0xc2, 0xca, 0xbb, 0x50, 0x63, 0xd0, 0x94, 0x2e, 0x6c, 0x89, 0x07, - 0x51, 0x4a, 0x91, 0x40, 0xb1, 0xc2, 0x29, 0xcd, 0x55, 0x38, 0xbf, 0xd2, 0xc1, 0xcc, 0xd2, 0xce, - 0x63, 0xb0, 0x26, 0xa9, 0xee, 0xd5, 0xf3, 0xc4, 0xd2, 0x35, 0x33, 0x08, 0xcd, 0xe9, 0xea, 0xdc, - 0xe5, 0xc5, 0x73, 0xe7, 0xef, 0xbb, 0xf2, 0xd2, 0xf7, 0xfd, 0x10, 0x6e, 0x8d, 0x7c, 0xe6, 0x04, - 0xc3, 0xfc, 0x79, 0x4a, 0x0f, 0x5c, 0x46, 0xf4, 0x61, 0xf6, 0x46, 0x55, 0x8c, 0xaa, 0xe6, 0xa9, - 0xe4, 0x3e, 0x54, 0x5c, 0xe6, 0x27, 0x4e, 0xb1, 0x13, 0x39, 0x88, 0x9d, 0x91, 0xcf, 0x3a, 0x02, - 0x4d, 0x25, 0x95, 0xac, 0x81, 0x99, 0x56, 0x4b, 0xaa, 0xff, 0xc0, 0x42, 0x37, 0x55, 0x2c, 0xcd, - 0xa8, 0xf6, 0xdb, 0x50, 0x7a, 0x76, 0xdc, 0xbf, 0xd6, 0x1a, 0x5f, 0x83, 0xfe, 0xec, 0xb8, 0x18, - 0x2b, 0xeb, 0x59, 0x4a, 0x13, 0x1d, 0xa8, 0x9e, 0x77, 0xa0, 0x6d, 0x30, 0xa7, 0x9c, 0xc5, 0x7b, - 0x2c, 0x71, 0xd4, 0xa3, 0xcd, 0x60, 0x91, 0xda, 0x44, 0x3b, 0xe5, 0x85, 0x81, 0x4a, 0x27, 0x29, - 0x68, 0xff, 0xbd, 0x04, 0x55, 0xf5, 0x78, 0x85, 0xcc, 0x69, 0x56, 0xca, 0x89, 0xcf, 0x3c, 0x0a, - 0xe8, 0xc5, 0x28, 0x50, 0xec, 0x75, 0x4b, 0x2f, 0xef, 0x75, 0xc9, 0xe7, 0x50, 0x8f, 0x24, 0xad, - 0x18, 0x37, 0x5e, 0x2f, 0xae, 0x51, 0xbf, 0xb8, 0xae, 0x16, 0xe5, 0x80, 0x78, 0x01, 0xd8, 0x34, - 0x24, 0xce, 0x18, 0x0d, 0x5b, 0xa7, 0x55, 0x01, 0x0f, 0x9c, 0xf1, 0x35, 0xd1, 0xe3, 0x07, 0x04, - 0x01, 0x51, 0xb2, 0x86, 0x51, 0xab, 0x8e, 0x0f, 0x5b, 0x04, 0x8e, 0xe2, 0x9b, 0x6e, 0xcc, 0xbf, - 0xe9, 0x37, 0xc1, 0x1a, 0x85, 0x93, 0x89, 0x87, 0xb4, 0x65, 0x99, 0x6c, 0x25, 0x62, 0xc0, 0xed, - 0x6f, 0xa1, 0xaa, 0x2e, 0x4b, 0x6a, 0x50, 0xed, 0x74, 0x77, 0xb6, 0x8e, 0x76, 0x45, 0x54, 0x01, - 0x30, 0x9e, 0xf4, 0xf6, 0xb7, 0xe8, 0xcf, 0x9a, 0x9a, 0x88, 0x30, 0xbd, 0xfd, 0x41, 0x53, 0x27, - 0x16, 0x54, 0x76, 0x76, 0x0f, 0xb6, 0x06, 0xcd, 0x12, 0x31, 0xa1, 0xfc, 0xe4, 0xe0, 0x60, 0xb7, - 0x59, 0x26, 0x75, 0x30, 0x3b, 0x5b, 0x83, 0xee, 0xa0, 0xb7, 0xd7, 0x6d, 0x56, 0x04, 0xef, 0xd3, - 0xee, 0x41, 0xd3, 0x10, 0x1f, 0x47, 0xbd, 0x4e, 0xb3, 0x2a, 0xe8, 0x87, 0x5b, 0xfd, 0xfe, 0x97, - 0x07, 0xb4, 0xd3, 0x34, 0x85, 0xdc, 0xfe, 0x80, 0xf6, 0xf6, 0x9f, 0x36, 0x2d, 0xfb, 0x43, 0xa8, - 0x15, 0x94, 0x26, 0x56, 0xd0, 0xee, 0x4e, 0x73, 0x49, 0x6c, 0x73, 0xbc, 0xb5, 0x7b, 0xd4, 0x6d, - 0x6a, 0x64, 0x19, 0x00, 0x3f, 0x87, 0xbb, 0x5b, 0xfb, 0x4f, 0x9b, 0xba, 0xfd, 0x8b, 0x6c, 0x09, - 0xf6, 0x9e, 0x0f, 0xc1, 0x54, 0x9a, 0x4e, 0x4b, 0xde, 0x5a, 0xc1, 0x24, 0x34, 0x23, 0x0a, 0xcf, - 0x1a, 0x9d, 0xb1, 0xd1, 0x39, 0x9f, 0x4e, 0x94, 0x23, 0x64, 0xb0, 0x6c, 0x23, 0x85, 0x3a, 0xd2, - 0xf7, 0x2d, 0xa1, 0x6c, 0x84, 0x52, 0x46, 0x7e, 0x39, 0x42, 0xf9, 0x18, 0x20, 0x6f, 0xda, 0xaf, - 0x28, 0x5a, 0x6f, 0x43, 0xc5, 0xf1, 0x3d, 0x87, 0xab, 0x44, 0x24, 0x01, 0x7b, 0x1f, 0x6a, 0x85, - 0x56, 0x5f, 0xd8, 0xca, 0xf1, 0xfd, 0xe1, 0x39, 0xbb, 0xe4, 0xb8, 0xd6, 0xa4, 0x55, 0xc7, 0xf7, - 0x9f, 0xb1, 0x4b, 0x4e, 0xee, 0x41, 0x45, 0x4e, 0x09, 0xf4, 0x85, 0x66, 0x14, 0x97, 0x52, 0x49, - 0xb4, 0xdf, 0x07, 0x43, 0x76, 0xa8, 0x05, 0x57, 0xd1, 0xae, 0xcd, 0x17, 0x9f, 0xa9, 0x33, 0x63, - 0x3f, 0x4b, 0x1e, 0xab, 0x69, 0x04, 0x97, 0xb3, 0x0f, 0x2d, 0xaf, 0xa1, 0x24, 0x93, 0x1a, 0x44, - 0x20, 0xb3, 0xdd, 0x01, 0xf3, 0xc6, 0xf9, 0x8e, 0x52, 0x80, 0x9e, 0x2b, 0xe0, 0x8a, 0x89, 0x8f, - 0xfd, 0x73, 0x80, 0x7c, 0x6a, 0xa1, 0x3c, 0x57, 0x4a, 0x11, 0x9e, 0xfb, 0x48, 0x98, 0xc6, 0xf3, - 0xdd, 0x98, 0x05, 0x73, 0xb7, 0xce, 0xe7, 0x1c, 0x19, 0x9d, 0xac, 0x42, 0x19, 0x87, 0x31, 0xa5, - 0x3c, 0x1e, 0x65, 0x93, 0x18, 0xa4, 0xd8, 0x27, 0xd0, 0x90, 0x69, 0x88, 0xb2, 0x6f, 0xa6, 0xa2, - 0xcb, 0xbf, 0x21, 0x0f, 0xae, 0x00, 0x64, 0xd1, 0x33, 0x1d, 0x2b, 0x15, 0x30, 0xc2, 0x31, 0x4e, - 0x3d, 0xe6, 0xbb, 0xe9, 0x6d, 0x14, 0x64, 0x7f, 0x02, 0xf5, 0x74, 0x0f, 0xd5, 0xdc, 0xa6, 0xc9, - 0x50, 0x6a, 0x53, 0xd6, 0xf4, 0x92, 0x65, 0x3f, 0x74, 0xb3, 0x5c, 0x68, 0xff, 0x45, 0x4f, 0x57, - 0xaa, 0x3e, 0x6f, 0xae, 0xbc, 0xd2, 0x16, 0xcb, 0xab, 0xf9, 0x52, 0x45, 0xff, 0x41, 0xa5, 0xca, - 0xa7, 0x60, 0xb9, 0x98, 0xaf, 0xbd, 0x8b, 0x34, 0xb2, 0xb5, 0x17, 0x73, 0xb3, 0xca, 0xe8, 0xde, - 0x05, 0xa3, 0x39, 0xb3, 0x38, 0x4b, 0x12, 0x9e, 0xb3, 0xc0, 0xfb, 0x16, 0x1b, 0x59, 0x71, 0xe1, - 0x1c, 0x91, 0x4f, 0x05, 0x64, 0x0e, 0x57, 0x53, 0x81, 0x74, 0xc0, 0x61, 0xe4, 0x03, 0x0e, 0xa1, - 0xb5, 0x69, 0xc4, 0x59, 0x9c, 0xa4, 0xb5, 0x9c, 0x84, 0xb2, 0x9a, 0xc8, 0x52, 0xbc, 0x4e, 0x30, - 0xb6, 0x3f, 0x03, 0x2b, 0x3b, 0x8b, 0x08, 0x29, 0xfb, 0x07, 0xfb, 0x5d, 0x19, 0x00, 0x7a, 0xfb, - 0x9d, 0xee, 0x4f, 0x9b, 0x9a, 0x08, 0x4a, 0xb4, 0x7b, 0xdc, 0xa5, 0xfd, 0x6e, 0x53, 0x17, 0xc1, - 0xa3, 0xd3, 0xdd, 0xed, 0x0e, 0xba, 0xcd, 0xd2, 0x17, 0x65, 0xb3, 0xda, 0x34, 0xa9, 0xc9, 0x66, - 0x91, 0xef, 0x8d, 0xbc, 0xc4, 0x3e, 0x02, 0x73, 0xcf, 0x89, 0x5e, 0xa8, 0xcb, 0xf3, 0x5c, 0x33, - 0x55, 0xcd, 0xbc, 0xca, 0x0b, 0xf7, 0xa1, 0xaa, 0xa2, 0x83, 0xf2, 0xa6, 0xb9, 0xc8, 0x91, 0xd2, - 0xec, 0xdf, 0x6b, 0x70, 0x7b, 0x2f, 0xbc, 0x60, 0x59, 0x42, 0x3d, 0x74, 0x2e, 0xfd, 0xd0, 0x71, - 0x5f, 0x62, 0xba, 0x07, 0x70, 0x8b, 0x87, 0xd3, 0x78, 0xc4, 0x86, 0x0b, 0x83, 0x84, 0x86, 0x44, - 0x3f, 0x55, 0x2e, 0x68, 0x43, 0xc3, 0x65, 0x3c, 0xc9, 0xb9, 0x4a, 0xc8, 0x55, 0x13, 0xc8, 0x94, - 0x27, 0xab, 0x0a, 0xca, 0x2f, 0xab, 0x0a, 0xec, 0xef, 0x35, 0x68, 0x74, 0x67, 0x51, 0x18, 0x27, - 0xe9, 0x31, 0x5f, 0x13, 0x95, 0xf5, 0x37, 0xa9, 0xf3, 0x97, 0x69, 0x25, 0x66, 0xdf, 0xf4, 0x6e, - 0x9c, 0x70, 0x6c, 0x80, 0x21, 0x84, 0x4d, 0xb9, 0x72, 0x9f, 0x96, 0xd8, 0x6f, 0x4e, 0xe8, 0x7a, - 0x1f, 0xe9, 0x54, 0xf1, 0x15, 0x2b, 0xa4, 0xf2, 0x5c, 0x85, 0xf4, 0x39, 0x18, 0x92, 0xb5, 0x60, - 0xdb, 0x1a, 0x54, 0xfb, 0x47, 0xdb, 0xdb, 0xdd, 0x7e, 0xbf, 0xa9, 0x91, 0x06, 0x58, 0x9d, 0xa3, - 0xc3, 0xdd, 0xde, 0xf6, 0xd6, 0x40, 0xd9, 0x77, 0x67, 0xab, 0xb7, 0xdb, 0xed, 0x34, 0x4b, 0xf6, - 0x36, 0x58, 0x83, 0x59, 0xa0, 0x96, 0x17, 0xb3, 0x9b, 0x76, 0x43, 0x76, 0xd3, 0x17, 0xb2, 0x5b, - 0x1f, 0x6a, 0x85, 0xca, 0x86, 0xbc, 0x03, 0xe5, 0x64, 0x16, 0xcc, 0xcf, 0x36, 0xd3, 0x3d, 0x28, - 0x92, 0xc8, 0x3b, 0x50, 0x17, 0x7d, 0x93, 0xc3, 0xb9, 0x37, 0x0e, 0x98, 0xab, 0x24, 0x8a, 0x5e, - 0x6a, 0x4b, 0xa1, 0xec, 0xbb, 0xd0, 0x10, 0x8d, 0xaa, 0x37, 0x61, 0x3c, 0x71, 0x26, 0x11, 0xe6, - 0x62, 0x15, 0x80, 0xcb, 0x54, 0x4f, 0xb8, 0xfd, 0x00, 0xea, 0x87, 0x8c, 0xc5, 0x94, 0xf1, 0x28, - 0x0c, 0x38, 0x36, 0x2d, 0x4a, 0xa3, 0x32, 0xda, 0x2b, 0xc8, 0xfe, 0x1a, 0x2c, 0x51, 0x87, 0x3e, - 0x71, 0x92, 0xd1, 0xd9, 0x8f, 0xa9, 0x53, 0x1f, 0x40, 0x35, 0x92, 0x96, 0x50, 0x95, 0x66, 0x1d, - 0x03, 0x8e, 0xb2, 0x0e, 0x4d, 0x89, 0xf6, 0xc7, 0x50, 0xda, 0x9f, 0x4e, 0x8a, 0x93, 0xfe, 0xb2, - 0xac, 0xb3, 0xe6, 0x3a, 0x34, 0x7d, 0xbe, 0x43, 0xb3, 0xbf, 0x82, 0x5a, 0x7a, 0xd5, 0x9e, 0x8b, - 0xe3, 0x7a, 0x54, 0x75, 0xcf, 0x9d, 0xd3, 0xbc, 0x6c, 0x7d, 0x58, 0xe0, 0xf6, 0x52, 0x1d, 0x49, - 0x60, 0x5e, 0xb6, 0x6a, 0xed, 0x33, 0xd9, 0x3b, 0x50, 0x4f, 0xeb, 0x47, 0x2c, 0xea, 0x84, 0xf1, - 0x7c, 0x8f, 0x05, 0x05, 0xc3, 0x9a, 0x12, 0x31, 0xe0, 0x37, 0xf8, 0xe8, 0xe6, 0x1f, 0x35, 0x28, - 0x0b, 0xd5, 0x90, 0x7b, 0x50, 0xee, 0x8e, 0xce, 0x42, 0x32, 0xa7, 0x81, 0xf6, 0x1c, 0x64, 0x2f, - 0x91, 0xf7, 0xe5, 0x50, 0x31, 0x9d, 0x95, 0x36, 0x52, 0xcd, 0xa2, 0xe6, 0x5f, 0xe0, 0x5e, 0x87, - 0xda, 0x17, 0xa1, 0x17, 0x6c, 0xcb, 0x39, 0x1b, 0x59, 0xb4, 0xc3, 0x0b, 0xfc, 0x1f, 0x80, 0xd1, - 0xe3, 0xc2, 0xe0, 0x2f, 0xb2, 0x62, 0x5b, 0x54, 0xf4, 0x05, 0x7b, 0x69, 0xf3, 0x9f, 0x3a, 0x94, - 0xbf, 0x62, 0x71, 0x48, 0xde, 0x87, 0xaa, 0x1a, 0x02, 0x90, 0x42, 0xb3, 0xdf, 0xc6, 0xf7, 0xbd, - 0x30, 0x1d, 0xc0, 0x53, 0x19, 0x2a, 0x69, 0xe4, 0x93, 0x89, 0xf6, 0x55, 0xb1, 0xc0, 0x5e, 0x5a, - 0xd3, 0x36, 0x34, 0xf2, 0x18, 0x0c, 0xe9, 0xfa, 0x0b, 0xba, 0x59, 0x2c, 0xf7, 0xed, 0xa5, 0x0d, - 0x8d, 0x3c, 0x84, 0x5a, 0xff, 0x2c, 0x9c, 0xfa, 0x6e, 0x9f, 0xc5, 0x17, 0x8c, 0x14, 0xe6, 0x61, - 0xed, 0xc2, 0xb7, 0xbd, 0x44, 0xd6, 0x00, 0xa4, 0x73, 0x1c, 0x79, 0x2e, 0x27, 0x55, 0x41, 0xdb, - 0x9f, 0x4e, 0xa4, 0xd0, 0x82, 0xd7, 0x48, 0xce, 0xc2, 0x13, 0xb9, 0x89, 0xf3, 0x23, 0x68, 0x6c, - 0xe3, 0x83, 0x3d, 0x88, 0xb7, 0x4e, 0xc2, 0x38, 0x21, 0x8b, 0x33, 0xb1, 0xf6, 0x22, 0xc2, 0x5e, - 0x22, 0x1b, 0x60, 0x0e, 0xe2, 0x4b, 0xc9, 0xff, 0x8a, 0x7a, 0xc8, 0xf9, 0x7e, 0x57, 0xdc, 0x72, - 0xf3, 0xb7, 0x25, 0x30, 0xbe, 0x0c, 0xe3, 0x73, 0x16, 0x93, 0x47, 0x60, 0x60, 0x5f, 0xa6, 0x5c, - 0x21, 0xeb, 0xd1, 0xae, 0xda, 0xe8, 0x1e, 0x58, 0xa8, 0x94, 0x81, 0xc3, 0xcf, 0xa5, 0xea, 0xf1, - 0x2f, 0x2a, 0xa9, 0x17, 0x59, 0x00, 0xd8, 0x4b, 0xe4, 0x31, 0x2c, 0xf7, 0x93, 0x98, 0x39, 0x93, - 0xac, 0xef, 0x9c, 0x6b, 0x96, 0xda, 0x55, 0xd9, 0x0f, 0xf5, 0x51, 0xdb, 0xef, 0x41, 0xb9, 0x2f, - 0xef, 0x29, 0x58, 0xf2, 0x21, 0x7e, 0x7b, 0x39, 0x45, 0x64, 0x72, 0xff, 0x0f, 0x0c, 0x99, 0xb9, - 0xe5, 0x25, 0xe7, 0x4a, 0x9b, 0x76, 0xb3, 0x88, 0x52, 0x0b, 0x6c, 0xa8, 0x1e, 0x4e, 0xe3, 0x31, - 0x1b, 0xf0, 0x05, 0xbb, 0xa7, 0x16, 0x40, 0xdd, 0x19, 0x32, 0x9e, 0x4b, 0xa1, 0x73, 0xb1, 0xbd, - 0xfd, 0x22, 0x0a, 0x5d, 0xbc, 0x49, 0xd9, 0x88, 0x79, 0x85, 0x3c, 0x48, 0xd2, 0x2b, 0x2d, 0xbe, - 0x87, 0x35, 0x8d, 0x7c, 0x06, 0x8d, 0xb9, 0x9c, 0x49, 0x30, 0x87, 0x5c, 0x95, 0x46, 0x17, 0x17, - 0x3f, 0x69, 0x7e, 0xff, 0x7c, 0x45, 0xfb, 0xf3, 0xf3, 0x15, 0xed, 0xaf, 0xcf, 0x57, 0xb4, 0xef, - 0xfe, 0xb6, 0xb2, 0x74, 0x62, 0xe0, 0x1f, 0x9b, 0x1f, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x5e, - 0x53, 0xf1, 0x39, 0xf3, 0x1c, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_76a78ed8de9876ee) } + +var fileDescriptor_pb_76a78ed8de9876ee = []byte{ + // 3124 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4b, 0x73, 0xdb, 0xd6, + 0xd5, 0x02, 0x48, 0x82, 0xc0, 0x21, 0x29, 0x33, 0x37, 0x8e, 0x43, 0x33, 0x89, 0xac, 0x20, 0x7e, + 0x28, 0x76, 0xa2, 0xcf, 0x51, 0xf2, 0x4d, 0x1e, 0x3b, 0x59, 0xa4, 0x3c, 0x8c, 0xf5, 0xea, 0x25, + 0xe5, 0xb4, 0x59, 0x84, 0x03, 0x11, 0x57, 0x12, 0x2a, 0x10, 0x40, 0x70, 0x01, 0x0d, 0x95, 0x45, + 0x67, 0xba, 0xe9, 0x6f, 0x48, 0x37, 0x5d, 0x74, 0xd9, 0xfe, 0x81, 0xf6, 0x07, 0x74, 0x26, 0xcb, + 0xae, 0x3a, 0xd3, 0x5d, 0xc7, 0x5d, 0x75, 0xdd, 0xe9, 0x74, 0xd1, 0x4d, 0xe7, 0x9e, 0x7b, 0xf1, + 0x20, 0x2d, 0xd9, 0x49, 0x3b, 0x5d, 0x11, 0xe7, 0x71, 0x5f, 0xe7, 0x7d, 0x0e, 0xc1, 0x8c, 0x8e, + 0xd6, 0xa3, 0x38, 0x4c, 0x42, 0xa2, 0x47, 0x47, 0x5d, 0xcb, 0x89, 0x3c, 0x09, 0xda, 0x5d, 0xa8, + 0xee, 0x78, 0x3c, 0x21, 0x04, 0xaa, 0xa9, 0xe7, 0xf2, 0x8e, 0xb6, 0x5a, 0x59, 0x33, 0x28, 0x7e, + 0xdb, 0xbb, 0x60, 0x8d, 0x1c, 0x7e, 0xf6, 0xd4, 0xf1, 0x53, 0x46, 0xda, 0x50, 0x39, 0x77, 0xfc, + 0x8e, 0xb6, 0xaa, 0xad, 0x35, 0xa9, 0xf8, 0x24, 0xeb, 0x60, 0x9e, 0x3b, 0xfe, 0x38, 0xb9, 0x88, + 0x58, 0x47, 0x5f, 0xd5, 0xd6, 0x96, 0x37, 0x5e, 0x5d, 0x8f, 0x8e, 0xd6, 0x0f, 0x42, 0x9e, 0x78, + 0xc1, 0xc9, 0xfa, 0x53, 0xc7, 0x1f, 0x5d, 0x44, 0x8c, 0xd6, 0xcf, 0xe5, 0x87, 0xbd, 0x0f, 0x8d, + 0x61, 0x3c, 0xd9, 0x4e, 0x83, 0x49, 0xe2, 0x85, 0x81, 0x38, 0x31, 0x70, 0xa6, 0x0c, 0x77, 0xb4, + 0x28, 0x7e, 0x0b, 0x9c, 0x13, 0x9f, 0xf0, 0x4e, 0x65, 0xb5, 0x22, 0x70, 0xe2, 0x9b, 0x74, 0xa0, + 0xee, 0xf1, 0xad, 0x30, 0x0d, 0x92, 0x4e, 0x75, 0x55, 0x5b, 0x33, 0x69, 0x06, 0xda, 0x7f, 0xd7, + 0xa1, 0xf6, 0xa3, 0x94, 0xc5, 0x17, 0xb8, 0x2e, 0x49, 0xe2, 0x6c, 0x2f, 0xf1, 0x4d, 0xae, 0x43, + 0xcd, 0x77, 0x82, 0x13, 0xde, 0xd1, 0x71, 0x33, 0x09, 0x90, 0x37, 0xc0, 0x72, 0x8e, 0x13, 0x16, + 0x8f, 0x53, 0xcf, 0xed, 0x54, 0x56, 0xb5, 0x35, 0x83, 0x9a, 0x88, 0x38, 0xf4, 0x5c, 0x72, 0x13, + 0x4c, 0x37, 0x1c, 0x4f, 0xca, 0x67, 0xb9, 0x21, 0x9e, 0x45, 0xde, 0x01, 0x33, 0xf5, 0xdc, 0xb1, + 0xef, 0xf1, 0xa4, 0x53, 0x5b, 0xd5, 0xd6, 0x1a, 0x1b, 0xa6, 0x78, 0xac, 0x90, 0x1d, 0xad, 0xa7, + 0x9e, 0x8b, 0x42, 0xbc, 0x0f, 0x26, 0x8f, 0x27, 0xe3, 0xe3, 0x34, 0x98, 0x74, 0x0c, 0x64, 0xba, + 0x26, 0x98, 0x4a, 0xaf, 0xa6, 0x75, 0x2e, 0x01, 0xf1, 0xac, 0x98, 0x9d, 0xb3, 0x98, 0xb3, 0x4e, + 0x5d, 0x1e, 0xa5, 0x40, 0xf2, 0x10, 0x1a, 0xc7, 0xce, 0x84, 0x25, 0xe3, 0xc8, 0x89, 0x9d, 0x69, + 0xc7, 0x2c, 0x36, 0xda, 0x16, 0xe8, 0x03, 0x81, 0xe5, 0x14, 0x8e, 0x73, 0x80, 0x7c, 0x08, 0x2d, + 0x84, 0xf8, 0xf8, 0xd8, 0xf3, 0x13, 0x16, 0x77, 0x2c, 0x5c, 0xb3, 0x8c, 0x6b, 0x10, 0x33, 0x8a, + 0x19, 0xa3, 0x4d, 0xc9, 0x24, 0x31, 0xe4, 0x2d, 0x00, 0x36, 0x8b, 0x9c, 0xc0, 0x1d, 0x3b, 0xbe, + 0xdf, 0x01, 0xbc, 0x83, 0x25, 0x31, 0x9b, 0xbe, 0x4f, 0x5e, 0x17, 0xf7, 0x73, 0xdc, 0x71, 0xc2, + 0x3b, 0xad, 0x55, 0x6d, 0xad, 0x4a, 0x0d, 0x01, 0x8e, 0xb8, 0xbd, 0x01, 0x16, 0x5a, 0x04, 0xbe, + 0xf8, 0x0e, 0x18, 0xe7, 0x02, 0x90, 0x86, 0xd3, 0xd8, 0x68, 0x89, 0x23, 0x73, 0xa3, 0xa1, 0x8a, + 0x68, 0xaf, 0x80, 0xb9, 0xe3, 0x04, 0x27, 0x99, 0xa5, 0x09, 0x55, 0xe0, 0x02, 0x8b, 0xe2, 0xb7, + 0xfd, 0xad, 0x0e, 0x06, 0x65, 0x3c, 0xf5, 0x13, 0x72, 0x0f, 0x40, 0x08, 0x7a, 0xea, 0x24, 0xb1, + 0x37, 0x53, 0xbb, 0x16, 0xa2, 0xb6, 0x52, 0xcf, 0xdd, 0x45, 0x12, 0x79, 0x08, 0x4d, 0xdc, 0x3d, + 0x63, 0xd5, 0x8b, 0x0b, 0xe4, 0xf7, 0xa3, 0x0d, 0x64, 0x51, 0x2b, 0x6e, 0x80, 0x81, 0xba, 0x95, + 0xf6, 0xd5, 0xa2, 0x0a, 0x22, 0x77, 0x60, 0xd9, 0x0b, 0x12, 0x21, 0xfb, 0x49, 0x32, 0x76, 0x19, + 0xcf, 0x94, 0xdf, 0xca, 0xb1, 0x3d, 0xc6, 0x13, 0xf2, 0x01, 0x48, 0x01, 0x66, 0x07, 0xd6, 0xf0, + 0xc0, 0xe5, 0x5c, 0x31, 0x5c, 0x9e, 0x88, 0x3c, 0xea, 0xc4, 0xf7, 0xa1, 0x21, 0xde, 0x97, 0xad, + 0x30, 0x70, 0x45, 0x13, 0x5f, 0xa3, 0xc4, 0x41, 0x41, 0x30, 0x28, 0x76, 0x21, 0x1a, 0x61, 0x60, + 0xd2, 0x20, 0xf0, 0xdb, 0xee, 0x43, 0x6d, 0x3f, 0x76, 0x59, 0x7c, 0xa9, 0x8d, 0x13, 0xa8, 0xba, + 0x8c, 0x4f, 0xd0, 0xfd, 0x4c, 0x8a, 0xdf, 0x85, 0xdd, 0x57, 0x4a, 0x76, 0x6f, 0xff, 0x4a, 0x83, + 0xc6, 0x30, 0x8c, 0x93, 0x5d, 0xc6, 0xb9, 0x73, 0xc2, 0xc8, 0x2d, 0xa8, 0x85, 0x62, 0x5b, 0x25, + 0x61, 0x4b, 0xdc, 0x09, 0xcf, 0xa1, 0x12, 0xbf, 0xa0, 0x07, 0xfd, 0x6a, 0x3d, 0x5c, 0x87, 0x9a, + 0xf4, 0x18, 0xe1, 0x4d, 0x35, 0x2a, 0x01, 0x21, 0xeb, 0xf0, 0xf8, 0x98, 0x33, 0x29, 0xcb, 0x1a, + 0x55, 0xd0, 0xd5, 0x66, 0xf5, 0xff, 0x00, 0xe2, 0x7e, 0x3f, 0xd0, 0x0a, 0xec, 0x53, 0x68, 0x50, + 0xe7, 0x38, 0xd9, 0x0a, 0x83, 0x84, 0xcd, 0x12, 0xb2, 0x0c, 0xba, 0xe7, 0xa2, 0x88, 0x0c, 0xaa, + 0x7b, 0xae, 0xb8, 0xdc, 0x49, 0x1c, 0xa6, 0x11, 0x4a, 0xa8, 0x45, 0x25, 0x80, 0xa2, 0x74, 0xdd, + 0x18, 0x6f, 0x2c, 0x44, 0xe9, 0xba, 0x31, 0xb9, 0x05, 0x0d, 0x1e, 0x38, 0x11, 0x3f, 0x0d, 0x13, + 0x71, 0xb9, 0x2a, 0x5e, 0x0e, 0x32, 0xd4, 0x88, 0xdb, 0x7f, 0xd0, 0xc0, 0xd8, 0x65, 0xd3, 0x23, + 0x16, 0x3f, 0x77, 0xca, 0x4d, 0x30, 0x71, 0xe3, 0xb1, 0xe7, 0xaa, 0x83, 0xea, 0x08, 0x0f, 0xdc, + 0x4b, 0x8f, 0xba, 0x01, 0x86, 0xcf, 0x1c, 0x21, 0x7c, 0x69, 0x67, 0x0a, 0x12, 0xb2, 0x71, 0xa6, + 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xb4, 0xc7, 0x1c, 0x57, 0xdc, 0xcd, 0x77, + 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x30, 0x1c, 0x9e, 0x1c, 0x22, 0x86, + 0xdc, 0x87, 0x57, 0x26, 0x7e, 0xca, 0x45, 0x5c, 0xf3, 0x82, 0xe3, 0x70, 0x1c, 0x06, 0xfe, 0x05, + 0xca, 0xd7, 0xa4, 0xd7, 0x14, 0x61, 0x10, 0x1c, 0x87, 0xfb, 0x81, 0x7f, 0x61, 0xff, 0x4b, 0x83, + 0xda, 0x63, 0x14, 0xc3, 0x43, 0xa8, 0x4f, 0xf1, 0x41, 0x99, 0xf7, 0xde, 0x10, 0x12, 0x46, 0xda, + 0xba, 0x7c, 0x29, 0xef, 0x07, 0x49, 0x7c, 0x41, 0x33, 0x36, 0xb1, 0x22, 0x71, 0x8e, 0x7c, 0x96, + 0x70, 0x65, 0x11, 0xa5, 0x15, 0x23, 0x49, 0x50, 0x2b, 0x14, 0x5b, 0x77, 0x1b, 0x9a, 0xe5, 0xad, + 0x44, 0x1a, 0x39, 0x63, 0x17, 0x28, 0xbb, 0x2a, 0x15, 0x9f, 0x64, 0x15, 0x6a, 0xe8, 0xa4, 0x28, + 0xb9, 0xc6, 0x06, 0x88, 0x1d, 0xe5, 0x12, 0x2a, 0x09, 0x9f, 0xe9, 0x9f, 0x68, 0x62, 0x9f, 0xf2, + 0x01, 0xe5, 0x7d, 0xac, 0xab, 0xf7, 0x91, 0x4b, 0x4a, 0xfb, 0xd8, 0xff, 0xd4, 0xa0, 0xf9, 0x25, + 0x8b, 0xc3, 0x83, 0x38, 0x8c, 0x42, 0xee, 0xf8, 0xc4, 0x06, 0x43, 0xbe, 0xee, 0x92, 0xf3, 0x15, + 0x45, 0xf0, 0xc8, 0xf7, 0xa0, 0x1a, 0xe7, 0xf7, 0x56, 0x14, 0xb2, 0x02, 0x30, 0x75, 0x66, 0x3b, + 0xcc, 0xe1, 0x6c, 0xe0, 0x66, 0xe6, 0x53, 0x60, 0x48, 0x17, 0xcc, 0xa9, 0x33, 0x1b, 0xcd, 0x82, + 0x11, 0x47, 0xed, 0x56, 0x69, 0x0e, 0x93, 0x37, 0xc1, 0x9a, 0x3a, 0x33, 0x61, 0xc7, 0x03, 0x57, + 0x69, 0xb7, 0x40, 0x90, 0xb7, 0xa1, 0x92, 0xcc, 0x02, 0x0c, 0x0a, 0x22, 0x0f, 0x88, 0xdc, 0x3d, + 0x9a, 0x05, 0xca, 0xe2, 0xa9, 0xa0, 0x65, 0xd2, 0x30, 0x0b, 0x69, 0xb4, 0xa1, 0x32, 0xf1, 0x5c, + 0x4c, 0x04, 0x16, 0x15, 0x9f, 0xf6, 0xef, 0x2a, 0x70, 0x4d, 0xa9, 0xe2, 0xd4, 0x8b, 0x86, 0x89, + 0xb0, 0x9b, 0x0e, 0xd4, 0xd1, 0x5d, 0x59, 0xac, 0x34, 0x92, 0x81, 0xe4, 0x63, 0x30, 0xd0, 0x84, + 0x33, 0x45, 0xdf, 0x2a, 0xc4, 0x92, 0x2f, 0x97, 0x8a, 0x57, 0x1a, 0x57, 0xec, 0xe4, 0x23, 0xa8, + 0x7d, 0xc3, 0xe2, 0x50, 0x86, 0x9f, 0xc6, 0xc6, 0xca, 0x65, 0xeb, 0x84, 0x02, 0xd4, 0x32, 0xc9, + 0xfc, 0x3f, 0x94, 0xde, 0x6d, 0x11, 0x70, 0xa6, 0xe1, 0x39, 0x73, 0x3b, 0x75, 0xbc, 0x51, 0x59, + 0xc1, 0x19, 0x29, 0x13, 0x97, 0x99, 0x8b, 0xab, 0xdb, 0x83, 0x46, 0xe9, 0x79, 0x65, 0x7b, 0x6b, + 0x49, 0x09, 0xdf, 0x9a, 0xb7, 0x37, 0x2b, 0xf7, 0x84, 0xb2, 0xd9, 0xf6, 0x00, 0x8a, 0xc7, 0xfe, + 0xa7, 0xc6, 0x6f, 0xff, 0x5c, 0x83, 0x6b, 0x5b, 0x61, 0x10, 0x30, 0xac, 0x21, 0xa4, 0xea, 0x0a, + 0xbb, 0xd5, 0xae, 0xb4, 0xdb, 0x77, 0xa1, 0xc6, 0x05, 0xb3, 0xda, 0xfd, 0xd5, 0x4b, 0x74, 0x41, + 0x25, 0x87, 0x08, 0x31, 0x53, 0x67, 0x36, 0x8e, 0x58, 0xe0, 0x7a, 0xc1, 0x09, 0xda, 0xb9, 0xd4, + 0xc0, 0x81, 0xc4, 0xd8, 0xbf, 0xd6, 0xc0, 0x90, 0x26, 0x3f, 0x17, 0xee, 0xb4, 0xf9, 0x70, 0xf7, + 0x26, 0x58, 0x51, 0xcc, 0x5c, 0x6f, 0x92, 0x9d, 0x6a, 0xd1, 0x02, 0x21, 0xa2, 0xf1, 0x71, 0x18, + 0x4f, 0x18, 0x6e, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, 0x4d, + 0x81, 0x10, 0xd1, 0x4a, 0x2c, 0xe1, 0x91, 0x33, 0x91, 0x45, 0x52, 0x85, 0x4a, 0x40, 0x44, 0x50, + 0xa9, 0x39, 0xd4, 0x98, 0x49, 0x15, 0x64, 0xff, 0x46, 0x87, 0x66, 0xcf, 0x8b, 0xd9, 0x24, 0x61, + 0x6e, 0xdf, 0x3d, 0x41, 0x46, 0x16, 0x24, 0x5e, 0x72, 0xa1, 0xa2, 0xb5, 0x82, 0xf2, 0x64, 0xaa, + 0xcf, 0x17, 0x8c, 0x52, 0x17, 0x15, 0xac, 0x71, 0x25, 0x40, 0x36, 0x00, 0x64, 0x99, 0x81, 0x75, + 0x6e, 0xf5, 0xea, 0x3a, 0xd7, 0x42, 0x36, 0xf1, 0x29, 0x04, 0x24, 0xd7, 0x78, 0x32, 0x92, 0x1b, + 0x58, 0x04, 0xa7, 0xc2, 0x90, 0x31, 0x3b, 0x1f, 0x31, 0x1f, 0x0d, 0x15, 0xb3, 0xf3, 0x11, 0xf3, + 0xf3, 0x9a, 0xa8, 0x2e, 0xaf, 0x23, 0xbe, 0xc9, 0x3b, 0xa0, 0x87, 0x11, 0xbe, 0x4f, 0x1d, 0x58, + 0x7e, 0xd8, 0xfa, 0x7e, 0x44, 0xf5, 0x30, 0x12, 0x56, 0x20, 0x8b, 0xba, 0x8e, 0xa5, 0x8c, 0x5b, + 0x84, 0x07, 0x2c, 0x47, 0xa8, 0xa2, 0xd8, 0x37, 0x40, 0xdf, 0x8f, 0x48, 0x1d, 0x2a, 0xc3, 0xfe, + 0xa8, 0xbd, 0x24, 0x3e, 0x7a, 0xfd, 0x9d, 0xb6, 0x66, 0x3f, 0xd3, 0xc0, 0xda, 0x4d, 0x13, 0x47, + 0xd8, 0x14, 0x7f, 0x91, 0x52, 0x6f, 0x82, 0xc9, 0x13, 0x27, 0xc6, 0xbc, 0xa8, 0xcb, 0x30, 0x81, + 0xf0, 0x88, 0x93, 0xbb, 0x50, 0x63, 0xee, 0x09, 0xcb, 0xbc, 0xbd, 0xbd, 0x78, 0x4f, 0x2a, 0xc9, + 0x64, 0x0d, 0x0c, 0x3e, 0x39, 0x65, 0x53, 0xa7, 0x53, 0x2d, 0x18, 0x87, 0x88, 0x91, 0x29, 0x8c, + 0x2a, 0x3a, 0xd6, 0xe0, 0x71, 0x18, 0x61, 0x51, 0x5a, 0x53, 0x35, 0x78, 0x1c, 0x46, 0xa2, 0x24, + 0xdd, 0x80, 0xd7, 0xbc, 0x93, 0x20, 0x8c, 0xd9, 0xd8, 0x0b, 0x5c, 0x36, 0x1b, 0x4f, 0xc2, 0xe0, + 0xd8, 0xf7, 0x26, 0x09, 0xca, 0xd2, 0xa4, 0xaf, 0x4a, 0xe2, 0x40, 0xd0, 0xb6, 0x14, 0xc9, 0x7e, + 0x07, 0xac, 0x27, 0xec, 0x02, 0x0b, 0x42, 0x4e, 0x6e, 0x80, 0x7e, 0x76, 0xae, 0x72, 0x9d, 0x21, + 0x6e, 0xf0, 0xe4, 0x29, 0xd5, 0xcf, 0xce, 0x6d, 0x17, 0xcc, 0xa1, 0x4a, 0xf4, 0xe4, 0x5d, 0x11, + 0x12, 0x31, 0xb4, 0x2a, 0xc7, 0xc2, 0xca, 0xbb, 0x54, 0x63, 0xd0, 0x8c, 0x2e, 0x74, 0x89, 0x17, + 0x51, 0x42, 0x91, 0x40, 0xb9, 0xc2, 0xa9, 0xcc, 0x55, 0x38, 0xbf, 0xd0, 0xc1, 0xcc, 0xd3, 0xce, + 0x03, 0xb0, 0xa6, 0x99, 0xec, 0x95, 0x7b, 0x62, 0xe9, 0x9a, 0x2b, 0x84, 0x16, 0x74, 0x75, 0xef, + 0xea, 0xe2, 0xbd, 0x0b, 0xff, 0xae, 0xbd, 0xd4, 0xbf, 0xef, 0xc1, 0xb5, 0x89, 0xcf, 0x9c, 0x60, + 0x5c, 0xb8, 0xa7, 0xb4, 0xc0, 0x65, 0x44, 0x1f, 0xe4, 0x3e, 0xaa, 0x62, 0x54, 0xbd, 0x48, 0x25, + 0x77, 0xa0, 0xe6, 0x32, 0x3f, 0x71, 0xca, 0x9d, 0xc8, 0x7e, 0xec, 0x4c, 0x7c, 0xd6, 0x13, 0x68, + 0x2a, 0xa9, 0x64, 0x0d, 0xcc, 0xac, 0x5a, 0x52, 0xfd, 0x07, 0x16, 0xba, 0x99, 0x60, 0x69, 0x4e, + 0xb5, 0xdf, 0x82, 0xca, 0x93, 0xa7, 0xc3, 0x2b, 0xb5, 0xf1, 0x15, 0xe8, 0x4f, 0x9e, 0x96, 0x63, + 0x65, 0x33, 0x4f, 0x69, 0xa2, 0x03, 0xd5, 0x8b, 0x0e, 0xb4, 0x0b, 0x66, 0xca, 0x59, 0xbc, 0xcb, + 0x12, 0x47, 0x39, 0x6d, 0x0e, 0x8b, 0xd4, 0x26, 0xda, 0x29, 0x2f, 0x0c, 0x54, 0x3a, 0xc9, 0x40, + 0xfb, 0x6f, 0x15, 0xa8, 0x2b, 0xe7, 0x15, 0x7b, 0xa6, 0x79, 0x29, 0x27, 0x3e, 0x8b, 0x28, 0xa0, + 0x97, 0xa3, 0x40, 0xb9, 0xd7, 0xad, 0xbc, 0xbc, 0xd7, 0x25, 0x9f, 0x41, 0x33, 0x92, 0xb4, 0x72, + 0xdc, 0x78, 0xbd, 0xbc, 0x46, 0xfd, 0xe2, 0xba, 0x46, 0x54, 0x00, 0xc2, 0x03, 0xb0, 0x69, 0x48, + 0x9c, 0x13, 0x54, 0x6c, 0x93, 0xd6, 0x05, 0x3c, 0x72, 0x4e, 0xae, 0x88, 0x1e, 0xdf, 0x23, 0x08, + 0x88, 0x92, 0x35, 0x8c, 0x3a, 0x4d, 0x74, 0x6c, 0x11, 0x38, 0xca, 0x3e, 0xdd, 0x9a, 0xf7, 0xe9, + 0x37, 0xc0, 0x9a, 0x84, 0xd3, 0xa9, 0x87, 0xb4, 0x65, 0x99, 0x6c, 0x25, 0x62, 0xc4, 0xed, 0x6f, + 0xa0, 0xae, 0x1e, 0x4b, 0x1a, 0x50, 0xef, 0xf5, 0xb7, 0x37, 0x0f, 0x77, 0x44, 0x54, 0x01, 0x30, + 0x1e, 0x0d, 0xf6, 0x36, 0xe9, 0x4f, 0xda, 0x9a, 0x88, 0x30, 0x83, 0xbd, 0x51, 0x5b, 0x27, 0x16, + 0xd4, 0xb6, 0x77, 0xf6, 0x37, 0x47, 0xed, 0x0a, 0x31, 0xa1, 0xfa, 0x68, 0x7f, 0x7f, 0xa7, 0x5d, + 0x25, 0x4d, 0x30, 0x7b, 0x9b, 0xa3, 0xfe, 0x68, 0xb0, 0xdb, 0x6f, 0xd7, 0x04, 0xef, 0xe3, 0xfe, + 0x7e, 0xdb, 0x10, 0x1f, 0x87, 0x83, 0x5e, 0xbb, 0x2e, 0xe8, 0x07, 0x9b, 0xc3, 0xe1, 0x17, 0xfb, + 0xb4, 0xd7, 0x36, 0xc5, 0xbe, 0xc3, 0x11, 0x1d, 0xec, 0x3d, 0x6e, 0x5b, 0xf6, 0x07, 0xd0, 0x28, + 0x09, 0x4d, 0xac, 0xa0, 0xfd, 0xed, 0xf6, 0x92, 0x38, 0xe6, 0xe9, 0xe6, 0xce, 0x61, 0xbf, 0xad, + 0x91, 0x65, 0x00, 0xfc, 0x1c, 0xef, 0x6c, 0xee, 0x3d, 0x6e, 0xeb, 0xf6, 0xcf, 0xf2, 0x25, 0xd8, + 0x7b, 0xde, 0x03, 0x53, 0x49, 0x3a, 0x2b, 0x79, 0x1b, 0x25, 0x95, 0xd0, 0x9c, 0x28, 0x2c, 0x6b, + 0x72, 0xca, 0x26, 0x67, 0x3c, 0x9d, 0x2a, 0x43, 0xc8, 0x61, 0xd9, 0x46, 0x0a, 0x71, 0x64, 0xfe, + 0x2d, 0xa1, 0x7c, 0x84, 0x52, 0x45, 0x7e, 0x39, 0x42, 0xf9, 0x08, 0xa0, 0x68, 0xda, 0x2f, 0x29, + 0x5a, 0xaf, 0x43, 0xcd, 0xf1, 0x3d, 0x87, 0xab, 0x44, 0x24, 0x01, 0x7b, 0x0f, 0x1a, 0xa5, 0x56, + 0x5f, 0xe8, 0xca, 0xf1, 0xfd, 0xf1, 0x19, 0xbb, 0xe0, 0xb8, 0xd6, 0xa4, 0x75, 0xc7, 0xf7, 0x9f, + 0xb0, 0x0b, 0x4e, 0x6e, 0x43, 0x4d, 0x4e, 0x09, 0xf4, 0x85, 0x66, 0x14, 0x97, 0x52, 0x49, 0xb4, + 0xdf, 0x03, 0x43, 0x76, 0xa8, 0x25, 0x53, 0xd1, 0xae, 0xcc, 0x17, 0x9f, 0xaa, 0x3b, 0x63, 0x3f, + 0x4b, 0x1e, 0xa8, 0x69, 0x04, 0x97, 0xb3, 0x0f, 0xad, 0xa8, 0xa1, 0x24, 0x93, 0x1a, 0x44, 0x20, + 0xb3, 0xdd, 0x03, 0xf3, 0x85, 0xf3, 0x1d, 0x25, 0x00, 0xbd, 0x10, 0xc0, 0x25, 0x13, 0x1f, 0xfb, + 0xa7, 0x00, 0xc5, 0xd4, 0x42, 0x59, 0xae, 0xdc, 0x45, 0x58, 0xee, 0x7d, 0xa1, 0x1a, 0xcf, 0x77, + 0x63, 0x16, 0xcc, 0xbd, 0xba, 0x98, 0x73, 0xe4, 0x74, 0xb2, 0x0a, 0x55, 0x1c, 0xc6, 0x54, 0x8a, + 0x78, 0x94, 0x4f, 0x62, 0x90, 0x62, 0x1f, 0x41, 0x4b, 0xa6, 0x21, 0xca, 0xbe, 0x4e, 0x45, 0x97, + 0xff, 0x82, 0x3c, 0xb8, 0x02, 0x90, 0x47, 0xcf, 0x6c, 0xac, 0x54, 0xc2, 0x08, 0xc3, 0x38, 0xf6, + 0x98, 0xef, 0x66, 0xaf, 0x51, 0x90, 0xfd, 0x31, 0x34, 0xb3, 0x33, 0x54, 0x73, 0x9b, 0x25, 0x43, + 0x29, 0x4d, 0x59, 0xd3, 0x4b, 0x96, 0xbd, 0xd0, 0xcd, 0x73, 0xa1, 0xfd, 0x67, 0x3d, 0x5b, 0xa9, + 0xfa, 0xbc, 0xb9, 0xf2, 0x4a, 0x5b, 0x2c, 0xaf, 0xe6, 0x4b, 0x15, 0xfd, 0x7b, 0x95, 0x2a, 0x9f, + 0x80, 0xe5, 0x62, 0xbe, 0xf6, 0xce, 0xb3, 0xc8, 0xd6, 0x5d, 0xcc, 0xcd, 0x2a, 0xa3, 0x7b, 0xe7, + 0x8c, 0x16, 0xcc, 0xe2, 0x2e, 0x49, 0x78, 0xc6, 0x02, 0xef, 0x1b, 0x6c, 0x64, 0xc5, 0x83, 0x0b, + 0x44, 0x31, 0x15, 0x90, 0x39, 0x5c, 0x4d, 0x05, 0xb2, 0x01, 0x87, 0x51, 0x0c, 0x38, 0x84, 0xd4, + 0xd2, 0x88, 0xb3, 0x38, 0xc9, 0x6a, 0x39, 0x09, 0xe5, 0x35, 0x91, 0xa5, 0x78, 0x9d, 0xe0, 0xc4, + 0xfe, 0x14, 0xac, 0xfc, 0x2e, 0x22, 0xa4, 0xec, 0xed, 0xef, 0xf5, 0x65, 0x00, 0x18, 0xec, 0xf5, + 0xfa, 0x3f, 0x6e, 0x6b, 0x22, 0x28, 0xd1, 0xfe, 0xd3, 0x3e, 0x1d, 0xf6, 0xdb, 0xba, 0x08, 0x1e, + 0xbd, 0xfe, 0x4e, 0x7f, 0xd4, 0x6f, 0x57, 0x3e, 0xaf, 0x9a, 0xf5, 0xb6, 0x49, 0x4d, 0x36, 0x8b, + 0x7c, 0x6f, 0xe2, 0x25, 0xf6, 0x21, 0x98, 0xbb, 0x4e, 0xf4, 0x5c, 0x5d, 0x5e, 0xe4, 0x9a, 0x54, + 0x35, 0xf3, 0x2a, 0x2f, 0xdc, 0x81, 0xba, 0x8a, 0x0e, 0xca, 0x9a, 0xe6, 0x22, 0x47, 0x46, 0xb3, + 0x7f, 0xab, 0xc1, 0xf5, 0xdd, 0xf0, 0x9c, 0xe5, 0x09, 0xf5, 0xc0, 0xb9, 0xf0, 0x43, 0xc7, 0x7d, + 0x89, 0xea, 0xee, 0xc2, 0x35, 0x1e, 0xa6, 0xf1, 0x84, 0x8d, 0x17, 0x06, 0x09, 0x2d, 0x89, 0x7e, + 0xac, 0x4c, 0xd0, 0x86, 0x96, 0xcb, 0x78, 0x52, 0x70, 0x55, 0x90, 0xab, 0x21, 0x90, 0x19, 0x4f, + 0x5e, 0x15, 0x54, 0x5f, 0x56, 0x15, 0xd8, 0xdf, 0x69, 0xd0, 0xea, 0xcf, 0xa2, 0x30, 0x4e, 0xb2, + 0x6b, 0xbe, 0x26, 0x2a, 0xeb, 0xaf, 0x33, 0xe3, 0xaf, 0xd2, 0x5a, 0xcc, 0xbe, 0x1e, 0xbc, 0x70, + 0xc2, 0xf1, 0x10, 0x0c, 0xb1, 0x59, 0xca, 0x95, 0xf9, 0x74, 0xc4, 0x79, 0x73, 0x9b, 0xae, 0x0f, + 0x91, 0x4e, 0x15, 0x5f, 0xb9, 0x42, 0xaa, 0xce, 0x55, 0x48, 0x9f, 0x81, 0x21, 0x59, 0x4b, 0xba, + 0x6d, 0x40, 0x7d, 0x78, 0xb8, 0xb5, 0xd5, 0x1f, 0x0e, 0xdb, 0x1a, 0x69, 0x81, 0xd5, 0x3b, 0x3c, + 0xd8, 0x19, 0x6c, 0x6d, 0x8e, 0x94, 0x7e, 0xb7, 0x37, 0x07, 0x3b, 0xfd, 0x5e, 0xbb, 0x62, 0x6f, + 0x81, 0x35, 0x9a, 0x05, 0x6a, 0x79, 0x39, 0xbb, 0x69, 0x2f, 0xc8, 0x6e, 0xfa, 0x42, 0x76, 0x1b, + 0x42, 0xa3, 0x54, 0xd9, 0x90, 0xb7, 0xa1, 0x9a, 0xcc, 0x82, 0xf9, 0xd9, 0x66, 0x76, 0x06, 0x45, + 0x12, 0x79, 0x1b, 0x9a, 0xa2, 0x6f, 0x72, 0x38, 0xf7, 0x4e, 0x02, 0xe6, 0xaa, 0x1d, 0x45, 0x2f, + 0xb5, 0xa9, 0x50, 0xf6, 0x2d, 0x68, 0x89, 0x46, 0xd5, 0x9b, 0x32, 0x9e, 0x38, 0xd3, 0x08, 0x73, + 0xb1, 0x0a, 0xc0, 0x55, 0xaa, 0x27, 0xdc, 0xbe, 0x0b, 0xcd, 0x03, 0xc6, 0x62, 0xca, 0x78, 0x14, + 0x06, 0x1c, 0x9b, 0x16, 0x25, 0x51, 0x19, 0xed, 0x15, 0x64, 0x7f, 0x05, 0x96, 0xa8, 0x43, 0x1f, + 0x39, 0xc9, 0xe4, 0xf4, 0x87, 0xd4, 0xa9, 0x77, 0xa1, 0x1e, 0x49, 0x4d, 0xa8, 0x4a, 0xb3, 0x89, + 0x01, 0x47, 0x69, 0x87, 0x66, 0x44, 0xfb, 0x23, 0xa8, 0xec, 0xa5, 0xd3, 0xf2, 0xa4, 0xbf, 0x2a, + 0xeb, 0xac, 0xb9, 0x0e, 0x4d, 0x9f, 0xef, 0xd0, 0xec, 0x2f, 0xa1, 0x91, 0x3d, 0x75, 0xe0, 0xe2, + 0xb8, 0x1e, 0x45, 0x3d, 0x70, 0xe7, 0x24, 0x2f, 0x5b, 0x1f, 0x16, 0xb8, 0x83, 0x4c, 0x46, 0x12, + 0x98, 0xdf, 0x5b, 0xb5, 0xf6, 0xf9, 0xde, 0xdb, 0xd0, 0xcc, 0xea, 0x47, 0x2c, 0xea, 0x84, 0xf2, + 0x7c, 0x8f, 0x05, 0x25, 0xc5, 0x9a, 0x12, 0x31, 0xe2, 0x2f, 0xb0, 0x51, 0x7b, 0x1b, 0x5a, 0x8f, + 0x9c, 0xc9, 0x59, 0x1a, 0x95, 0xa2, 0xfc, 0x55, 0x06, 0xd2, 0x05, 0x93, 0x05, 0x6e, 0x14, 0x7a, + 0x41, 0xa2, 0x12, 0x55, 0x0e, 0xdb, 0xbf, 0xd4, 0x60, 0x39, 0xdb, 0x48, 0x29, 0xab, 0x03, 0xf5, + 0xa9, 0x9c, 0xa9, 0x2a, 0xaf, 0xce, 0x40, 0xf2, 0x41, 0xae, 0x46, 0x19, 0x8a, 0x6f, 0x0a, 0x05, + 0xcd, 0xaf, 0x5e, 0xf0, 0x8c, 0xff, 0xc6, 0x01, 0x36, 0x7e, 0xaf, 0x41, 0x55, 0xa8, 0x9f, 0xdc, + 0x86, 0x6a, 0x7f, 0x72, 0x1a, 0x92, 0x39, 0x2d, 0x77, 0xe7, 0x20, 0x7b, 0x89, 0xbc, 0x27, 0x07, + 0xa7, 0xd9, 0x3c, 0xb8, 0x95, 0x59, 0x0f, 0x5a, 0xd7, 0x73, 0xdc, 0xeb, 0xd0, 0xf8, 0x3c, 0xf4, + 0x82, 0x2d, 0x39, 0x4b, 0x24, 0x8b, 0xb6, 0xf6, 0x1c, 0xff, 0xfb, 0x60, 0x0c, 0xb8, 0x30, 0xea, + 0xe7, 0x59, 0xb1, 0xf5, 0x2b, 0xdb, 0xbb, 0xbd, 0xb4, 0xf1, 0x0f, 0x1d, 0xaa, 0x5f, 0xb2, 0x38, + 0x24, 0xef, 0x41, 0x5d, 0x0d, 0x3a, 0x48, 0x69, 0xa0, 0xd1, 0xc5, 0x18, 0xb6, 0x30, 0x01, 0xc1, + 0x5b, 0x19, 0x2a, 0x31, 0x16, 0xd3, 0x97, 0xee, 0x65, 0xf1, 0xce, 0x5e, 0x5a, 0xd3, 0x1e, 0x6a, + 0xe4, 0x01, 0x18, 0xd2, 0xbd, 0x17, 0x64, 0xb3, 0xd8, 0xd2, 0xd8, 0x4b, 0x0f, 0x35, 0x72, 0x0f, + 0x1a, 0xc3, 0xd3, 0x30, 0xf5, 0xdd, 0x21, 0x8b, 0xcf, 0x19, 0x29, 0xcd, 0xfc, 0xba, 0xa5, 0x6f, + 0x7b, 0x89, 0xac, 0x01, 0x48, 0x07, 0x38, 0xf4, 0x5c, 0x4e, 0xea, 0x82, 0xb6, 0x97, 0x4e, 0xe5, + 0xa6, 0x25, 0xcf, 0x90, 0x9c, 0xa5, 0x30, 0xf0, 0x22, 0xce, 0x0f, 0xa1, 0xb5, 0x85, 0x41, 0x69, + 0x3f, 0xde, 0x3c, 0x0a, 0xe3, 0x84, 0x2c, 0xce, 0xfd, 0xba, 0x8b, 0x08, 0x7b, 0x89, 0x3c, 0x04, + 0x73, 0x14, 0x5f, 0x48, 0xfe, 0x57, 0x54, 0xb0, 0x2a, 0xce, 0xbb, 0xe4, 0x95, 0x1b, 0x7f, 0xaa, + 0x80, 0xf1, 0x45, 0x18, 0x9f, 0xb1, 0x98, 0xdc, 0x07, 0x03, 0x7b, 0x4f, 0x65, 0x0a, 0x79, 0x1f, + 0x7a, 0xd9, 0x41, 0xb7, 0xc1, 0x42, 0xa1, 0x8c, 0x1c, 0x7e, 0x26, 0x45, 0x8f, 0x7f, 0xc3, 0x49, + 0xb9, 0xc8, 0x22, 0xc7, 0x5e, 0x22, 0x0f, 0x60, 0x79, 0x98, 0xc4, 0xcc, 0x99, 0xe6, 0xbd, 0xf5, + 0x5c, 0x43, 0xd8, 0xad, 0xcb, 0x9e, 0x6f, 0x88, 0xd2, 0x7e, 0x17, 0xaa, 0x43, 0xf9, 0x4e, 0xc1, + 0x52, 0xfc, 0x51, 0xd1, 0x5d, 0xce, 0x10, 0xf9, 0xbe, 0xff, 0x07, 0x86, 0xac, 0x4e, 0xe4, 0x23, + 0xe7, 0xca, 0xb7, 0x6e, 0xbb, 0x8c, 0x52, 0x0b, 0x6c, 0xa8, 0x1f, 0xa4, 0xf1, 0x09, 0x1b, 0xf1, + 0x05, 0xbd, 0x67, 0x1a, 0xb0, 0x97, 0x84, 0xb3, 0x4a, 0xd7, 0x94, 0x9b, 0xce, 0x45, 0x8b, 0x2e, + 0x79, 0xde, 0x73, 0x51, 0xdc, 0x86, 0x4c, 0x73, 0x72, 0xc9, 0x5c, 0xca, 0xeb, 0x3e, 0x8f, 0x42, + 0xaf, 0x68, 0x53, 0x36, 0x61, 0x5e, 0xa9, 0x3c, 0x20, 0x99, 0x14, 0x16, 0x5d, 0x68, 0x4d, 0x23, + 0x9f, 0x42, 0x6b, 0xae, 0x94, 0x20, 0x98, 0x5a, 0x2f, 0xab, 0x2e, 0x16, 0x17, 0x3f, 0x6a, 0x7f, + 0xf7, 0x6c, 0x45, 0xfb, 0xe3, 0xb3, 0x15, 0xed, 0x2f, 0xcf, 0x56, 0xb4, 0x6f, 0xff, 0xba, 0xb2, + 0x74, 0x64, 0xe0, 0xff, 0xbd, 0x1f, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xac, 0x46, 0x42, + 0x0a, 0x1e, 0x00, 0x00, } diff --git a/worker/worker.go b/worker/worker.go index cb6628e4326..adf9986e64a 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -27,10 +27,11 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/conn" + "github.com/dgraph-io/dgraph/dgraphee/backup" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" - + "golang.org/x/net/context" "google.golang.org/grpc" ) @@ -117,3 +118,20 @@ func BlockingStop() { // TODO: What is this for? posting.StopLRUEviction() } + +// Backup ... +func (s *Server) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { + if req.StartTs == 0 { + req.StartTs = State.getTimestamp(true) + } + // resp.Txn = &api.TxnContext{ + // StartTs: req.StartTs, + // } + backupRequest = &backup.Request{ + ReadTs: req.StartTs, + } + if err := backupRequest.Process(ctx); err != nil { + return nil, err + } + return &pb.BackupResponse{}, nil +} From 7eb21724818a2a8d87189949a963f2443f55d433 Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 17 Oct 2018 14:32:42 -0700 Subject: [PATCH 04/25] added backup dir --- dgraphee/backup/backup.go | 121 ++++++++++++++++++++++++++++++++ dgraphee/backup/file_handler.go | 68 ++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 dgraphee/backup/backup.go create mode 100644 dgraphee/backup/file_handler.go diff --git a/dgraphee/backup/backup.go b/dgraphee/backup/backup.go new file mode 100644 index 00000000000..04aeb1ed006 --- /dev/null +++ b/dgraphee/backup/backup.go @@ -0,0 +1,121 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "context" + "hash/crc32" + "io" + "sync" + + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" +) + +type Request struct { + ReadTs uint64 +} + +func (r *Request) Process(ctx context.Context) error { + var wg sync.WaitGroup + ckvs, cerr := make(chan *pb.KVS, 100), make(chan error, 1) + wg.Add(1) + go processKVS(&wg, stream, ckvs, cerr) + + for _, group := range s.KnownGroups() { + pl := s.Leader(group) + if pl == nil { + x.Printf("Backup: No healthy connection found to leader of group %d\n", group) + continue + } + + x.Printf("Backup: Requesting snapshot: group %d\n", group) + ctx, worker := s.Node.ctx, pb.NewWorkerClient(pl.Get()) + kvs, err := worker.StreamSnapshot(ctx, &pb.Snapshot{}) + if err != nil { + return err + } + + count := 0 + for kvs := range fetchKVS(kvs, cerr) { + select { + case ckvs <- kvs: + count += len(kvs.Kv) + case <-ctx.Done(): + close(ckvs) + return ctx.Err() + case err := <-cerr: + x.Println("Failure:", err) + close(ckvs) + return err + } + } + x.Printf("Backup: Group %d sent %d keys.\n", group, count) + } + + close(ckvs) + wg.Wait() + + // check for any errors from processKVS + if err := <-cerr; err != nil { + x.Println("Error:", err) + return err + } + + return nil +} + +// fetchKVS gets streamed snapshot from worker. +func fetchKVS(stream pb.Worker_StreamSnapshotClient, cerr chan error) chan *pb.KVS { + out := make(chan *pb.KVS) + go func() { + for { + kvs, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + cerr <- err + break + } + out <- kvs + } + close(out) + }() + return out +} + +// processKVS unrolls the KVS list values and streams them back to the client. +// Postprocessing should happen at the client side. +func processKVS(wg *sync.WaitGroup, stream pb.Zero_BackupServer, in chan *pb.KVS, + cerr chan error) { + defer wg.Done() + + h := crc32.NewIEEE() + for kvs := range in { + for _, kv := range kvs.Kv { + if kv.Version == 0 { + continue + } + b, err := kv.Marshal() + if err != nil { + cerr <- err + return + } + + resp := &pb.BackupResponse{ + Data: b, + Length: uint64(len(b)), + Checksum: h.Sum(b), + } + if err := stream.Send(resp); err != nil { + cerr <- err + return + } + } + } + cerr <- nil +} diff --git a/dgraphee/backup/file_handler.go b/dgraphee/backup/file_handler.go new file mode 100644 index 00000000000..1b9d9563ede --- /dev/null +++ b/dgraphee/backup/file_handler.go @@ -0,0 +1,68 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "io" + "os" + "path/filepath" + + "github.com/dgraph-io/dgraph/x" +) + +const dgraphBackupFullPrefix = "full-" +const dgraphBackupPartialPrefix = "part-" +const dgraphBackupSuffix = ".dgraph-backup" + +type fileHandler struct { + path string +} + +func (h *fileHandler) Session(_, path string) error { + h.path = path + return os.Chdir(h.path) +} + +func (h *fileHandler) List() ([]string, error) { + return filepath.Glob(filepath.Join(h.path, "*"+dgraphBackupSuffix)) +} + +func (h *fileHandler) Copy(in, out string) error { + if filepath.Base(out) == out { + out = filepath.Join(h.path, out) + } + + if h.Exists(out) { + return x.Errorf("file already exists: %q", out) + } + + src, err := os.Open(in) + if err != nil { + return err + } + defer src.Close() + + dst, err := os.Create(out) + if err != nil { + return err + } + defer dst.Close() + + if _, err = io.Copy(dst, src); err != nil { + return err + } + + return dst.Sync() +} + +func (h *fileHandler) Exists(path string) bool { + _, err := os.Stat(path) + return os.IsExist(err) +} + +func init() { + handlers["file"] = &fileHandler{} +} From cd1b88d41f1510d580167cf9c60f1cb78af351ed Mon Sep 17 00:00:00 2001 From: srfrog Date: Thu, 25 Oct 2018 09:44:39 -0700 Subject: [PATCH 05/25] renamed dgraphee tree to ee. moved orchestrate to its own pkg within worker. adding backup to worker and alpha. --- dgraph/cmd/alpha/admin.go | 14 ++ dgraph/cmd/alpha/run.go | 1 + dgraphee/backup/backup.go | 121 ---------------- dgraphee/cmd/backup/backup.go | 69 ---------- dgraphee/cmd/backup/handler.go | 46 ------- dgraphee/cmd/backup/run.go | 130 ------------------ {dgraphee => ee}/README.md | 0 ee/backup/backup.go | 62 +++++++++ {dgraphee => ee}/backup/file_handler.go | 4 - worker/backup.go | 59 ++++++++ worker/draft.go | 9 +- worker/groups.go | 1 - worker/predicate.go | 13 +- worker/predicate_move.go | 13 +- worker/stream/doc.go | 19 +++ worker/{stream_lists.go => stream/stream.go} | 48 ++++--- .../stream_test.go} | 20 +-- worker/worker.go | 19 --- 18 files changed, 211 insertions(+), 437 deletions(-) delete mode 100644 dgraphee/backup/backup.go delete mode 100644 dgraphee/cmd/backup/backup.go delete mode 100644 dgraphee/cmd/backup/handler.go delete mode 100644 dgraphee/cmd/backup/run.go rename {dgraphee => ee}/README.md (100%) create mode 100644 ee/backup/backup.go rename {dgraphee => ee}/backup/file_handler.go (95%) create mode 100644 worker/backup.go create mode 100644 worker/stream/doc.go rename worker/{stream_lists.go => stream/stream.go} (83%) rename worker/{stream_lists_test.go => stream/stream_test.go} (89%) diff --git a/dgraph/cmd/alpha/admin.go b/dgraph/cmd/alpha/admin.go index 27e94a8fc85..c8d703397ee 100644 --- a/dgraph/cmd/alpha/admin.go +++ b/dgraph/cmd/alpha/admin.go @@ -70,6 +70,20 @@ func exportHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte(`{"code": "Success", "message": "Export completed."}`)) } +func backupHandler(w http.ResponseWriter, r *http.Request) { + if !handlerInit(w, r) { + return + } + err := worker.BackupOverNetwork(context.Background()) + if err != nil { + x.SetStatus(w, err.Error(), "Backup failed.") + return + } + w.Header().Set("Content-Type", "application/json") + w.Write([]byte(`{"code": "Success", "message": "Backup completed."}`)) + +} + func memoryLimitHandler(w http.ResponseWriter, r *http.Request) { switch r.Method { case http.MethodGet: diff --git a/dgraph/cmd/alpha/run.go b/dgraph/cmd/alpha/run.go index 150c98899a1..04e04e4e29c 100644 --- a/dgraph/cmd/alpha/run.go +++ b/dgraph/cmd/alpha/run.go @@ -272,6 +272,7 @@ func setupServer() { http.HandleFunc("/share", shareHandler) http.HandleFunc("/debug/store", storeStatsHandler) http.HandleFunc("/admin/shutdown", shutDownHandler) + http.HandleFunc("/admin/backup", backupHandler) http.HandleFunc("/admin/export", exportHandler) http.HandleFunc("/admin/config/lru_mb", memoryLimitHandler) diff --git a/dgraphee/backup/backup.go b/dgraphee/backup/backup.go deleted file mode 100644 index 04aeb1ed006..00000000000 --- a/dgraphee/backup/backup.go +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package backup - -import ( - "context" - "hash/crc32" - "io" - "sync" - - "github.com/dgraph-io/dgraph/protos/pb" - "github.com/dgraph-io/dgraph/x" -) - -type Request struct { - ReadTs uint64 -} - -func (r *Request) Process(ctx context.Context) error { - var wg sync.WaitGroup - ckvs, cerr := make(chan *pb.KVS, 100), make(chan error, 1) - wg.Add(1) - go processKVS(&wg, stream, ckvs, cerr) - - for _, group := range s.KnownGroups() { - pl := s.Leader(group) - if pl == nil { - x.Printf("Backup: No healthy connection found to leader of group %d\n", group) - continue - } - - x.Printf("Backup: Requesting snapshot: group %d\n", group) - ctx, worker := s.Node.ctx, pb.NewWorkerClient(pl.Get()) - kvs, err := worker.StreamSnapshot(ctx, &pb.Snapshot{}) - if err != nil { - return err - } - - count := 0 - for kvs := range fetchKVS(kvs, cerr) { - select { - case ckvs <- kvs: - count += len(kvs.Kv) - case <-ctx.Done(): - close(ckvs) - return ctx.Err() - case err := <-cerr: - x.Println("Failure:", err) - close(ckvs) - return err - } - } - x.Printf("Backup: Group %d sent %d keys.\n", group, count) - } - - close(ckvs) - wg.Wait() - - // check for any errors from processKVS - if err := <-cerr; err != nil { - x.Println("Error:", err) - return err - } - - return nil -} - -// fetchKVS gets streamed snapshot from worker. -func fetchKVS(stream pb.Worker_StreamSnapshotClient, cerr chan error) chan *pb.KVS { - out := make(chan *pb.KVS) - go func() { - for { - kvs, err := stream.Recv() - if err == io.EOF { - break - } - if err != nil { - cerr <- err - break - } - out <- kvs - } - close(out) - }() - return out -} - -// processKVS unrolls the KVS list values and streams them back to the client. -// Postprocessing should happen at the client side. -func processKVS(wg *sync.WaitGroup, stream pb.Zero_BackupServer, in chan *pb.KVS, - cerr chan error) { - defer wg.Done() - - h := crc32.NewIEEE() - for kvs := range in { - for _, kv := range kvs.Kv { - if kv.Version == 0 { - continue - } - b, err := kv.Marshal() - if err != nil { - cerr <- err - return - } - - resp := &pb.BackupResponse{ - Data: b, - Length: uint64(len(b)), - Checksum: h.Sum(b), - } - if err := stream.Send(resp); err != nil { - cerr <- err - return - } - } - } - cerr <- nil -} diff --git a/dgraphee/cmd/backup/backup.go b/dgraphee/cmd/backup/backup.go deleted file mode 100644 index 763ed142ca9..00000000000 --- a/dgraphee/cmd/backup/backup.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package main - -import ( - "bytes" - "context" - "hash/crc32" - "io" - "io/ioutil" - "time" - - "github.com/dgraph-io/dgraph/protos/pb" - "github.com/dgraph-io/dgraph/x" - "github.com/matttproud/golang_protobuf_extensions/pbutil" - "google.golang.org/grpc" -) - -type backup struct { - target, source handler - incremental bool - dst string - start time.Time // To get time elapsel. - zeroconn *grpc.ClientConn -} - -func (b *backup) process() error { - tempFile, err := ioutil.TempFile(opt.tmpDir, "dgraph-backup-*") - if err != nil { - return err - } - defer tempFile.Close() - - zc := pb.NewZeroClient(b.zeroconn) - stream, err := zc.Backup(context.Background(), &pb.BackupRequest{}) - if err != nil { - return err - } - - h := crc32.NewIEEE() - for { - res, err := stream.Recv() - if err == io.EOF { - break - } - if err != nil { - return err - } - - csum := h.Sum(res.Data) - if !bytes.Equal(csum, res.Checksum) { - x.Printf("Warning: data checksum failed: %x != %x\n", csum, res.Checksum) - continue - } - - if _, err := pbutil.WriteDelimited(tempFile, res); err != nil { - return x.Errorf("Backup: could not save to temp file: %s\n", err) - } - } - - if err := b.target.Copy(tempFile.Name(), b.dst); err != nil { - return x.Errorf("Backup: could not copy to destination: %s\n", err) - } - - return nil -} diff --git a/dgraphee/cmd/backup/handler.go b/dgraphee/cmd/backup/handler.go deleted file mode 100644 index 2ceb568c6be..00000000000 --- a/dgraphee/cmd/backup/handler.go +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package main - -import ( - "net/url" - - "github.com/dgraph-io/dgraph/x" -) - -// handler interface is implemented by uri scheme handlers. -// -// Session() will read any supported environment variables and authenticate if needed. -// List() returns a sorted slice of files at a location; such as remote or local. -// Copy() copies a local file (from tmpDir) to a new destination, possibly remote. -// Exists() tests if a file exists. -type handler interface { - Session(string, string) error - List() ([]string, error) - Copy(string, string) error - Exists(string) bool -} - -// handlers map uri scheme to a handler -var handlers = make(map[string]handler, 0) - -func findHandler(uri string) (handler, error) { - u, err := url.Parse(uri) - if err != nil { - return nil, err - } - if u.Scheme == "" { - u.Scheme = "file" - } - h, ok := handlers[u.Scheme] - if !ok { - return nil, x.Errorf("invalid scheme %q", u.Scheme) - } - if err := h.Session(u.Host, u.Path); err != nil { - return nil, err - } - return h, nil -} diff --git a/dgraphee/cmd/backup/run.go b/dgraphee/cmd/backup/run.go deleted file mode 100644 index f9521521503..00000000000 --- a/dgraphee/cmd/backup/run.go +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package main - -import ( - "fmt" - "net/http" - _ "net/http/pprof" - "os" - "time" - - "github.com/dgraph-io/dgraph/x" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var opt struct { - zero string - tmpDir string - target string - source string -} - -var tlsConf x.TLSHelperConfig - -var Backup x.SubCommand - -func init() { - Backup.Cmd = &cobra.Command{ - Use: "backup", - Short: "Run Dgraph backup", - Run: func(cmd *cobra.Command, args []string) { - defer x.StartProfile(Backup.Conf).Stop() - if err := run(); err != nil { - x.Printf("Backup: %s\n", err) - os.Exit(1) - } - }, - } - Backup.EnvPrefix = "DGRAPH_BACKUP" - - flag := Backup.Cmd.Flags() - flag.StringVarP(&opt.zero, "zero", "z", "127.0.0.1:5080", "Dgraphzero gRPC server address") - flag.StringVar(&opt.tmpDir, "tmpdir", "", "Directory to store temporary files") - flag.StringVarP(&opt.target, "target", "t", "", "URI path target to store the backups") - flag.StringVarP(&opt.source, "source", "s", "", "URI path source containing full backups") - x.RegisterTLSFlags(flag) - Backup.Cmd.MarkFlagRequired("target") -} - -func run() error { - x.LoadTLSConfig(&tlsConf, Backup.Conf) - x.Printf("%#v\n", opt) - - go http.ListenAndServe("localhost:6060", nil) - - b, err := setup() - if err != nil { - return err - } - fmt.Printf("Backup: saving to: %s ...\n", b.dst) - if err := b.process(); err != nil { - return err - } - fmt.Printf("Backup: time elapsed: %s\n", time.Since(b.start)) - - return nil -} - -func setup() (*backup, error) { - h, err := findHandler(opt.target) - if err != nil { - return nil, x.Errorf("Backup: failed to find target handler: %s", err) - } - - connzero, err := setupConnection(opt.zero, true) - if err != nil { - return nil, x.Errorf("Backup: unable to connect to zero at %q: %s", opt.zero, err) - } - - start := time.Now() - b := &backup{ - start: start, - zeroconn: connzero, - target: h, - dst: dgraphBackupFullPrefix + start.Format(time.RFC3339) + dgraphBackupSuffix, - } - - if opt.source != "" { - b.source, err = findHandler(opt.source) - if err != nil { - return nil, x.Errorf("Backup: failed to find a source handler: %s", err) - } - } - - b.incremental = b.source != nil - - return b, nil -} - -func setupConnection(host string, insecure bool) (*grpc.ClientConn, error) { - if insecure { - return grpc.Dial(host, - grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(x.GrpcMaxSize), - grpc.MaxCallSendMsgSize(x.GrpcMaxSize)), - grpc.WithInsecure(), - grpc.WithBlock(), - grpc.WithTimeout(10*time.Second)) - } - - tlsConf.ConfigType = x.TLSClientConfig - tlsConf.CertRequired = false - tlsCfg, _, err := x.GenerateTLSConfig(tlsConf) - if err != nil { - return nil, err - } - - return grpc.Dial(host, - grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(x.GrpcMaxSize), - grpc.MaxCallSendMsgSize(x.GrpcMaxSize)), - grpc.WithTransportCredentials(credentials.NewTLS(tlsCfg)), - grpc.WithBlock(), - grpc.WithTimeout(10*time.Second)) -} diff --git a/dgraphee/README.md b/ee/README.md similarity index 100% rename from dgraphee/README.md rename to ee/README.md diff --git a/ee/backup/backup.go b/ee/backup/backup.go new file mode 100644 index 00000000000..c66248d0d2f --- /dev/null +++ b/ee/backup/backup.go @@ -0,0 +1,62 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "context" + "math" + + "github.com/dgraph-io/badger" + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/worker/stream" + "github.com/dgraph-io/dgraph/x" +) + +type Worker struct { + ReadTs uint64 + DB *badger.DB +} + +type collector struct { + kv []*pb.KV +} + +func (c *collector) Send(kvs *pb.KVS) error { + c.kv = append(c.kv, kvs.Kv...) + return nil +} + +func (w *Worker) Process(ctx context.Context) error { + c := &collector{kv: make([]*pb.KV, 0, 100)} + sl := stream.Lists{Stream: c, DB: w.DB} + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + item := itr.Item() + val, err := item.ValueCopy(nil) + if err != nil { + return nil, err + } + kv := &pb.KV{Key: item.KeyCopy(nil), Val: val, Version: item.Version()} + itr.Next() // Just for fun. + return kv, nil + } + + // Test case 1. Retrieve everything. + err := sl.Orchestrate(context.Background(), "Backup", math.MaxUint64) + if err != nil { + return err + } + + m := make(map[string]int) + for _, kv := range c.kv { + pk := x.Parse(kv.Key) + m[pk.Attr]++ + } + // for pred, count := range m { + // require.Equal(t, 100, count, "Count mismatch for pred: %s", pred) + // } + + return nil +} diff --git a/dgraphee/backup/file_handler.go b/ee/backup/file_handler.go similarity index 95% rename from dgraphee/backup/file_handler.go rename to ee/backup/file_handler.go index 1b9d9563ede..71ff675c598 100644 --- a/dgraphee/backup/file_handler.go +++ b/ee/backup/file_handler.go @@ -62,7 +62,3 @@ func (h *fileHandler) Exists(path string) bool { _, err := os.Stat(path) return os.IsExist(err) } - -func init() { - handlers["file"] = &fileHandler{} -} diff --git a/worker/backup.go b/worker/backup.go new file mode 100644 index 00000000000..a909e8e5b8d --- /dev/null +++ b/worker/backup.go @@ -0,0 +1,59 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. and Contributors + * + * Licensed 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 worker + +import ( + "github.com/dgraph-io/dgraph/ee/backup" + "github.com/dgraph-io/dgraph/posting" + "github.com/dgraph-io/dgraph/protos/pb" + "github.com/golang/glog" + "golang.org/x/net/context" +) + +// Backup handles a request coming from another node. +func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { + var resp pb.BackupResponse + bw := &backup.Worker{ + ReadTs: req.StartTs, + DB: pstore, + } + if err := bw.Process(ctx); err != nil { + resp.Status = pb.BackupResponse_FAILED + return &resp, err + } + resp.Status = pb.BackupResponse_SUCCESS + return &resp, nil +} + +// BackupOverNetwork handles a request coming from an HTTP client. +func BackupOverNetwork(ctx context.Context) error { + // Get ReadTs from zero and wait for stream to catch up. + ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) + if err != nil { + glog.Errorf("Unable to retrieve readonly ts for export: %v\n", err) + return err + } + readTs := ts.ReadOnly + glog.Infof("Got readonly ts from Zero: %d\n", readTs) + posting.Oracle().WaitForTs(ctx, readTs) + + // Let's first collect all groups. + gids := groups().KnownGroups() + glog.Infof("Requesting export for groups: %v\n", gids) + + return nil +} diff --git a/worker/draft.go b/worker/draft.go index 4b5a163e785..4e7bdc5cc32 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -37,6 +37,7 @@ import ( "github.com/dgraph-io/dgraph/raftwal" "github.com/dgraph-io/dgraph/schema" "github.com/dgraph-io/dgraph/types" + "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" @@ -749,8 +750,8 @@ func (n *node) Run() { // list, and write back a complete posting list. func (n *node) rollupLists(readTs uint64) error { writer := &x.TxnWriter{DB: pstore, BlindWrite: true} - sl := streamLists{stream: writer, db: pstore} - sl.chooseKey = func(item *badger.Item) bool { + sl := stream.Lists{Stream: writer, DB: pstore} + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) if pk.IsSchema() { // Skip if schema. @@ -759,14 +760,14 @@ func (n *node) rollupLists(readTs uint64) error { // Return true if we don't find the BitCompletePosting bit. return item.UserMeta()&posting.BitCompletePosting == 0 } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { l, err := posting.ReadPostingList(key, itr) if err != nil { return nil, err } return l.MarshalToKv() } - if err := sl.orchestrate(context.Background(), "Rolling up", readTs); err != nil { + if err := sl.Orchestrate(context.Background(), "Rolling up", readTs); err != nil { return err } if err := writer.Flush(); err != nil { diff --git a/worker/groups.go b/worker/groups.go index ce64100e1d2..4be2e4bc0ee 100644 --- a/worker/groups.go +++ b/worker/groups.go @@ -300,7 +300,6 @@ func (g *groupi) applyState(state *pb.MembershipState) { conn.Get().Connect(member.Addr) } } - } func (g *groupi) ServesGroup(gid uint32) bool { diff --git a/worker/predicate.go b/worker/predicate.go index d046138407b..57dff96c6de 100644 --- a/worker/predicate.go +++ b/worker/predicate.go @@ -28,6 +28,7 @@ import ( "github.com/dgraph-io/dgraph/conn" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" ) @@ -87,7 +88,7 @@ func (n *node) populateSnapshot(ps *badger.DB, pl *conn.Pool) (int, error) { } func (w *grpcWorker) StreamSnapshot(reqSnap *pb.Snapshot, - stream pb.Worker_StreamSnapshotServer) error { + s pb.Worker_StreamSnapshotServer) error { n := groups().Node if n == nil { return conn.ErrNoNode @@ -127,12 +128,12 @@ func (w *grpcWorker) StreamSnapshot(reqSnap *pb.Snapshot, // BUG: There's a bug here due to which a node which doesn't see any transactions, but has real // data fails to send that over, because of min_ts. - sl := streamLists{stream: stream, db: pstore} - sl.chooseKey = func(_ *badger.Item) bool { + sl := stream.Lists{Stream: s, DB: pstore} + sl.ChooseKeyFunc = func(_ *badger.Item) bool { // Pick all keys. return true } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() pk := x.Parse(key) if pk.IsSchema() { @@ -159,11 +160,11 @@ func (w *grpcWorker) StreamSnapshot(reqSnap *pb.Snapshot, return l.MarshalToKv() } - if err := sl.orchestrate(stream.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { + if err := sl.Orchestrate(s.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { return err } - if tr, ok := trace.FromContext(stream.Context()); ok { + if tr, ok := trace.FromContext(s.Context()); ok { tr.LazyPrintf("Sent keys. Done.\n") } return nil diff --git a/worker/predicate_move.go b/worker/predicate_move.go index a451c016f0d..ace31c9bf58 100644 --- a/worker/predicate_move.go +++ b/worker/predicate_move.go @@ -32,6 +32,7 @@ import ( "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" ) @@ -89,15 +90,15 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro return x.Errorf("Unable to find a connection for group: %d\n", gid) } c := pb.NewWorkerClient(pl.Get()) - stream, err := c.ReceivePredicate(ctx) + s, err := c.ReceivePredicate(ctx) if err != nil { return fmt.Errorf("While calling ReceivePredicate: %+v", err) } // sends all data except schema, schema key has different prefix // Read the predicate keys and stream to keysCh. - sl := streamLists{stream: stream, predicate: predicate, db: pstore} - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl := stream.Lists{Stream: s, Predicate: predicate, DB: pstore} + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { l, err := posting.ReadPostingList(key, itr) if err != nil { return nil, err @@ -106,7 +107,7 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro } prefix := fmt.Sprintf("Sending predicate: [%s]", predicate) - if err := sl.orchestrate(ctx, prefix, math.MaxUint64); err != nil { + if err := sl.Orchestrate(ctx, prefix, math.MaxUint64); err != nil { return err } @@ -132,12 +133,12 @@ func movePredicateHelper(ctx context.Context, predicate string, gid uint32) erro kv.Version = 1 kv.UserMeta = []byte{item.UserMeta()} kvs.Kv = append(kvs.Kv, kv) - if err := stream.Send(kvs); err != nil { + if err := s.Send(kvs); err != nil { return err } } - payload, err := stream.CloseAndRecv() + payload, err := s.CloseAndRecv() if err != nil { return err } diff --git a/worker/stream/doc.go b/worker/stream/doc.go new file mode 100644 index 00000000000..e79d51a5904 --- /dev/null +++ b/worker/stream/doc.go @@ -0,0 +1,19 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. and Contributors + * + * Licensed 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 stream +// TODO: Write a in-depth explanation of what this does, with examples. +package stream diff --git a/worker/stream_lists.go b/worker/stream/stream.go similarity index 83% rename from worker/stream_lists.go rename to worker/stream/stream.go index 303bc7919ea..6ffb69bc13b 100644 --- a/worker/stream_lists.go +++ b/worker/stream/stream.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package worker +package stream import ( "bytes" @@ -24,21 +24,27 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" "golang.org/x/net/context" ) -type kvStream interface { +const ( + // MB represents a megabyte. + MB = 1 << 20 +) + +type KVStream interface { Send(*pb.KVS) error } -type streamLists struct { - stream kvStream - predicate string - db *badger.DB - chooseKey func(item *badger.Item) bool - itemToKv func(key []byte, itr *badger.Iterator) (*pb.KV, error) +type Lists struct { + Stream KVStream + Predicate string + DB *badger.DB + ChooseKeyFunc func(item *badger.Item) bool + ItemToKVFunc func(key []byte, itr *badger.Iterator) (*pb.KV, error) } // keyRange is [start, end), including start, excluding end. Do ensure that the start, @@ -48,7 +54,7 @@ type keyRange struct { end []byte } -func (sl *streamLists) orchestrate(ctx context.Context, prefix string, ts uint64) error { +func (sl *Lists) Orchestrate(ctx context.Context, prefix string, ts uint64) error { keyCh := make(chan keyRange, 100) // Contains keys for posting lists. kvChan := make(chan *pb.KVS, 100) // Contains marshaled posting lists. errCh := make(chan error, 1) // Stores error by consumeKeys. @@ -92,12 +98,12 @@ func (sl *streamLists) orchestrate(ctx context.Context, prefix string, ts uint64 return nil } -func (sl *streamLists) produceRanges(ctx context.Context, ts uint64, keyCh chan keyRange) { +func (sl *Lists) produceRanges(ctx context.Context, ts uint64, keyCh chan keyRange) { var prefix []byte - if len(sl.predicate) > 0 { - prefix = x.PredicatePrefix(sl.predicate) + if len(sl.Predicate) > 0 { + prefix = x.PredicatePrefix(sl.Predicate) } - txn := sl.db.NewTransactionAt(ts, false) + txn := sl.DB.NewTransactionAt(ts, false) defer txn.Discard() iterOpts := badger.DefaultIteratorOptions iterOpts.PrefetchValues = false @@ -126,14 +132,14 @@ func (sl *streamLists) produceRanges(ctx context.Context, ts uint64, keyCh chan close(keyCh) } -func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, +func (sl *Lists) produceKVs(ctx context.Context, ts uint64, keyCh chan keyRange, kvChan chan *pb.KVS) error { var prefix []byte - if len(sl.predicate) > 0 { - prefix = x.PredicatePrefix(sl.predicate) + if len(sl.Predicate) > 0 { + prefix = x.PredicatePrefix(sl.Predicate) } - txn := sl.db.NewTransactionAt(ts, false) + txn := sl.DB.NewTransactionAt(ts, false) defer txn.Discard() iterate := func(kr keyRange) error { iterOpts := badger.DefaultIteratorOptions @@ -157,12 +163,12 @@ func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, break } // Check if we should pick this key. - if sl.chooseKey != nil && !sl.chooseKey(item) { + if sl.ChooseKeyFunc != nil && !sl.ChooseKeyFunc(item) { continue } // Now convert to key value. - kv, err := sl.itemToKv(item.KeyCopy(nil), it) + kv, err := sl.ItemToKVFunc(item.KeyCopy(nil), it) if err != nil { return err } @@ -190,7 +196,7 @@ func (sl *streamLists) produceKVs(ctx context.Context, ts uint64, } } -func (sl *streamLists) streamKVs(ctx context.Context, prefix string, +func (sl *Lists) streamKVs(ctx context.Context, prefix string, kvChan chan *pb.KVS) error { var count int var bytesSent uint64 @@ -216,7 +222,7 @@ func (sl *streamLists) streamKVs(ctx context.Context, prefix string, bytesSent += sz count += len(batch.Kv) t := time.Now() - if err := sl.stream.Send(batch); err != nil { + if err := sl.Stream.Send(batch); err != nil { return err } glog.V(2).Infof("%s Created batch of size: %s in %v.\n", diff --git a/worker/stream_lists_test.go b/worker/stream/stream_test.go similarity index 89% rename from worker/stream_lists_test.go rename to worker/stream/stream_test.go index 77c56d134fb..38b8eea59f1 100644 --- a/worker/stream_lists_test.go +++ b/worker/stream/stream_test.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package worker +package stream import ( "context" @@ -71,8 +71,8 @@ func TestOrchestrate(t *testing.T) { } c := &collector{kv: make([]*pb.KV, 0, 100)} - sl := streamLists{stream: c, db: db} - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl := Lists{Stream: c, DB: db} + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() val, err := item.ValueCopy(nil) require.NoError(t, err) @@ -82,7 +82,7 @@ func TestOrchestrate(t *testing.T) { } // Test case 1. Retrieve everything. - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 300, len(c.kv), "Expected 300. Got: %d", len(c.kv)) @@ -99,9 +99,9 @@ func TestOrchestrate(t *testing.T) { } // Test case 2. Retrieve only 1 predicate. - sl.predicate = "p1" + sl.Predicate = "p1" c.kv = c.kv[:0] - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 100, len(c.kv), "Expected 100. Got: %d", len(c.kv)) @@ -119,11 +119,11 @@ func TestOrchestrate(t *testing.T) { // Test case 3. Retrieve select keys within the predicate. c.kv = c.kv[:0] - sl.chooseKey = func(item *badger.Item) bool { + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) return pk.Uid%2 == 0 } - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 50, len(c.kv), "Expected 50. Got: %d", len(c.kv)) @@ -141,8 +141,8 @@ func TestOrchestrate(t *testing.T) { // Test case 4. Retrieve select keys from all predicates. c.kv = c.kv[:0] - sl.predicate = "" - err = sl.orchestrate(context.Background(), "Testing", math.MaxUint64) + sl.Predicate = "" + err = sl.Orchestrate(context.Background(), "Testing", math.MaxUint64) require.NoError(t, err) require.Equal(t, 150, len(c.kv), "Expected 150. Got: %d", len(c.kv)) diff --git a/worker/worker.go b/worker/worker.go index 4d31e0e9c22..3d859a0dafa 100644 --- a/worker/worker.go +++ b/worker/worker.go @@ -27,13 +27,11 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/conn" - "github.com/dgraph-io/dgraph/dgraphee/backup" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" - "golang.org/x/net/context" "google.golang.org/grpc" ) @@ -120,20 +118,3 @@ func BlockingStop() { // TODO: What is this for? posting.StopLRUEviction() } - -// Backup ... -func (s *Server) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { - if req.StartTs == 0 { - req.StartTs = State.getTimestamp(true) - } - // resp.Txn = &api.TxnContext{ - // StartTs: req.StartTs, - // } - backupRequest = &backup.Request{ - ReadTs: req.StartTs, - } - if err := backupRequest.Process(ctx); err != nil { - return nil, err - } - return &pb.BackupResponse{}, nil -} From c4701a408484de6ce45e7576af3ddfda367c6353 Mon Sep 17 00:00:00 2001 From: srfrog Date: Mon, 29 Oct 2018 22:28:51 -0700 Subject: [PATCH 06/25] trying to get the handler and file writers working. --- ee/backup/backup.go | 39 +- ee/backup/handler.go | 43 ++ ee/backup/writer.go | 55 ++ .../{file_handler.go => writer_local.go} | 12 + protos/pb.proto | 5 +- protos/pb/pb.pb.go | 549 ++++++++++-------- worker/backup.go | 99 +++- worker/stream/stream.go | 4 +- 8 files changed, 506 insertions(+), 300 deletions(-) create mode 100644 ee/backup/handler.go create mode 100644 ee/backup/writer.go rename ee/backup/{file_handler.go => writer_local.go} (85%) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index c66248d0d2f..c0ef2a8c6dc 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -12,26 +12,24 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/worker/stream" - "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" ) type Worker struct { - ReadTs uint64 - DB *badger.DB -} - -type collector struct { - kv []*pb.KV -} - -func (c *collector) Send(kvs *pb.KVS) error { - c.kv = append(c.kv, kvs.Kv...) - return nil + ReadTs uint64 + GroupId uint32 + SeqTs string + DB *badger.DB } func (w *Worker) Process(ctx context.Context) error { - c := &collector{kv: make([]*pb.KV, 0, 100)} + c, err := w.newWriter() + if err != nil { + glog.Errorf("Backup error while creating writer: %s\n", err) + return err + } sl := stream.Lists{Stream: c, DB: w.DB} + sl.ChooseKeyFunc = func(_ *badger.Item) bool { return true } sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() val, err := item.ValueCopy(nil) @@ -39,24 +37,11 @@ func (w *Worker) Process(ctx context.Context) error { return nil, err } kv := &pb.KV{Key: item.KeyCopy(nil), Val: val, Version: item.Version()} - itr.Next() // Just for fun. return kv, nil } - // Test case 1. Retrieve everything. - err := sl.Orchestrate(context.Background(), "Backup", math.MaxUint64) - if err != nil { + if err := sl.Orchestrate(ctx, "Backup", math.MaxUint64); err != nil { return err } - - m := make(map[string]int) - for _, kv := range c.kv { - pk := x.Parse(kv.Key) - m[pk.Attr]++ - } - // for pred, count := range m { - // require.Equal(t, 100, count, "Count mismatch for pred: %s", pred) - // } - return nil } diff --git a/ee/backup/handler.go b/ee/backup/handler.go new file mode 100644 index 00000000000..4fecfbede09 --- /dev/null +++ b/ee/backup/handler.go @@ -0,0 +1,43 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "net/url" + + "github.com/dgraph-io/dgraph/x" +) + +// handler interface is implemented by uri scheme handlers. +// +// Session() will read any supported environment variables and authenticate if needed. +// Copy() copies a local file (from tmpDir) to a new destination, possibly remote. +// Exists() tests if a file exists. +type handler interface { + Copy(string, string) error + Session(string, string) error +} + +// handlers map uri scheme to a handler +var handlers = make(map[string]handler, 0) + +func findHandler(uri string) (handler, error) { + u, err := url.Parse(uri) + if err != nil { + return nil, err + } + if u.Scheme == "" { + u.Scheme = "file" + } + h, ok := handlers[u.Scheme] + if !ok { + return nil, x.Errorf("invalid scheme %q", u.Scheme) + } + if err := h.Session(u.Host, u.Path); err != nil { + return nil, err + } + return h, nil +} diff --git a/ee/backup/writer.go b/ee/backup/writer.go new file mode 100644 index 00000000000..6f80bd0079b --- /dev/null +++ b/ee/backup/writer.go @@ -0,0 +1,55 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "encoding/binary" + "fmt" + "io/ioutil" + "os" + + "github.com/dgraph-io/dgraph/protos/pb" +) + +const dgraphBackupTempPrefix = "dgraph-backup-*" + +type writer struct { + file string + dst handler + tmp *os.File +} + +func (w *Worker) newWriter() (*writer, error) { + // dst is where we will copy the data + dst, err := findHandler("/tmp/dgraph/") + if err != nil { + return nil, err + } + // tmp file is our main working file + tmp, err := ioutil.TempFile("", dgraphBackupTempPrefix) + if err != nil { + return nil, err + } + // file: 1283719371922.12.3242423938.dgraph-backup + file := fmt.Sprintf("%s.%d.%d%s", + w.SeqTs, w.GroupId, w.ReadTs, dgraphBackupSuffix) + return &writer{ + dst: dst, + tmp: tmp, + file: file, + }, nil +} + +func (w *writer) Send(kvs *pb.KVS) error { + var err error + for _, kv := range kvs.Kv { + err = binary.Write(w.tmp, binary.LittleEndian, kv.Val) + if err != nil { + return err + } + } + return nil +} diff --git a/ee/backup/file_handler.go b/ee/backup/writer_local.go similarity index 85% rename from ee/backup/file_handler.go rename to ee/backup/writer_local.go index 71ff675c598..90b94f7624d 100644 --- a/ee/backup/file_handler.go +++ b/ee/backup/writer_local.go @@ -62,3 +62,15 @@ func (h *fileHandler) Exists(path string) bool { _, err := os.Stat(path) return os.IsExist(err) } + +func (h *fileHandler) Write(b []byte) (int, error) { + return 0, nil +} + +func (h *fileHandler) Close() error { + return h.Close() +} + +func init() { + handlers["file"] = &fileHandler{} +} diff --git a/protos/pb.proto b/protos/pb.proto index 63b567e420a..8920e07df35 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -350,7 +350,7 @@ message MovePredicatePayload { MembershipState state = 4; } -// BackupPayload is used both as a request and a response. +// ExportPayload is used both as a request and a response. // When used in request, groups represents the list of groups that need to be backed up. // When used in response, groups represent the list of groups that were backed up. message ExportPayload { @@ -442,7 +442,8 @@ message SnapshotMeta { message BackupRequest { uint64 start_ts = 1; - string endpoint = 2; + uint32 group_id = 2; + string endpoint = 3; } message BackupResponse { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index a77bfacc8ae..e74fa43af51 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{17, 0} + return fileDescriptor_pb_f61bbe108b420f03, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{24, 0} + return fileDescriptor_pb_f61bbe108b420f03, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{24, 1} + return fileDescriptor_pb_f61bbe108b420f03, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{34, 0} + return fileDescriptor_pb_f61bbe108b420f03, []int{34, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{37, 0} + return fileDescriptor_pb_f61bbe108b420f03, []int{37, 0} } type BackupResponse_Status int32 @@ -208,7 +208,7 @@ func (x BackupResponse_Status) String() string { return proto.EnumName(BackupResponse_Status_name, int32(x)) } func (BackupResponse_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{47, 0} + return fileDescriptor_pb_f61bbe108b420f03, []int{47, 0} } type List struct { @@ -222,7 +222,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{0} + return fileDescriptor_pb_f61bbe108b420f03, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{1} + return fileDescriptor_pb_f61bbe108b420f03, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +326,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{2} + return fileDescriptor_pb_f61bbe108b420f03, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -399,7 +399,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{3} + return fileDescriptor_pb_f61bbe108b420f03, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -516,7 +516,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{4} + return fileDescriptor_pb_f61bbe108b420f03, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -563,7 +563,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{5} + return fileDescriptor_pb_f61bbe108b420f03, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -616,7 +616,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{6} + return fileDescriptor_pb_f61bbe108b420f03, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -707,7 +707,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{7} + return fileDescriptor_pb_f61bbe108b420f03, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -772,7 +772,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{8} + return fileDescriptor_pb_f61bbe108b420f03, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -847,7 +847,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{9} + return fileDescriptor_pb_f61bbe108b420f03, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -897,7 +897,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{10} + return fileDescriptor_pb_f61bbe108b420f03, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -974,7 +974,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{11} + return fileDescriptor_pb_f61bbe108b420f03, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1064,7 +1064,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{12} + return fileDescriptor_pb_f61bbe108b420f03, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1125,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{13} + return fileDescriptor_pb_f61bbe108b420f03, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1231,7 +1231,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{14} + return fileDescriptor_pb_f61bbe108b420f03, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1329,7 +1329,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{15} + return fileDescriptor_pb_f61bbe108b420f03, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1395,7 +1395,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{16} + return fileDescriptor_pb_f61bbe108b420f03, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1485,7 +1485,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{17} + return fileDescriptor_pb_f61bbe108b420f03, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1593,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{18} + return fileDescriptor_pb_f61bbe108b420f03, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1675,7 +1675,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{19} + return fileDescriptor_pb_f61bbe108b420f03, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1724,7 +1724,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{20} + return fileDescriptor_pb_f61bbe108b420f03, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1791,7 +1791,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{21} + return fileDescriptor_pb_f61bbe108b420f03, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1880,7 +1880,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{22} + return fileDescriptor_pb_f61bbe108b420f03, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1930,7 +1930,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{23} + return fileDescriptor_pb_f61bbe108b420f03, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2009,7 +2009,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{24} + return fileDescriptor_pb_f61bbe108b420f03, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2122,7 +2122,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{25} + return fileDescriptor_pb_f61bbe108b420f03, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2191,7 +2191,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{26} + return fileDescriptor_pb_f61bbe108b420f03, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2246,7 +2246,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{27} + return fileDescriptor_pb_f61bbe108b420f03, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2300,7 +2300,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{28} + return fileDescriptor_pb_f61bbe108b420f03, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2347,7 +2347,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{29} + return fileDescriptor_pb_f61bbe108b420f03, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2396,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{30} + return fileDescriptor_pb_f61bbe108b420f03, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2460,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{31} + return fileDescriptor_pb_f61bbe108b420f03, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2525,7 +2525,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{32} + return fileDescriptor_pb_f61bbe108b420f03, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2586,7 +2586,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{33} + return fileDescriptor_pb_f61bbe108b420f03, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2640,7 +2640,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{34} + return fileDescriptor_pb_f61bbe108b420f03, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2740,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{35} + return fileDescriptor_pb_f61bbe108b420f03, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2804,7 +2804,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{36} + return fileDescriptor_pb_f61bbe108b420f03, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2861,7 +2861,7 @@ func (m *MovePredicatePayload) GetState() *MembershipState { return nil } -// BackupPayload is used both as a request and a response. +// ExportPayload is used both as a request and a response. // When used in request, groups represents the list of groups that need to be backed up. // When used in response, groups represent the list of groups that were backed up. type ExportPayload struct { @@ -2878,7 +2878,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{37} + return fileDescriptor_pb_f61bbe108b420f03, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2947,7 +2947,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{38} + return fileDescriptor_pb_f61bbe108b420f03, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3002,7 +3002,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{39} + return fileDescriptor_pb_f61bbe108b420f03, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3056,7 +3056,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{40} + return fileDescriptor_pb_f61bbe108b420f03, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3103,7 +3103,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{41} + return fileDescriptor_pb_f61bbe108b420f03, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3151,7 +3151,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{42} + return fileDescriptor_pb_f61bbe108b420f03, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3206,7 +3206,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{43} + return fileDescriptor_pb_f61bbe108b420f03, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3263,7 +3263,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{44} + return fileDescriptor_pb_f61bbe108b420f03, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3325,7 +3325,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{45} + return fileDescriptor_pb_f61bbe108b420f03, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3370,7 +3370,8 @@ func (m *SnapshotMeta) GetGroupId() uint32 { type BackupRequest struct { StartTs uint64 `protobuf:"varint,1,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` - Endpoint string `protobuf:"bytes,2,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3380,7 +3381,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{46} + return fileDescriptor_pb_f61bbe108b420f03, []int{46} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3416,6 +3417,13 @@ func (m *BackupRequest) GetStartTs() uint64 { return 0 } +func (m *BackupRequest) GetGroupId() uint32 { + if m != nil { + return m.GroupId + } + return 0 +} + func (m *BackupRequest) GetEndpoint() string { if m != nil { return m.Endpoint @@ -3435,7 +3443,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_76a78ed8de9876ee, []int{47} + return fileDescriptor_pb_f61bbe108b420f03, []int{47} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6918,8 +6926,13 @@ func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintPb(dAtA, i, uint64(m.StartTs)) } + if m.GroupId != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) + } if len(m.Endpoint) > 0 { - dAtA[i] = 0x12 + dAtA[i] = 0x1a i++ i = encodeVarintPb(dAtA, i, uint64(len(m.Endpoint))) i += copy(dAtA[i:], m.Endpoint) @@ -8228,6 +8241,9 @@ func (m *BackupRequest) Size() (n int) { if m.StartTs != 0 { n += 1 + sovPb(uint64(m.StartTs)) } + if m.GroupId != 0 { + n += 1 + sovPb(uint64(m.GroupId)) + } l = len(m.Endpoint) if l > 0 { n += 1 + l + sovPb(uint64(l)) @@ -15299,6 +15315,25 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } } case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GroupId", wireType) + } + m.GroupId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GroupId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) } @@ -15553,204 +15588,204 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_76a78ed8de9876ee) } - -var fileDescriptor_pb_76a78ed8de9876ee = []byte{ - // 3124 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4b, 0x73, 0xdb, 0xd6, - 0xd5, 0x02, 0x48, 0x82, 0xc0, 0x21, 0x29, 0x33, 0x37, 0x8e, 0x43, 0x33, 0x89, 0xac, 0x20, 0x7e, - 0x28, 0x76, 0xa2, 0xcf, 0x51, 0xf2, 0x4d, 0x1e, 0x3b, 0x59, 0xa4, 0x3c, 0x8c, 0xf5, 0xea, 0x25, - 0xe5, 0xb4, 0x59, 0x84, 0x03, 0x11, 0x57, 0x12, 0x2a, 0x10, 0x40, 0x70, 0x01, 0x0d, 0x95, 0x45, - 0x67, 0xba, 0xe9, 0x6f, 0x48, 0x37, 0x5d, 0x74, 0xd9, 0xfe, 0x81, 0xf6, 0x07, 0x74, 0x26, 0xcb, - 0xae, 0x3a, 0xd3, 0x5d, 0xc7, 0x5d, 0x75, 0xdd, 0xe9, 0x74, 0xd1, 0x4d, 0xe7, 0x9e, 0x7b, 0xf1, - 0x20, 0x2d, 0xd9, 0x49, 0x3b, 0x5d, 0x11, 0xe7, 0x71, 0x5f, 0xe7, 0x7d, 0x0e, 0xc1, 0x8c, 0x8e, - 0xd6, 0xa3, 0x38, 0x4c, 0x42, 0xa2, 0x47, 0x47, 0x5d, 0xcb, 0x89, 0x3c, 0x09, 0xda, 0x5d, 0xa8, - 0xee, 0x78, 0x3c, 0x21, 0x04, 0xaa, 0xa9, 0xe7, 0xf2, 0x8e, 0xb6, 0x5a, 0x59, 0x33, 0x28, 0x7e, - 0xdb, 0xbb, 0x60, 0x8d, 0x1c, 0x7e, 0xf6, 0xd4, 0xf1, 0x53, 0x46, 0xda, 0x50, 0x39, 0x77, 0xfc, - 0x8e, 0xb6, 0xaa, 0xad, 0x35, 0xa9, 0xf8, 0x24, 0xeb, 0x60, 0x9e, 0x3b, 0xfe, 0x38, 0xb9, 0x88, - 0x58, 0x47, 0x5f, 0xd5, 0xd6, 0x96, 0x37, 0x5e, 0x5d, 0x8f, 0x8e, 0xd6, 0x0f, 0x42, 0x9e, 0x78, - 0xc1, 0xc9, 0xfa, 0x53, 0xc7, 0x1f, 0x5d, 0x44, 0x8c, 0xd6, 0xcf, 0xe5, 0x87, 0xbd, 0x0f, 0x8d, - 0x61, 0x3c, 0xd9, 0x4e, 0x83, 0x49, 0xe2, 0x85, 0x81, 0x38, 0x31, 0x70, 0xa6, 0x0c, 0x77, 0xb4, - 0x28, 0x7e, 0x0b, 0x9c, 0x13, 0x9f, 0xf0, 0x4e, 0x65, 0xb5, 0x22, 0x70, 0xe2, 0x9b, 0x74, 0xa0, - 0xee, 0xf1, 0xad, 0x30, 0x0d, 0x92, 0x4e, 0x75, 0x55, 0x5b, 0x33, 0x69, 0x06, 0xda, 0x7f, 0xd7, - 0xa1, 0xf6, 0xa3, 0x94, 0xc5, 0x17, 0xb8, 0x2e, 0x49, 0xe2, 0x6c, 0x2f, 0xf1, 0x4d, 0xae, 0x43, - 0xcd, 0x77, 0x82, 0x13, 0xde, 0xd1, 0x71, 0x33, 0x09, 0x90, 0x37, 0xc0, 0x72, 0x8e, 0x13, 0x16, - 0x8f, 0x53, 0xcf, 0xed, 0x54, 0x56, 0xb5, 0x35, 0x83, 0x9a, 0x88, 0x38, 0xf4, 0x5c, 0x72, 0x13, - 0x4c, 0x37, 0x1c, 0x4f, 0xca, 0x67, 0xb9, 0x21, 0x9e, 0x45, 0xde, 0x01, 0x33, 0xf5, 0xdc, 0xb1, - 0xef, 0xf1, 0xa4, 0x53, 0x5b, 0xd5, 0xd6, 0x1a, 0x1b, 0xa6, 0x78, 0xac, 0x90, 0x1d, 0xad, 0xa7, - 0x9e, 0x8b, 0x42, 0xbc, 0x0f, 0x26, 0x8f, 0x27, 0xe3, 0xe3, 0x34, 0x98, 0x74, 0x0c, 0x64, 0xba, - 0x26, 0x98, 0x4a, 0xaf, 0xa6, 0x75, 0x2e, 0x01, 0xf1, 0xac, 0x98, 0x9d, 0xb3, 0x98, 0xb3, 0x4e, - 0x5d, 0x1e, 0xa5, 0x40, 0xf2, 0x10, 0x1a, 0xc7, 0xce, 0x84, 0x25, 0xe3, 0xc8, 0x89, 0x9d, 0x69, - 0xc7, 0x2c, 0x36, 0xda, 0x16, 0xe8, 0x03, 0x81, 0xe5, 0x14, 0x8e, 0x73, 0x80, 0x7c, 0x08, 0x2d, - 0x84, 0xf8, 0xf8, 0xd8, 0xf3, 0x13, 0x16, 0x77, 0x2c, 0x5c, 0xb3, 0x8c, 0x6b, 0x10, 0x33, 0x8a, - 0x19, 0xa3, 0x4d, 0xc9, 0x24, 0x31, 0xe4, 0x2d, 0x00, 0x36, 0x8b, 0x9c, 0xc0, 0x1d, 0x3b, 0xbe, - 0xdf, 0x01, 0xbc, 0x83, 0x25, 0x31, 0x9b, 0xbe, 0x4f, 0x5e, 0x17, 0xf7, 0x73, 0xdc, 0x71, 0xc2, - 0x3b, 0xad, 0x55, 0x6d, 0xad, 0x4a, 0x0d, 0x01, 0x8e, 0xb8, 0xbd, 0x01, 0x16, 0x5a, 0x04, 0xbe, - 0xf8, 0x0e, 0x18, 0xe7, 0x02, 0x90, 0x86, 0xd3, 0xd8, 0x68, 0x89, 0x23, 0x73, 0xa3, 0xa1, 0x8a, - 0x68, 0xaf, 0x80, 0xb9, 0xe3, 0x04, 0x27, 0x99, 0xa5, 0x09, 0x55, 0xe0, 0x02, 0x8b, 0xe2, 0xb7, - 0xfd, 0xad, 0x0e, 0x06, 0x65, 0x3c, 0xf5, 0x13, 0x72, 0x0f, 0x40, 0x08, 0x7a, 0xea, 0x24, 0xb1, - 0x37, 0x53, 0xbb, 0x16, 0xa2, 0xb6, 0x52, 0xcf, 0xdd, 0x45, 0x12, 0x79, 0x08, 0x4d, 0xdc, 0x3d, - 0x63, 0xd5, 0x8b, 0x0b, 0xe4, 0xf7, 0xa3, 0x0d, 0x64, 0x51, 0x2b, 0x6e, 0x80, 0x81, 0xba, 0x95, - 0xf6, 0xd5, 0xa2, 0x0a, 0x22, 0x77, 0x60, 0xd9, 0x0b, 0x12, 0x21, 0xfb, 0x49, 0x32, 0x76, 0x19, - 0xcf, 0x94, 0xdf, 0xca, 0xb1, 0x3d, 0xc6, 0x13, 0xf2, 0x01, 0x48, 0x01, 0x66, 0x07, 0xd6, 0xf0, - 0xc0, 0xe5, 0x5c, 0x31, 0x5c, 0x9e, 0x88, 0x3c, 0xea, 0xc4, 0xf7, 0xa1, 0x21, 0xde, 0x97, 0xad, - 0x30, 0x70, 0x45, 0x13, 0x5f, 0xa3, 0xc4, 0x41, 0x41, 0x30, 0x28, 0x76, 0x21, 0x1a, 0x61, 0x60, - 0xd2, 0x20, 0xf0, 0xdb, 0xee, 0x43, 0x6d, 0x3f, 0x76, 0x59, 0x7c, 0xa9, 0x8d, 0x13, 0xa8, 0xba, - 0x8c, 0x4f, 0xd0, 0xfd, 0x4c, 0x8a, 0xdf, 0x85, 0xdd, 0x57, 0x4a, 0x76, 0x6f, 0xff, 0x4a, 0x83, - 0xc6, 0x30, 0x8c, 0x93, 0x5d, 0xc6, 0xb9, 0x73, 0xc2, 0xc8, 0x2d, 0xa8, 0x85, 0x62, 0x5b, 0x25, - 0x61, 0x4b, 0xdc, 0x09, 0xcf, 0xa1, 0x12, 0xbf, 0xa0, 0x07, 0xfd, 0x6a, 0x3d, 0x5c, 0x87, 0x9a, - 0xf4, 0x18, 0xe1, 0x4d, 0x35, 0x2a, 0x01, 0x21, 0xeb, 0xf0, 0xf8, 0x98, 0x33, 0x29, 0xcb, 0x1a, - 0x55, 0xd0, 0xd5, 0x66, 0xf5, 0xff, 0x00, 0xe2, 0x7e, 0x3f, 0xd0, 0x0a, 0xec, 0x53, 0x68, 0x50, - 0xe7, 0x38, 0xd9, 0x0a, 0x83, 0x84, 0xcd, 0x12, 0xb2, 0x0c, 0xba, 0xe7, 0xa2, 0x88, 0x0c, 0xaa, - 0x7b, 0xae, 0xb8, 0xdc, 0x49, 0x1c, 0xa6, 0x11, 0x4a, 0xa8, 0x45, 0x25, 0x80, 0xa2, 0x74, 0xdd, - 0x18, 0x6f, 0x2c, 0x44, 0xe9, 0xba, 0x31, 0xb9, 0x05, 0x0d, 0x1e, 0x38, 0x11, 0x3f, 0x0d, 0x13, - 0x71, 0xb9, 0x2a, 0x5e, 0x0e, 0x32, 0xd4, 0x88, 0xdb, 0x7f, 0xd0, 0xc0, 0xd8, 0x65, 0xd3, 0x23, - 0x16, 0x3f, 0x77, 0xca, 0x4d, 0x30, 0x71, 0xe3, 0xb1, 0xe7, 0xaa, 0x83, 0xea, 0x08, 0x0f, 0xdc, - 0x4b, 0x8f, 0xba, 0x01, 0x86, 0xcf, 0x1c, 0x21, 0x7c, 0x69, 0x67, 0x0a, 0x12, 0xb2, 0x71, 0xa6, - 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xb4, 0xc7, 0x1c, 0x57, 0xdc, 0xcd, 0x77, - 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x30, 0x1c, 0x9e, 0x1c, 0x22, 0x86, - 0xdc, 0x87, 0x57, 0x26, 0x7e, 0xca, 0x45, 0x5c, 0xf3, 0x82, 0xe3, 0x70, 0x1c, 0x06, 0xfe, 0x05, - 0xca, 0xd7, 0xa4, 0xd7, 0x14, 0x61, 0x10, 0x1c, 0x87, 0xfb, 0x81, 0x7f, 0x61, 0xff, 0x4b, 0x83, - 0xda, 0x63, 0x14, 0xc3, 0x43, 0xa8, 0x4f, 0xf1, 0x41, 0x99, 0xf7, 0xde, 0x10, 0x12, 0x46, 0xda, - 0xba, 0x7c, 0x29, 0xef, 0x07, 0x49, 0x7c, 0x41, 0x33, 0x36, 0xb1, 0x22, 0x71, 0x8e, 0x7c, 0x96, - 0x70, 0x65, 0x11, 0xa5, 0x15, 0x23, 0x49, 0x50, 0x2b, 0x14, 0x5b, 0x77, 0x1b, 0x9a, 0xe5, 0xad, - 0x44, 0x1a, 0x39, 0x63, 0x17, 0x28, 0xbb, 0x2a, 0x15, 0x9f, 0x64, 0x15, 0x6a, 0xe8, 0xa4, 0x28, - 0xb9, 0xc6, 0x06, 0x88, 0x1d, 0xe5, 0x12, 0x2a, 0x09, 0x9f, 0xe9, 0x9f, 0x68, 0x62, 0x9f, 0xf2, - 0x01, 0xe5, 0x7d, 0xac, 0xab, 0xf7, 0x91, 0x4b, 0x4a, 0xfb, 0xd8, 0xff, 0xd4, 0xa0, 0xf9, 0x25, - 0x8b, 0xc3, 0x83, 0x38, 0x8c, 0x42, 0xee, 0xf8, 0xc4, 0x06, 0x43, 0xbe, 0xee, 0x92, 0xf3, 0x15, - 0x45, 0xf0, 0xc8, 0xf7, 0xa0, 0x1a, 0xe7, 0xf7, 0x56, 0x14, 0xb2, 0x02, 0x30, 0x75, 0x66, 0x3b, - 0xcc, 0xe1, 0x6c, 0xe0, 0x66, 0xe6, 0x53, 0x60, 0x48, 0x17, 0xcc, 0xa9, 0x33, 0x1b, 0xcd, 0x82, - 0x11, 0x47, 0xed, 0x56, 0x69, 0x0e, 0x93, 0x37, 0xc1, 0x9a, 0x3a, 0x33, 0x61, 0xc7, 0x03, 0x57, - 0x69, 0xb7, 0x40, 0x90, 0xb7, 0xa1, 0x92, 0xcc, 0x02, 0x0c, 0x0a, 0x22, 0x0f, 0x88, 0xdc, 0x3d, - 0x9a, 0x05, 0xca, 0xe2, 0xa9, 0xa0, 0x65, 0xd2, 0x30, 0x0b, 0x69, 0xb4, 0xa1, 0x32, 0xf1, 0x5c, - 0x4c, 0x04, 0x16, 0x15, 0x9f, 0xf6, 0xef, 0x2a, 0x70, 0x4d, 0xa9, 0xe2, 0xd4, 0x8b, 0x86, 0x89, - 0xb0, 0x9b, 0x0e, 0xd4, 0xd1, 0x5d, 0x59, 0xac, 0x34, 0x92, 0x81, 0xe4, 0x63, 0x30, 0xd0, 0x84, - 0x33, 0x45, 0xdf, 0x2a, 0xc4, 0x92, 0x2f, 0x97, 0x8a, 0x57, 0x1a, 0x57, 0xec, 0xe4, 0x23, 0xa8, - 0x7d, 0xc3, 0xe2, 0x50, 0x86, 0x9f, 0xc6, 0xc6, 0xca, 0x65, 0xeb, 0x84, 0x02, 0xd4, 0x32, 0xc9, - 0xfc, 0x3f, 0x94, 0xde, 0x6d, 0x11, 0x70, 0xa6, 0xe1, 0x39, 0x73, 0x3b, 0x75, 0xbc, 0x51, 0x59, - 0xc1, 0x19, 0x29, 0x13, 0x97, 0x99, 0x8b, 0xab, 0xdb, 0x83, 0x46, 0xe9, 0x79, 0x65, 0x7b, 0x6b, - 0x49, 0x09, 0xdf, 0x9a, 0xb7, 0x37, 0x2b, 0xf7, 0x84, 0xb2, 0xd9, 0xf6, 0x00, 0x8a, 0xc7, 0xfe, - 0xa7, 0xc6, 0x6f, 0xff, 0x5c, 0x83, 0x6b, 0x5b, 0x61, 0x10, 0x30, 0xac, 0x21, 0xa4, 0xea, 0x0a, - 0xbb, 0xd5, 0xae, 0xb4, 0xdb, 0x77, 0xa1, 0xc6, 0x05, 0xb3, 0xda, 0xfd, 0xd5, 0x4b, 0x74, 0x41, - 0x25, 0x87, 0x08, 0x31, 0x53, 0x67, 0x36, 0x8e, 0x58, 0xe0, 0x7a, 0xc1, 0x09, 0xda, 0xb9, 0xd4, - 0xc0, 0x81, 0xc4, 0xd8, 0xbf, 0xd6, 0xc0, 0x90, 0x26, 0x3f, 0x17, 0xee, 0xb4, 0xf9, 0x70, 0xf7, - 0x26, 0x58, 0x51, 0xcc, 0x5c, 0x6f, 0x92, 0x9d, 0x6a, 0xd1, 0x02, 0x21, 0xa2, 0xf1, 0x71, 0x18, - 0x4f, 0x18, 0x6e, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, 0x4d, - 0x81, 0x10, 0xd1, 0x4a, 0x2c, 0xe1, 0x91, 0x33, 0x91, 0x45, 0x52, 0x85, 0x4a, 0x40, 0x44, 0x50, - 0xa9, 0x39, 0xd4, 0x98, 0x49, 0x15, 0x64, 0xff, 0x46, 0x87, 0x66, 0xcf, 0x8b, 0xd9, 0x24, 0x61, - 0x6e, 0xdf, 0x3d, 0x41, 0x46, 0x16, 0x24, 0x5e, 0x72, 0xa1, 0xa2, 0xb5, 0x82, 0xf2, 0x64, 0xaa, - 0xcf, 0x17, 0x8c, 0x52, 0x17, 0x15, 0xac, 0x71, 0x25, 0x40, 0x36, 0x00, 0x64, 0x99, 0x81, 0x75, - 0x6e, 0xf5, 0xea, 0x3a, 0xd7, 0x42, 0x36, 0xf1, 0x29, 0x04, 0x24, 0xd7, 0x78, 0x32, 0x92, 0x1b, - 0x58, 0x04, 0xa7, 0xc2, 0x90, 0x31, 0x3b, 0x1f, 0x31, 0x1f, 0x0d, 0x15, 0xb3, 0xf3, 0x11, 0xf3, - 0xf3, 0x9a, 0xa8, 0x2e, 0xaf, 0x23, 0xbe, 0xc9, 0x3b, 0xa0, 0x87, 0x11, 0xbe, 0x4f, 0x1d, 0x58, - 0x7e, 0xd8, 0xfa, 0x7e, 0x44, 0xf5, 0x30, 0x12, 0x56, 0x20, 0x8b, 0xba, 0x8e, 0xa5, 0x8c, 0x5b, - 0x84, 0x07, 0x2c, 0x47, 0xa8, 0xa2, 0xd8, 0x37, 0x40, 0xdf, 0x8f, 0x48, 0x1d, 0x2a, 0xc3, 0xfe, - 0xa8, 0xbd, 0x24, 0x3e, 0x7a, 0xfd, 0x9d, 0xb6, 0x66, 0x3f, 0xd3, 0xc0, 0xda, 0x4d, 0x13, 0x47, - 0xd8, 0x14, 0x7f, 0x91, 0x52, 0x6f, 0x82, 0xc9, 0x13, 0x27, 0xc6, 0xbc, 0xa8, 0xcb, 0x30, 0x81, - 0xf0, 0x88, 0x93, 0xbb, 0x50, 0x63, 0xee, 0x09, 0xcb, 0xbc, 0xbd, 0xbd, 0x78, 0x4f, 0x2a, 0xc9, - 0x64, 0x0d, 0x0c, 0x3e, 0x39, 0x65, 0x53, 0xa7, 0x53, 0x2d, 0x18, 0x87, 0x88, 0x91, 0x29, 0x8c, - 0x2a, 0x3a, 0xd6, 0xe0, 0x71, 0x18, 0x61, 0x51, 0x5a, 0x53, 0x35, 0x78, 0x1c, 0x46, 0xa2, 0x24, - 0xdd, 0x80, 0xd7, 0xbc, 0x93, 0x20, 0x8c, 0xd9, 0xd8, 0x0b, 0x5c, 0x36, 0x1b, 0x4f, 0xc2, 0xe0, - 0xd8, 0xf7, 0x26, 0x09, 0xca, 0xd2, 0xa4, 0xaf, 0x4a, 0xe2, 0x40, 0xd0, 0xb6, 0x14, 0xc9, 0x7e, - 0x07, 0xac, 0x27, 0xec, 0x02, 0x0b, 0x42, 0x4e, 0x6e, 0x80, 0x7e, 0x76, 0xae, 0x72, 0x9d, 0x21, - 0x6e, 0xf0, 0xe4, 0x29, 0xd5, 0xcf, 0xce, 0x6d, 0x17, 0xcc, 0xa1, 0x4a, 0xf4, 0xe4, 0x5d, 0x11, - 0x12, 0x31, 0xb4, 0x2a, 0xc7, 0xc2, 0xca, 0xbb, 0x54, 0x63, 0xd0, 0x8c, 0x2e, 0x74, 0x89, 0x17, - 0x51, 0x42, 0x91, 0x40, 0xb9, 0xc2, 0xa9, 0xcc, 0x55, 0x38, 0xbf, 0xd0, 0xc1, 0xcc, 0xd3, 0xce, - 0x03, 0xb0, 0xa6, 0x99, 0xec, 0x95, 0x7b, 0x62, 0xe9, 0x9a, 0x2b, 0x84, 0x16, 0x74, 0x75, 0xef, - 0xea, 0xe2, 0xbd, 0x0b, 0xff, 0xae, 0xbd, 0xd4, 0xbf, 0xef, 0xc1, 0xb5, 0x89, 0xcf, 0x9c, 0x60, - 0x5c, 0xb8, 0xa7, 0xb4, 0xc0, 0x65, 0x44, 0x1f, 0xe4, 0x3e, 0xaa, 0x62, 0x54, 0xbd, 0x48, 0x25, - 0x77, 0xa0, 0xe6, 0x32, 0x3f, 0x71, 0xca, 0x9d, 0xc8, 0x7e, 0xec, 0x4c, 0x7c, 0xd6, 0x13, 0x68, - 0x2a, 0xa9, 0x64, 0x0d, 0xcc, 0xac, 0x5a, 0x52, 0xfd, 0x07, 0x16, 0xba, 0x99, 0x60, 0x69, 0x4e, - 0xb5, 0xdf, 0x82, 0xca, 0x93, 0xa7, 0xc3, 0x2b, 0xb5, 0xf1, 0x15, 0xe8, 0x4f, 0x9e, 0x96, 0x63, - 0x65, 0x33, 0x4f, 0x69, 0xa2, 0x03, 0xd5, 0x8b, 0x0e, 0xb4, 0x0b, 0x66, 0xca, 0x59, 0xbc, 0xcb, - 0x12, 0x47, 0x39, 0x6d, 0x0e, 0x8b, 0xd4, 0x26, 0xda, 0x29, 0x2f, 0x0c, 0x54, 0x3a, 0xc9, 0x40, - 0xfb, 0x6f, 0x15, 0xa8, 0x2b, 0xe7, 0x15, 0x7b, 0xa6, 0x79, 0x29, 0x27, 0x3e, 0x8b, 0x28, 0xa0, - 0x97, 0xa3, 0x40, 0xb9, 0xd7, 0xad, 0xbc, 0xbc, 0xd7, 0x25, 0x9f, 0x41, 0x33, 0x92, 0xb4, 0x72, - 0xdc, 0x78, 0xbd, 0xbc, 0x46, 0xfd, 0xe2, 0xba, 0x46, 0x54, 0x00, 0xc2, 0x03, 0xb0, 0x69, 0x48, - 0x9c, 0x13, 0x54, 0x6c, 0x93, 0xd6, 0x05, 0x3c, 0x72, 0x4e, 0xae, 0x88, 0x1e, 0xdf, 0x23, 0x08, - 0x88, 0x92, 0x35, 0x8c, 0x3a, 0x4d, 0x74, 0x6c, 0x11, 0x38, 0xca, 0x3e, 0xdd, 0x9a, 0xf7, 0xe9, - 0x37, 0xc0, 0x9a, 0x84, 0xd3, 0xa9, 0x87, 0xb4, 0x65, 0x99, 0x6c, 0x25, 0x62, 0xc4, 0xed, 0x6f, - 0xa0, 0xae, 0x1e, 0x4b, 0x1a, 0x50, 0xef, 0xf5, 0xb7, 0x37, 0x0f, 0x77, 0x44, 0x54, 0x01, 0x30, - 0x1e, 0x0d, 0xf6, 0x36, 0xe9, 0x4f, 0xda, 0x9a, 0x88, 0x30, 0x83, 0xbd, 0x51, 0x5b, 0x27, 0x16, - 0xd4, 0xb6, 0x77, 0xf6, 0x37, 0x47, 0xed, 0x0a, 0x31, 0xa1, 0xfa, 0x68, 0x7f, 0x7f, 0xa7, 0x5d, - 0x25, 0x4d, 0x30, 0x7b, 0x9b, 0xa3, 0xfe, 0x68, 0xb0, 0xdb, 0x6f, 0xd7, 0x04, 0xef, 0xe3, 0xfe, - 0x7e, 0xdb, 0x10, 0x1f, 0x87, 0x83, 0x5e, 0xbb, 0x2e, 0xe8, 0x07, 0x9b, 0xc3, 0xe1, 0x17, 0xfb, - 0xb4, 0xd7, 0x36, 0xc5, 0xbe, 0xc3, 0x11, 0x1d, 0xec, 0x3d, 0x6e, 0x5b, 0xf6, 0x07, 0xd0, 0x28, - 0x09, 0x4d, 0xac, 0xa0, 0xfd, 0xed, 0xf6, 0x92, 0x38, 0xe6, 0xe9, 0xe6, 0xce, 0x61, 0xbf, 0xad, - 0x91, 0x65, 0x00, 0xfc, 0x1c, 0xef, 0x6c, 0xee, 0x3d, 0x6e, 0xeb, 0xf6, 0xcf, 0xf2, 0x25, 0xd8, - 0x7b, 0xde, 0x03, 0x53, 0x49, 0x3a, 0x2b, 0x79, 0x1b, 0x25, 0x95, 0xd0, 0x9c, 0x28, 0x2c, 0x6b, - 0x72, 0xca, 0x26, 0x67, 0x3c, 0x9d, 0x2a, 0x43, 0xc8, 0x61, 0xd9, 0x46, 0x0a, 0x71, 0x64, 0xfe, - 0x2d, 0xa1, 0x7c, 0x84, 0x52, 0x45, 0x7e, 0x39, 0x42, 0xf9, 0x08, 0xa0, 0x68, 0xda, 0x2f, 0x29, - 0x5a, 0xaf, 0x43, 0xcd, 0xf1, 0x3d, 0x87, 0xab, 0x44, 0x24, 0x01, 0x7b, 0x0f, 0x1a, 0xa5, 0x56, - 0x5f, 0xe8, 0xca, 0xf1, 0xfd, 0xf1, 0x19, 0xbb, 0xe0, 0xb8, 0xd6, 0xa4, 0x75, 0xc7, 0xf7, 0x9f, - 0xb0, 0x0b, 0x4e, 0x6e, 0x43, 0x4d, 0x4e, 0x09, 0xf4, 0x85, 0x66, 0x14, 0x97, 0x52, 0x49, 0xb4, - 0xdf, 0x03, 0x43, 0x76, 0xa8, 0x25, 0x53, 0xd1, 0xae, 0xcc, 0x17, 0x9f, 0xaa, 0x3b, 0x63, 0x3f, - 0x4b, 0x1e, 0xa8, 0x69, 0x04, 0x97, 0xb3, 0x0f, 0xad, 0xa8, 0xa1, 0x24, 0x93, 0x1a, 0x44, 0x20, - 0xb3, 0xdd, 0x03, 0xf3, 0x85, 0xf3, 0x1d, 0x25, 0x00, 0xbd, 0x10, 0xc0, 0x25, 0x13, 0x1f, 0xfb, - 0xa7, 0x00, 0xc5, 0xd4, 0x42, 0x59, 0xae, 0xdc, 0x45, 0x58, 0xee, 0x7d, 0xa1, 0x1a, 0xcf, 0x77, - 0x63, 0x16, 0xcc, 0xbd, 0xba, 0x98, 0x73, 0xe4, 0x74, 0xb2, 0x0a, 0x55, 0x1c, 0xc6, 0x54, 0x8a, - 0x78, 0x94, 0x4f, 0x62, 0x90, 0x62, 0x1f, 0x41, 0x4b, 0xa6, 0x21, 0xca, 0xbe, 0x4e, 0x45, 0x97, - 0xff, 0x82, 0x3c, 0xb8, 0x02, 0x90, 0x47, 0xcf, 0x6c, 0xac, 0x54, 0xc2, 0x08, 0xc3, 0x38, 0xf6, - 0x98, 0xef, 0x66, 0xaf, 0x51, 0x90, 0xfd, 0x31, 0x34, 0xb3, 0x33, 0x54, 0x73, 0x9b, 0x25, 0x43, - 0x29, 0x4d, 0x59, 0xd3, 0x4b, 0x96, 0xbd, 0xd0, 0xcd, 0x73, 0xa1, 0xfd, 0x67, 0x3d, 0x5b, 0xa9, - 0xfa, 0xbc, 0xb9, 0xf2, 0x4a, 0x5b, 0x2c, 0xaf, 0xe6, 0x4b, 0x15, 0xfd, 0x7b, 0x95, 0x2a, 0x9f, - 0x80, 0xe5, 0x62, 0xbe, 0xf6, 0xce, 0xb3, 0xc8, 0xd6, 0x5d, 0xcc, 0xcd, 0x2a, 0xa3, 0x7b, 0xe7, - 0x8c, 0x16, 0xcc, 0xe2, 0x2e, 0x49, 0x78, 0xc6, 0x02, 0xef, 0x1b, 0x6c, 0x64, 0xc5, 0x83, 0x0b, - 0x44, 0x31, 0x15, 0x90, 0x39, 0x5c, 0x4d, 0x05, 0xb2, 0x01, 0x87, 0x51, 0x0c, 0x38, 0x84, 0xd4, - 0xd2, 0x88, 0xb3, 0x38, 0xc9, 0x6a, 0x39, 0x09, 0xe5, 0x35, 0x91, 0xa5, 0x78, 0x9d, 0xe0, 0xc4, - 0xfe, 0x14, 0xac, 0xfc, 0x2e, 0x22, 0xa4, 0xec, 0xed, 0xef, 0xf5, 0x65, 0x00, 0x18, 0xec, 0xf5, - 0xfa, 0x3f, 0x6e, 0x6b, 0x22, 0x28, 0xd1, 0xfe, 0xd3, 0x3e, 0x1d, 0xf6, 0xdb, 0xba, 0x08, 0x1e, - 0xbd, 0xfe, 0x4e, 0x7f, 0xd4, 0x6f, 0x57, 0x3e, 0xaf, 0x9a, 0xf5, 0xb6, 0x49, 0x4d, 0x36, 0x8b, - 0x7c, 0x6f, 0xe2, 0x25, 0xf6, 0x21, 0x98, 0xbb, 0x4e, 0xf4, 0x5c, 0x5d, 0x5e, 0xe4, 0x9a, 0x54, - 0x35, 0xf3, 0x2a, 0x2f, 0xdc, 0x81, 0xba, 0x8a, 0x0e, 0xca, 0x9a, 0xe6, 0x22, 0x47, 0x46, 0xb3, - 0x7f, 0xab, 0xc1, 0xf5, 0xdd, 0xf0, 0x9c, 0xe5, 0x09, 0xf5, 0xc0, 0xb9, 0xf0, 0x43, 0xc7, 0x7d, - 0x89, 0xea, 0xee, 0xc2, 0x35, 0x1e, 0xa6, 0xf1, 0x84, 0x8d, 0x17, 0x06, 0x09, 0x2d, 0x89, 0x7e, - 0xac, 0x4c, 0xd0, 0x86, 0x96, 0xcb, 0x78, 0x52, 0x70, 0x55, 0x90, 0xab, 0x21, 0x90, 0x19, 0x4f, - 0x5e, 0x15, 0x54, 0x5f, 0x56, 0x15, 0xd8, 0xdf, 0x69, 0xd0, 0xea, 0xcf, 0xa2, 0x30, 0x4e, 0xb2, - 0x6b, 0xbe, 0x26, 0x2a, 0xeb, 0xaf, 0x33, 0xe3, 0xaf, 0xd2, 0x5a, 0xcc, 0xbe, 0x1e, 0xbc, 0x70, - 0xc2, 0xf1, 0x10, 0x0c, 0xb1, 0x59, 0xca, 0x95, 0xf9, 0x74, 0xc4, 0x79, 0x73, 0x9b, 0xae, 0x0f, - 0x91, 0x4e, 0x15, 0x5f, 0xb9, 0x42, 0xaa, 0xce, 0x55, 0x48, 0x9f, 0x81, 0x21, 0x59, 0x4b, 0xba, - 0x6d, 0x40, 0x7d, 0x78, 0xb8, 0xb5, 0xd5, 0x1f, 0x0e, 0xdb, 0x1a, 0x69, 0x81, 0xd5, 0x3b, 0x3c, - 0xd8, 0x19, 0x6c, 0x6d, 0x8e, 0x94, 0x7e, 0xb7, 0x37, 0x07, 0x3b, 0xfd, 0x5e, 0xbb, 0x62, 0x6f, - 0x81, 0x35, 0x9a, 0x05, 0x6a, 0x79, 0x39, 0xbb, 0x69, 0x2f, 0xc8, 0x6e, 0xfa, 0x42, 0x76, 0x1b, - 0x42, 0xa3, 0x54, 0xd9, 0x90, 0xb7, 0xa1, 0x9a, 0xcc, 0x82, 0xf9, 0xd9, 0x66, 0x76, 0x06, 0x45, - 0x12, 0x79, 0x1b, 0x9a, 0xa2, 0x6f, 0x72, 0x38, 0xf7, 0x4e, 0x02, 0xe6, 0xaa, 0x1d, 0x45, 0x2f, - 0xb5, 0xa9, 0x50, 0xf6, 0x2d, 0x68, 0x89, 0x46, 0xd5, 0x9b, 0x32, 0x9e, 0x38, 0xd3, 0x08, 0x73, - 0xb1, 0x0a, 0xc0, 0x55, 0xaa, 0x27, 0xdc, 0xbe, 0x0b, 0xcd, 0x03, 0xc6, 0x62, 0xca, 0x78, 0x14, - 0x06, 0x1c, 0x9b, 0x16, 0x25, 0x51, 0x19, 0xed, 0x15, 0x64, 0x7f, 0x05, 0x96, 0xa8, 0x43, 0x1f, - 0x39, 0xc9, 0xe4, 0xf4, 0x87, 0xd4, 0xa9, 0x77, 0xa1, 0x1e, 0x49, 0x4d, 0xa8, 0x4a, 0xb3, 0x89, - 0x01, 0x47, 0x69, 0x87, 0x66, 0x44, 0xfb, 0x23, 0xa8, 0xec, 0xa5, 0xd3, 0xf2, 0xa4, 0xbf, 0x2a, - 0xeb, 0xac, 0xb9, 0x0e, 0x4d, 0x9f, 0xef, 0xd0, 0xec, 0x2f, 0xa1, 0x91, 0x3d, 0x75, 0xe0, 0xe2, - 0xb8, 0x1e, 0x45, 0x3d, 0x70, 0xe7, 0x24, 0x2f, 0x5b, 0x1f, 0x16, 0xb8, 0x83, 0x4c, 0x46, 0x12, - 0x98, 0xdf, 0x5b, 0xb5, 0xf6, 0xf9, 0xde, 0xdb, 0xd0, 0xcc, 0xea, 0x47, 0x2c, 0xea, 0x84, 0xf2, - 0x7c, 0x8f, 0x05, 0x25, 0xc5, 0x9a, 0x12, 0x31, 0xe2, 0x2f, 0xb0, 0x51, 0x7b, 0x1b, 0x5a, 0x8f, - 0x9c, 0xc9, 0x59, 0x1a, 0x95, 0xa2, 0xfc, 0x55, 0x06, 0xd2, 0x05, 0x93, 0x05, 0x6e, 0x14, 0x7a, - 0x41, 0xa2, 0x12, 0x55, 0x0e, 0xdb, 0xbf, 0xd4, 0x60, 0x39, 0xdb, 0x48, 0x29, 0xab, 0x03, 0xf5, - 0xa9, 0x9c, 0xa9, 0x2a, 0xaf, 0xce, 0x40, 0xf2, 0x41, 0xae, 0x46, 0x19, 0x8a, 0x6f, 0x0a, 0x05, - 0xcd, 0xaf, 0x5e, 0xf0, 0x8c, 0xff, 0xc6, 0x01, 0x36, 0x7e, 0xaf, 0x41, 0x55, 0xa8, 0x9f, 0xdc, - 0x86, 0x6a, 0x7f, 0x72, 0x1a, 0x92, 0x39, 0x2d, 0x77, 0xe7, 0x20, 0x7b, 0x89, 0xbc, 0x27, 0x07, - 0xa7, 0xd9, 0x3c, 0xb8, 0x95, 0x59, 0x0f, 0x5a, 0xd7, 0x73, 0xdc, 0xeb, 0xd0, 0xf8, 0x3c, 0xf4, - 0x82, 0x2d, 0x39, 0x4b, 0x24, 0x8b, 0xb6, 0xf6, 0x1c, 0xff, 0xfb, 0x60, 0x0c, 0xb8, 0x30, 0xea, - 0xe7, 0x59, 0xb1, 0xf5, 0x2b, 0xdb, 0xbb, 0xbd, 0xb4, 0xf1, 0x0f, 0x1d, 0xaa, 0x5f, 0xb2, 0x38, - 0x24, 0xef, 0x41, 0x5d, 0x0d, 0x3a, 0x48, 0x69, 0xa0, 0xd1, 0xc5, 0x18, 0xb6, 0x30, 0x01, 0xc1, - 0x5b, 0x19, 0x2a, 0x31, 0x16, 0xd3, 0x97, 0xee, 0x65, 0xf1, 0xce, 0x5e, 0x5a, 0xd3, 0x1e, 0x6a, - 0xe4, 0x01, 0x18, 0xd2, 0xbd, 0x17, 0x64, 0xb3, 0xd8, 0xd2, 0xd8, 0x4b, 0x0f, 0x35, 0x72, 0x0f, - 0x1a, 0xc3, 0xd3, 0x30, 0xf5, 0xdd, 0x21, 0x8b, 0xcf, 0x19, 0x29, 0xcd, 0xfc, 0xba, 0xa5, 0x6f, - 0x7b, 0x89, 0xac, 0x01, 0x48, 0x07, 0x38, 0xf4, 0x5c, 0x4e, 0xea, 0x82, 0xb6, 0x97, 0x4e, 0xe5, - 0xa6, 0x25, 0xcf, 0x90, 0x9c, 0xa5, 0x30, 0xf0, 0x22, 0xce, 0x0f, 0xa1, 0xb5, 0x85, 0x41, 0x69, - 0x3f, 0xde, 0x3c, 0x0a, 0xe3, 0x84, 0x2c, 0xce, 0xfd, 0xba, 0x8b, 0x08, 0x7b, 0x89, 0x3c, 0x04, - 0x73, 0x14, 0x5f, 0x48, 0xfe, 0x57, 0x54, 0xb0, 0x2a, 0xce, 0xbb, 0xe4, 0x95, 0x1b, 0x7f, 0xaa, - 0x80, 0xf1, 0x45, 0x18, 0x9f, 0xb1, 0x98, 0xdc, 0x07, 0x03, 0x7b, 0x4f, 0x65, 0x0a, 0x79, 0x1f, - 0x7a, 0xd9, 0x41, 0xb7, 0xc1, 0x42, 0xa1, 0x8c, 0x1c, 0x7e, 0x26, 0x45, 0x8f, 0x7f, 0xc3, 0x49, - 0xb9, 0xc8, 0x22, 0xc7, 0x5e, 0x22, 0x0f, 0x60, 0x79, 0x98, 0xc4, 0xcc, 0x99, 0xe6, 0xbd, 0xf5, - 0x5c, 0x43, 0xd8, 0xad, 0xcb, 0x9e, 0x6f, 0x88, 0xd2, 0x7e, 0x17, 0xaa, 0x43, 0xf9, 0x4e, 0xc1, - 0x52, 0xfc, 0x51, 0xd1, 0x5d, 0xce, 0x10, 0xf9, 0xbe, 0xff, 0x07, 0x86, 0xac, 0x4e, 0xe4, 0x23, - 0xe7, 0xca, 0xb7, 0x6e, 0xbb, 0x8c, 0x52, 0x0b, 0x6c, 0xa8, 0x1f, 0xa4, 0xf1, 0x09, 0x1b, 0xf1, - 0x05, 0xbd, 0x67, 0x1a, 0xb0, 0x97, 0x84, 0xb3, 0x4a, 0xd7, 0x94, 0x9b, 0xce, 0x45, 0x8b, 0x2e, - 0x79, 0xde, 0x73, 0x51, 0xdc, 0x86, 0x4c, 0x73, 0x72, 0xc9, 0x5c, 0xca, 0xeb, 0x3e, 0x8f, 0x42, - 0xaf, 0x68, 0x53, 0x36, 0x61, 0x5e, 0xa9, 0x3c, 0x20, 0x99, 0x14, 0x16, 0x5d, 0x68, 0x4d, 0x23, - 0x9f, 0x42, 0x6b, 0xae, 0x94, 0x20, 0x98, 0x5a, 0x2f, 0xab, 0x2e, 0x16, 0x17, 0x3f, 0x6a, 0x7f, - 0xf7, 0x6c, 0x45, 0xfb, 0xe3, 0xb3, 0x15, 0xed, 0x2f, 0xcf, 0x56, 0xb4, 0x6f, 0xff, 0xba, 0xb2, - 0x74, 0x64, 0xe0, 0xff, 0xbd, 0x1f, 0xfe, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xac, 0x46, 0x42, - 0x0a, 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_f61bbe108b420f03) } + +var fileDescriptor_pb_f61bbe108b420f03 = []byte{ + // 3127 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x49, 0x73, 0xe3, 0xc6, + 0xd5, 0x02, 0x48, 0x82, 0xc0, 0x23, 0xa9, 0xa1, 0xdb, 0xe3, 0x31, 0x87, 0xb6, 0x35, 0x32, 0x3c, + 0x8b, 0x3c, 0x63, 0xeb, 0x1b, 0xcb, 0xfe, 0xca, 0xcb, 0x4d, 0x23, 0x52, 0x53, 0xf4, 0x68, 0x4b, + 0x93, 0x1a, 0x27, 0x3e, 0x98, 0x05, 0x11, 0x2d, 0x0a, 0x11, 0x08, 0xc0, 0x68, 0x50, 0x45, 0xf9, + 0x90, 0xaa, 0x5c, 0xf2, 0x1b, 0x9c, 0x4b, 0x0e, 0x39, 0x26, 0x7f, 0x20, 0xf9, 0x01, 0xa9, 0xf2, + 0x31, 0xa7, 0x54, 0xe5, 0x96, 0x9a, 0x9c, 0x72, 0x4e, 0xa5, 0x72, 0xc8, 0x25, 0xd5, 0xaf, 0x1b, + 0x0b, 0xa9, 0x65, 0xec, 0xa4, 0x72, 0x22, 0xde, 0xd2, 0xdb, 0xdb, 0xdf, 0x23, 0x98, 0xd1, 0xd1, + 0x7a, 0x14, 0x87, 0x49, 0x48, 0xf4, 0xe8, 0xa8, 0x6d, 0x39, 0x91, 0x27, 0x41, 0xbb, 0x0d, 0xe5, + 0x1d, 0x8f, 0x27, 0x84, 0x40, 0x79, 0xea, 0xb9, 0xbc, 0xa5, 0xad, 0x96, 0xd6, 0x0c, 0x8a, 0xdf, + 0xf6, 0x2e, 0x58, 0x03, 0x87, 0x9f, 0x3e, 0x77, 0xfc, 0x29, 0x23, 0x4d, 0x28, 0x9d, 0x39, 0x7e, + 0x4b, 0x5b, 0xd5, 0xd6, 0xea, 0x54, 0x7c, 0x92, 0x75, 0x30, 0xcf, 0x1c, 0x7f, 0x98, 0x9c, 0x47, + 0xac, 0xa5, 0xaf, 0x6a, 0x6b, 0xcb, 0x1b, 0xaf, 0xae, 0x47, 0x47, 0xeb, 0x07, 0x21, 0x4f, 0xbc, + 0x60, 0xbc, 0xfe, 0xdc, 0xf1, 0x07, 0xe7, 0x11, 0xa3, 0xd5, 0x33, 0xf9, 0x61, 0xef, 0x43, 0xad, + 0x1f, 0x8f, 0xb6, 0xa7, 0xc1, 0x28, 0xf1, 0xc2, 0x40, 0x9c, 0x18, 0x38, 0x13, 0x86, 0x3b, 0x5a, + 0x14, 0xbf, 0x05, 0xce, 0x89, 0xc7, 0xbc, 0x55, 0x5a, 0x2d, 0x09, 0x9c, 0xf8, 0x26, 0x2d, 0xa8, + 0x7a, 0x7c, 0x2b, 0x9c, 0x06, 0x49, 0xab, 0xbc, 0xaa, 0xad, 0x99, 0x34, 0x05, 0xed, 0xbf, 0xeb, + 0x50, 0xf9, 0xd1, 0x94, 0xc5, 0xe7, 0xb8, 0x2e, 0x49, 0xe2, 0x74, 0x2f, 0xf1, 0x4d, 0x6e, 0x42, + 0xc5, 0x77, 0x82, 0x31, 0x6f, 0xe9, 0xb8, 0x99, 0x04, 0xc8, 0x1b, 0x60, 0x39, 0xc7, 0x09, 0x8b, + 0x87, 0x53, 0xcf, 0x6d, 0x95, 0x56, 0xb5, 0x35, 0x83, 0x9a, 0x88, 0x38, 0xf4, 0x5c, 0x72, 0x1b, + 0x4c, 0x37, 0x1c, 0x8e, 0x8a, 0x67, 0xb9, 0x21, 0x9e, 0x45, 0xde, 0x01, 0x73, 0xea, 0xb9, 0x43, + 0xdf, 0xe3, 0x49, 0xab, 0xb2, 0xaa, 0xad, 0xd5, 0x36, 0x4c, 0xf1, 0x58, 0x21, 0x3b, 0x5a, 0x9d, + 0x7a, 0x2e, 0x0a, 0xf1, 0x21, 0x98, 0x3c, 0x1e, 0x0d, 0x8f, 0xa7, 0xc1, 0xa8, 0x65, 0x20, 0xd3, + 0x0d, 0xc1, 0x54, 0x78, 0x35, 0xad, 0x72, 0x09, 0x88, 0x67, 0xc5, 0xec, 0x8c, 0xc5, 0x9c, 0xb5, + 0xaa, 0xf2, 0x28, 0x05, 0x92, 0xc7, 0x50, 0x3b, 0x76, 0x46, 0x2c, 0x19, 0x46, 0x4e, 0xec, 0x4c, + 0x5a, 0x66, 0xbe, 0xd1, 0xb6, 0x40, 0x1f, 0x08, 0x2c, 0xa7, 0x70, 0x9c, 0x01, 0xe4, 0x43, 0x68, + 0x20, 0xc4, 0x87, 0xc7, 0x9e, 0x9f, 0xb0, 0xb8, 0x65, 0xe1, 0x9a, 0x65, 0x5c, 0x83, 0x98, 0x41, + 0xcc, 0x18, 0xad, 0x4b, 0x26, 0x89, 0x21, 0x6f, 0x01, 0xb0, 0x59, 0xe4, 0x04, 0xee, 0xd0, 0xf1, + 0xfd, 0x16, 0xe0, 0x1d, 0x2c, 0x89, 0xd9, 0xf4, 0x7d, 0xf2, 0xba, 0xb8, 0x9f, 0xe3, 0x0e, 0x13, + 0xde, 0x6a, 0xac, 0x6a, 0x6b, 0x65, 0x6a, 0x08, 0x70, 0xc0, 0xed, 0x0d, 0xb0, 0xd0, 0x22, 0xf0, + 0xc5, 0xf7, 0xc0, 0x38, 0x13, 0x80, 0x34, 0x9c, 0xda, 0x46, 0x43, 0x1c, 0x99, 0x19, 0x0d, 0x55, + 0x44, 0x7b, 0x05, 0xcc, 0x1d, 0x27, 0x18, 0xa7, 0x96, 0x26, 0x54, 0x81, 0x0b, 0x2c, 0x8a, 0xdf, + 0xf6, 0xb7, 0x3a, 0x18, 0x94, 0xf1, 0xa9, 0x9f, 0x90, 0x07, 0x00, 0x42, 0xd0, 0x13, 0x27, 0x89, + 0xbd, 0x99, 0xda, 0x35, 0x17, 0xb5, 0x35, 0xf5, 0xdc, 0x5d, 0x24, 0x91, 0xc7, 0x50, 0xc7, 0xdd, + 0x53, 0x56, 0x3d, 0xbf, 0x40, 0x76, 0x3f, 0x5a, 0x43, 0x16, 0xb5, 0xe2, 0x16, 0x18, 0xa8, 0x5b, + 0x69, 0x5f, 0x0d, 0xaa, 0x20, 0x72, 0x0f, 0x96, 0xbd, 0x20, 0x11, 0xb2, 0x1f, 0x25, 0x43, 0x97, + 0xf1, 0x54, 0xf9, 0x8d, 0x0c, 0xdb, 0x61, 0x3c, 0x21, 0x1f, 0x80, 0x14, 0x60, 0x7a, 0x60, 0x05, + 0x0f, 0x5c, 0xce, 0x14, 0xc3, 0xe5, 0x89, 0xc8, 0xa3, 0x4e, 0x7c, 0x1f, 0x6a, 0xe2, 0x7d, 0xe9, + 0x0a, 0x03, 0x57, 0xd4, 0xf1, 0x35, 0x4a, 0x1c, 0x14, 0x04, 0x83, 0x62, 0x17, 0xa2, 0x11, 0x06, + 0x26, 0x0d, 0x02, 0xbf, 0xed, 0x2e, 0x54, 0xf6, 0x63, 0x97, 0xc5, 0x97, 0xda, 0x38, 0x81, 0xb2, + 0xcb, 0xf8, 0x08, 0xdd, 0xcf, 0xa4, 0xf8, 0x9d, 0xdb, 0x7d, 0xa9, 0x60, 0xf7, 0xf6, 0xaf, 0x34, + 0xa8, 0xf5, 0xc3, 0x38, 0xd9, 0x65, 0x9c, 0x3b, 0x63, 0x46, 0xee, 0x40, 0x25, 0x14, 0xdb, 0x2a, + 0x09, 0x5b, 0xe2, 0x4e, 0x78, 0x0e, 0x95, 0xf8, 0x05, 0x3d, 0xe8, 0x57, 0xeb, 0xe1, 0x26, 0x54, + 0xa4, 0xc7, 0x08, 0x6f, 0xaa, 0x50, 0x09, 0x08, 0x59, 0x87, 0xc7, 0xc7, 0x9c, 0x49, 0x59, 0x56, + 0xa8, 0x82, 0xae, 0x36, 0xab, 0xff, 0x07, 0x10, 0xf7, 0xfb, 0x81, 0x56, 0x60, 0x9f, 0x40, 0x8d, + 0x3a, 0xc7, 0xc9, 0x56, 0x18, 0x24, 0x6c, 0x96, 0x90, 0x65, 0xd0, 0x3d, 0x17, 0x45, 0x64, 0x50, + 0xdd, 0x73, 0xc5, 0xe5, 0xc6, 0x71, 0x38, 0x8d, 0x50, 0x42, 0x0d, 0x2a, 0x01, 0x14, 0xa5, 0xeb, + 0xc6, 0x78, 0x63, 0x21, 0x4a, 0xd7, 0x8d, 0xc9, 0x1d, 0xa8, 0xf1, 0xc0, 0x89, 0xf8, 0x49, 0x98, + 0x88, 0xcb, 0x95, 0xf1, 0x72, 0x90, 0xa2, 0x06, 0xdc, 0xfe, 0x83, 0x06, 0xc6, 0x2e, 0x9b, 0x1c, + 0xb1, 0xf8, 0xc2, 0x29, 0xb7, 0xc1, 0xc4, 0x8d, 0x87, 0x9e, 0xab, 0x0e, 0xaa, 0x22, 0xdc, 0x73, + 0x2f, 0x3d, 0xea, 0x16, 0x18, 0x3e, 0x73, 0x84, 0xf0, 0xa5, 0x9d, 0x29, 0x48, 0xc8, 0xc6, 0x99, + 0x0c, 0x5d, 0xe6, 0xb8, 0x18, 0x62, 0x4c, 0x6a, 0x38, 0x93, 0x0e, 0x73, 0x5c, 0x71, 0x37, 0xdf, + 0xe1, 0xc9, 0x70, 0x1a, 0xb9, 0x4e, 0xc2, 0x30, 0xb4, 0x94, 0x85, 0xe1, 0xf0, 0xe4, 0x10, 0x31, + 0xe4, 0x21, 0xbc, 0x32, 0xf2, 0xa7, 0x5c, 0xc4, 0x35, 0x2f, 0x38, 0x0e, 0x87, 0x61, 0xe0, 0x9f, + 0xa3, 0x7c, 0x4d, 0x7a, 0x43, 0x11, 0x7a, 0xc1, 0x71, 0xb8, 0x1f, 0xf8, 0xe7, 0xf6, 0xbf, 0x34, + 0xa8, 0x3c, 0x45, 0x31, 0x3c, 0x86, 0xea, 0x04, 0x1f, 0x94, 0x7a, 0xef, 0x2d, 0x21, 0x61, 0xa4, + 0xad, 0xcb, 0x97, 0xf2, 0x6e, 0x90, 0xc4, 0xe7, 0x34, 0x65, 0x13, 0x2b, 0x12, 0xe7, 0xc8, 0x67, + 0x09, 0x57, 0x16, 0x51, 0x58, 0x31, 0x90, 0x04, 0xb5, 0x42, 0xb1, 0xb5, 0xb7, 0xa1, 0x5e, 0xdc, + 0x4a, 0xa4, 0x91, 0x53, 0x76, 0x8e, 0xb2, 0x2b, 0x53, 0xf1, 0x49, 0x56, 0xa1, 0x82, 0x4e, 0x8a, + 0x92, 0xab, 0x6d, 0x80, 0xd8, 0x51, 0x2e, 0xa1, 0x92, 0xf0, 0x99, 0xfe, 0x89, 0x26, 0xf6, 0x29, + 0x1e, 0x50, 0xdc, 0xc7, 0xba, 0x7a, 0x1f, 0xb9, 0xa4, 0xb0, 0x8f, 0xfd, 0x4f, 0x0d, 0xea, 0x5f, + 0xb2, 0x38, 0x3c, 0x88, 0xc3, 0x28, 0xe4, 0x8e, 0x4f, 0x6c, 0x30, 0xe4, 0xeb, 0x2e, 0x39, 0x5f, + 0x51, 0x04, 0x8f, 0x7c, 0x0f, 0xaa, 0x71, 0x7e, 0x6f, 0x45, 0x21, 0x2b, 0x00, 0x13, 0x67, 0xb6, + 0xc3, 0x1c, 0xce, 0x7a, 0x6e, 0x6a, 0x3e, 0x39, 0x86, 0xb4, 0xc1, 0x9c, 0x38, 0xb3, 0xc1, 0x2c, + 0x18, 0x70, 0xd4, 0x6e, 0x99, 0x66, 0x30, 0x79, 0x13, 0xac, 0x89, 0x33, 0x13, 0x76, 0xdc, 0x73, + 0x95, 0x76, 0x73, 0x04, 0x79, 0x1b, 0x4a, 0xc9, 0x2c, 0xc0, 0xa0, 0x20, 0xf2, 0x80, 0xc8, 0xdd, + 0x83, 0x59, 0xa0, 0x2c, 0x9e, 0x0a, 0x5a, 0x2a, 0x0d, 0x33, 0x97, 0x46, 0x13, 0x4a, 0x23, 0xcf, + 0xc5, 0x44, 0x60, 0x51, 0xf1, 0x69, 0xff, 0xae, 0x04, 0x37, 0x94, 0x2a, 0x4e, 0xbc, 0xa8, 0x9f, + 0x08, 0xbb, 0x69, 0x41, 0x15, 0xdd, 0x95, 0xc5, 0x4a, 0x23, 0x29, 0x48, 0x3e, 0x06, 0x03, 0x4d, + 0x38, 0x55, 0xf4, 0x9d, 0x5c, 0x2c, 0xd9, 0x72, 0xa9, 0x78, 0xa5, 0x71, 0xc5, 0x4e, 0x3e, 0x82, + 0xca, 0x37, 0x2c, 0x0e, 0x65, 0xf8, 0xa9, 0x6d, 0xac, 0x5c, 0xb6, 0x4e, 0x28, 0x40, 0x2d, 0x93, + 0xcc, 0xff, 0x43, 0xe9, 0xdd, 0x15, 0x01, 0x67, 0x12, 0x9e, 0x31, 0xb7, 0x55, 0xc5, 0x1b, 0x15, + 0x15, 0x9c, 0x92, 0x52, 0x71, 0x99, 0x99, 0xb8, 0xda, 0x1d, 0xa8, 0x15, 0x9e, 0x57, 0xb4, 0xb7, + 0x86, 0x94, 0xf0, 0x9d, 0x79, 0x7b, 0xb3, 0x32, 0x4f, 0x28, 0x9a, 0x6d, 0x07, 0x20, 0x7f, 0xec, + 0x7f, 0x6a, 0xfc, 0xf6, 0xcf, 0x35, 0xb8, 0xb1, 0x15, 0x06, 0x01, 0xc3, 0x1a, 0x42, 0xaa, 0x2e, + 0xb7, 0x5b, 0xed, 0x4a, 0xbb, 0x7d, 0x17, 0x2a, 0x5c, 0x30, 0xab, 0xdd, 0x5f, 0xbd, 0x44, 0x17, + 0x54, 0x72, 0x88, 0x10, 0x33, 0x71, 0x66, 0xc3, 0x88, 0x05, 0xae, 0x17, 0x8c, 0xd1, 0xce, 0xa5, + 0x06, 0x0e, 0x24, 0xc6, 0xfe, 0xb5, 0x06, 0x86, 0x34, 0xf9, 0xb9, 0x70, 0xa7, 0xcd, 0x87, 0xbb, + 0x37, 0xc1, 0x8a, 0x62, 0xe6, 0x7a, 0xa3, 0xf4, 0x54, 0x8b, 0xe6, 0x08, 0x11, 0x8d, 0x8f, 0xc3, + 0x78, 0xc4, 0x70, 0x7b, 0x93, 0x4a, 0x40, 0x94, 0x64, 0x98, 0x12, 0x30, 0x68, 0xc9, 0x88, 0x68, + 0x0a, 0x84, 0x88, 0x56, 0x62, 0x09, 0x8f, 0x9c, 0x91, 0x2c, 0x92, 0x4a, 0x54, 0x02, 0x22, 0x82, + 0x4a, 0xcd, 0xa1, 0xc6, 0x4c, 0xaa, 0x20, 0xfb, 0x37, 0x3a, 0xd4, 0x3b, 0x5e, 0xcc, 0x46, 0x09, + 0x73, 0xbb, 0xee, 0x18, 0x19, 0x59, 0x90, 0x78, 0xc9, 0xb9, 0x8a, 0xd6, 0x0a, 0xca, 0x92, 0xa9, + 0x3e, 0x5f, 0x30, 0x4a, 0x5d, 0x94, 0xb0, 0xc6, 0x95, 0x00, 0xd9, 0x00, 0x90, 0x65, 0x06, 0xd6, + 0xb9, 0xe5, 0xab, 0xeb, 0x5c, 0x0b, 0xd9, 0xc4, 0xa7, 0x10, 0x90, 0x5c, 0xe3, 0xc9, 0x48, 0x6e, + 0x60, 0x11, 0x3c, 0x15, 0x86, 0x8c, 0xd9, 0xf9, 0x88, 0xf9, 0x68, 0xa8, 0x98, 0x9d, 0x8f, 0x98, + 0x9f, 0xd5, 0x44, 0x55, 0x79, 0x1d, 0xf1, 0x4d, 0xde, 0x01, 0x3d, 0x8c, 0xf0, 0x7d, 0xea, 0xc0, + 0xe2, 0xc3, 0xd6, 0xf7, 0x23, 0xaa, 0x87, 0x91, 0xb0, 0x02, 0x59, 0xd4, 0xb5, 0x2c, 0x65, 0xdc, + 0x22, 0x3c, 0x60, 0x39, 0x42, 0x15, 0xc5, 0xbe, 0x05, 0xfa, 0x7e, 0x44, 0xaa, 0x50, 0xea, 0x77, + 0x07, 0xcd, 0x25, 0xf1, 0xd1, 0xe9, 0xee, 0x34, 0x35, 0xfb, 0x85, 0x06, 0xd6, 0xee, 0x34, 0x71, + 0x84, 0x4d, 0xf1, 0xeb, 0x94, 0x7a, 0x1b, 0x4c, 0x9e, 0x38, 0x31, 0xe6, 0x45, 0x5d, 0x86, 0x09, + 0x84, 0x07, 0x9c, 0xdc, 0x87, 0x0a, 0x73, 0xc7, 0x2c, 0xf5, 0xf6, 0xe6, 0xe2, 0x3d, 0xa9, 0x24, + 0x93, 0x35, 0x30, 0xf8, 0xe8, 0x84, 0x4d, 0x9c, 0x56, 0x39, 0x67, 0xec, 0x23, 0x46, 0xa6, 0x30, + 0xaa, 0xe8, 0x58, 0x83, 0xc7, 0x61, 0x84, 0x45, 0x69, 0x45, 0xd5, 0xe0, 0x71, 0x18, 0x89, 0x92, + 0x74, 0x03, 0x5e, 0xf3, 0xc6, 0x41, 0x18, 0xb3, 0xa1, 0x17, 0xb8, 0x6c, 0x36, 0x1c, 0x85, 0xc1, + 0xb1, 0xef, 0x8d, 0x12, 0x94, 0xa5, 0x49, 0x5f, 0x95, 0xc4, 0x9e, 0xa0, 0x6d, 0x29, 0x92, 0xfd, + 0x0e, 0x58, 0xcf, 0xd8, 0x39, 0x16, 0x84, 0x9c, 0xdc, 0x02, 0xfd, 0xf4, 0x4c, 0xe5, 0x3a, 0x43, + 0xdc, 0xe0, 0xd9, 0x73, 0xaa, 0x9f, 0x9e, 0xd9, 0x2e, 0x98, 0x7d, 0x95, 0xe8, 0xc9, 0xbb, 0x22, + 0x24, 0x62, 0x68, 0x55, 0x8e, 0x85, 0x95, 0x77, 0xa1, 0xc6, 0xa0, 0x29, 0x5d, 0xe8, 0x12, 0x2f, + 0xa2, 0x84, 0x22, 0x81, 0x62, 0x85, 0x53, 0x9a, 0xab, 0x70, 0x7e, 0xa1, 0x83, 0x99, 0xa5, 0x9d, + 0x47, 0x60, 0x4d, 0x52, 0xd9, 0x2b, 0xf7, 0xc4, 0xd2, 0x35, 0x53, 0x08, 0xcd, 0xe9, 0xea, 0xde, + 0xe5, 0xc5, 0x7b, 0xe7, 0xfe, 0x5d, 0x79, 0xa9, 0x7f, 0x3f, 0x80, 0x1b, 0x23, 0x9f, 0x39, 0xc1, + 0x30, 0x77, 0x4f, 0x69, 0x81, 0xcb, 0x88, 0x3e, 0xc8, 0x7c, 0x54, 0xc5, 0xa8, 0x6a, 0x9e, 0x4a, + 0xee, 0x41, 0xc5, 0x65, 0x7e, 0xe2, 0x14, 0x3b, 0x91, 0xfd, 0xd8, 0x19, 0xf9, 0xac, 0x23, 0xd0, + 0x54, 0x52, 0xc9, 0x1a, 0x98, 0x69, 0xb5, 0xa4, 0xfa, 0x0f, 0x2c, 0x74, 0x53, 0xc1, 0xd2, 0x8c, + 0x6a, 0xbf, 0x05, 0xa5, 0x67, 0xcf, 0xfb, 0x57, 0x6a, 0xe3, 0x2b, 0xd0, 0x9f, 0x3d, 0x2f, 0xc6, + 0xca, 0x7a, 0x96, 0xd2, 0x44, 0x07, 0xaa, 0xe7, 0x1d, 0x68, 0x1b, 0xcc, 0x29, 0x67, 0xf1, 0x2e, + 0x4b, 0x1c, 0xe5, 0xb4, 0x19, 0x2c, 0x52, 0x9b, 0x68, 0xa7, 0xbc, 0x30, 0x50, 0xe9, 0x24, 0x05, + 0xed, 0xbf, 0x95, 0xa0, 0xaa, 0x9c, 0x57, 0xec, 0x39, 0xcd, 0x4a, 0x39, 0xf1, 0x99, 0x47, 0x01, + 0xbd, 0x18, 0x05, 0x8a, 0xbd, 0x6e, 0xe9, 0xe5, 0xbd, 0x2e, 0xf9, 0x0c, 0xea, 0x91, 0xa4, 0x15, + 0xe3, 0xc6, 0xeb, 0xc5, 0x35, 0xea, 0x17, 0xd7, 0xd5, 0xa2, 0x1c, 0x10, 0x1e, 0x80, 0x4d, 0x43, + 0xe2, 0x8c, 0x51, 0xb1, 0x75, 0x5a, 0x15, 0xf0, 0xc0, 0x19, 0x5f, 0x11, 0x3d, 0xbe, 0x47, 0x10, + 0x10, 0x25, 0x6b, 0x18, 0xb5, 0xea, 0xe8, 0xd8, 0x22, 0x70, 0x14, 0x7d, 0xba, 0x31, 0xef, 0xd3, + 0x6f, 0x80, 0x35, 0x0a, 0x27, 0x13, 0x0f, 0x69, 0xcb, 0x32, 0xd9, 0x4a, 0xc4, 0x80, 0xdb, 0xdf, + 0x40, 0x55, 0x3d, 0x96, 0xd4, 0xa0, 0xda, 0xe9, 0x6e, 0x6f, 0x1e, 0xee, 0x88, 0xa8, 0x02, 0x60, + 0x3c, 0xe9, 0xed, 0x6d, 0xd2, 0x9f, 0x34, 0x35, 0x11, 0x61, 0x7a, 0x7b, 0x83, 0xa6, 0x4e, 0x2c, + 0xa8, 0x6c, 0xef, 0xec, 0x6f, 0x0e, 0x9a, 0x25, 0x62, 0x42, 0xf9, 0xc9, 0xfe, 0xfe, 0x4e, 0xb3, + 0x4c, 0xea, 0x60, 0x76, 0x36, 0x07, 0xdd, 0x41, 0x6f, 0xb7, 0xdb, 0xac, 0x08, 0xde, 0xa7, 0xdd, + 0xfd, 0xa6, 0x21, 0x3e, 0x0e, 0x7b, 0x9d, 0x66, 0x55, 0xd0, 0x0f, 0x36, 0xfb, 0xfd, 0x2f, 0xf6, + 0x69, 0xa7, 0x69, 0x8a, 0x7d, 0xfb, 0x03, 0xda, 0xdb, 0x7b, 0xda, 0xb4, 0xec, 0x0f, 0xa0, 0x56, + 0x10, 0x9a, 0x58, 0x41, 0xbb, 0xdb, 0xcd, 0x25, 0x71, 0xcc, 0xf3, 0xcd, 0x9d, 0xc3, 0x6e, 0x53, + 0x23, 0xcb, 0x00, 0xf8, 0x39, 0xdc, 0xd9, 0xdc, 0x7b, 0xda, 0xd4, 0xed, 0x9f, 0x65, 0x4b, 0xb0, + 0xf7, 0x7c, 0x00, 0xa6, 0x92, 0x74, 0x5a, 0xf2, 0xd6, 0x0a, 0x2a, 0xa1, 0x19, 0x51, 0x58, 0xd6, + 0xe8, 0x84, 0x8d, 0x4e, 0xf9, 0x74, 0xa2, 0x0c, 0x21, 0x83, 0x65, 0x1b, 0x29, 0xc4, 0x91, 0xfa, + 0xb7, 0x84, 0xb2, 0x11, 0x4a, 0x19, 0xf9, 0xe5, 0x08, 0xe5, 0x23, 0x80, 0xbc, 0x69, 0xbf, 0xa4, + 0x68, 0xbd, 0x09, 0x15, 0xc7, 0xf7, 0x1c, 0xae, 0x12, 0x91, 0x04, 0xec, 0x3d, 0xa8, 0x15, 0x5a, + 0x7d, 0xa1, 0x2b, 0xc7, 0xf7, 0x87, 0xa7, 0xec, 0x9c, 0xe3, 0x5a, 0x93, 0x56, 0x1d, 0xdf, 0x7f, + 0xc6, 0xce, 0x39, 0xb9, 0x0b, 0x15, 0x39, 0x25, 0xd0, 0x17, 0x9a, 0x51, 0x5c, 0x4a, 0x25, 0xd1, + 0x7e, 0x0f, 0x0c, 0xd9, 0xa1, 0x16, 0x4c, 0x45, 0xbb, 0x32, 0x5f, 0x7c, 0xaa, 0xee, 0x8c, 0xfd, + 0x2c, 0x79, 0xa4, 0xa6, 0x11, 0x5c, 0xce, 0x3e, 0xb4, 0xbc, 0x86, 0x92, 0x4c, 0x6a, 0x10, 0x81, + 0xcc, 0x76, 0x07, 0xcc, 0x6b, 0xe7, 0x3b, 0x4a, 0x00, 0x7a, 0x2e, 0x80, 0x4b, 0x26, 0x3e, 0xf6, + 0x4f, 0x01, 0xf2, 0xa9, 0x85, 0xb2, 0x5c, 0xb9, 0x8b, 0xb0, 0xdc, 0x87, 0x42, 0x35, 0x9e, 0xef, + 0xc6, 0x2c, 0x98, 0x7b, 0x75, 0x3e, 0xe7, 0xc8, 0xe8, 0x64, 0x15, 0xca, 0x38, 0x8c, 0x29, 0xe5, + 0xf1, 0x28, 0x9b, 0xc4, 0x20, 0xc5, 0x3e, 0x82, 0x86, 0x4c, 0x43, 0x94, 0x7d, 0x3d, 0x15, 0x5d, + 0xfe, 0x35, 0x79, 0x70, 0x05, 0x20, 0x8b, 0x9e, 0xe9, 0x58, 0xa9, 0x80, 0x11, 0x86, 0x71, 0xec, + 0x31, 0xdf, 0x4d, 0x5f, 0xa3, 0x20, 0xfb, 0x63, 0xa8, 0xa7, 0x67, 0xa8, 0xe6, 0x36, 0x4d, 0x86, + 0x52, 0x9a, 0xb2, 0xa6, 0x97, 0x2c, 0x7b, 0xa1, 0x9b, 0xe5, 0x42, 0xfb, 0xcf, 0x7a, 0xba, 0x52, + 0xf5, 0x79, 0x73, 0xe5, 0x95, 0xb6, 0x58, 0x5e, 0xcd, 0x97, 0x2a, 0xfa, 0xf7, 0x2a, 0x55, 0x3e, + 0x01, 0xcb, 0xc5, 0x7c, 0xed, 0x9d, 0xa5, 0x91, 0xad, 0xbd, 0x98, 0x9b, 0x55, 0x46, 0xf7, 0xce, + 0x18, 0xcd, 0x99, 0xc5, 0x5d, 0x92, 0xf0, 0x94, 0x05, 0xde, 0x37, 0xd8, 0xc8, 0x8a, 0x07, 0xe7, + 0x88, 0x7c, 0x2a, 0x20, 0x73, 0xb8, 0x9a, 0x0a, 0xa4, 0x03, 0x0e, 0x23, 0x1f, 0x70, 0x08, 0xa9, + 0x4d, 0x23, 0xce, 0xe2, 0x24, 0xad, 0xe5, 0x24, 0x94, 0xd5, 0x44, 0x96, 0xe2, 0x75, 0x82, 0xb1, + 0xfd, 0x29, 0x58, 0xd9, 0x5d, 0x44, 0x48, 0xd9, 0xdb, 0xdf, 0xeb, 0xca, 0x00, 0xd0, 0xdb, 0xeb, + 0x74, 0x7f, 0xdc, 0xd4, 0x44, 0x50, 0xa2, 0xdd, 0xe7, 0x5d, 0xda, 0xef, 0x36, 0x75, 0x11, 0x3c, + 0x3a, 0xdd, 0x9d, 0xee, 0xa0, 0xdb, 0x2c, 0x7d, 0x5e, 0x36, 0xab, 0x4d, 0x93, 0x9a, 0x6c, 0x16, + 0xf9, 0xde, 0xc8, 0x4b, 0xec, 0x43, 0x30, 0x77, 0x9d, 0xe8, 0x42, 0x5d, 0x9e, 0xe7, 0x9a, 0xa9, + 0x6a, 0xe6, 0x55, 0x5e, 0xb8, 0x07, 0x55, 0x15, 0x1d, 0x94, 0x35, 0xcd, 0x45, 0x8e, 0x94, 0x66, + 0xff, 0x56, 0x83, 0x9b, 0xbb, 0xe1, 0x19, 0xcb, 0x12, 0xea, 0x81, 0x73, 0xee, 0x87, 0x8e, 0xfb, + 0x12, 0xd5, 0xdd, 0x87, 0x1b, 0x3c, 0x9c, 0xc6, 0x23, 0x36, 0x5c, 0x18, 0x24, 0x34, 0x24, 0xfa, + 0xa9, 0x32, 0x41, 0x1b, 0x1a, 0x2e, 0xe3, 0x49, 0xce, 0x55, 0x42, 0xae, 0x9a, 0x40, 0xa6, 0x3c, + 0x59, 0x55, 0x50, 0x7e, 0x59, 0x55, 0x60, 0x7f, 0xa7, 0x41, 0xa3, 0x3b, 0x8b, 0xc2, 0x38, 0x49, + 0xaf, 0xf9, 0x9a, 0xa8, 0xac, 0xbf, 0x4e, 0x8d, 0xbf, 0x4c, 0x2b, 0x31, 0xfb, 0xba, 0x77, 0xed, + 0x84, 0xe3, 0x31, 0x18, 0x62, 0xb3, 0x29, 0x57, 0xe6, 0xd3, 0x12, 0xe7, 0xcd, 0x6d, 0xba, 0xde, + 0x47, 0x3a, 0x55, 0x7c, 0xc5, 0x0a, 0xa9, 0x3c, 0x57, 0x21, 0x7d, 0x06, 0x86, 0x64, 0x2d, 0xe8, + 0xb6, 0x06, 0xd5, 0xfe, 0xe1, 0xd6, 0x56, 0xb7, 0xdf, 0x6f, 0x6a, 0xa4, 0x01, 0x56, 0xe7, 0xf0, + 0x60, 0xa7, 0xb7, 0xb5, 0x39, 0x50, 0xfa, 0xdd, 0xde, 0xec, 0xed, 0x74, 0x3b, 0xcd, 0x92, 0xbd, + 0x05, 0xd6, 0x60, 0x16, 0xa8, 0xe5, 0xc5, 0xec, 0xa6, 0x5d, 0x93, 0xdd, 0xf4, 0x85, 0xec, 0xd6, + 0x87, 0x5a, 0xa1, 0xb2, 0x21, 0x6f, 0x43, 0x39, 0x99, 0x05, 0xf3, 0xb3, 0xcd, 0xf4, 0x0c, 0x8a, + 0x24, 0xf2, 0x36, 0xd4, 0x45, 0xdf, 0xe4, 0x70, 0xee, 0x8d, 0x03, 0xe6, 0xaa, 0x1d, 0x45, 0x2f, + 0xb5, 0xa9, 0x50, 0xf6, 0x1d, 0x68, 0x88, 0x46, 0xd5, 0x9b, 0x30, 0x9e, 0x38, 0x93, 0x08, 0x73, + 0xb1, 0x0a, 0xc0, 0x65, 0xaa, 0x27, 0xdc, 0xbe, 0x0f, 0xf5, 0x03, 0xc6, 0x62, 0xca, 0x78, 0x14, + 0x06, 0x1c, 0x9b, 0x16, 0x25, 0x51, 0x19, 0xed, 0x15, 0x64, 0x7f, 0x05, 0x96, 0xa8, 0x43, 0x9f, + 0x38, 0xc9, 0xe8, 0xe4, 0x87, 0xd4, 0xa9, 0xf7, 0xa1, 0x1a, 0x49, 0x4d, 0xa8, 0x4a, 0xb3, 0x8e, + 0x01, 0x47, 0x69, 0x87, 0xa6, 0x44, 0xfb, 0x23, 0x28, 0xed, 0x4d, 0x27, 0xc5, 0x49, 0x7f, 0x59, + 0xd6, 0x59, 0x73, 0x1d, 0x9a, 0x3e, 0xdf, 0xa1, 0xd9, 0x5f, 0x42, 0x2d, 0x7d, 0x6a, 0xcf, 0xc5, + 0x71, 0x3d, 0x8a, 0xba, 0xe7, 0xce, 0x49, 0x5e, 0xb6, 0x3e, 0x2c, 0x70, 0x7b, 0xa9, 0x8c, 0x24, + 0x30, 0xbf, 0xb7, 0x6a, 0xed, 0xb3, 0xbd, 0xb7, 0xa1, 0x9e, 0xd6, 0x8f, 0x58, 0xd4, 0x09, 0xe5, + 0xf9, 0x1e, 0x0b, 0x0a, 0x8a, 0x35, 0x25, 0x62, 0xc0, 0xaf, 0xb1, 0x51, 0xdb, 0x81, 0xc6, 0x13, + 0x67, 0x74, 0x3a, 0x8d, 0x0a, 0x51, 0xfe, 0x2a, 0x03, 0xb9, 0xc6, 0xd4, 0xdb, 0x60, 0xb2, 0xc0, + 0x8d, 0x42, 0x4f, 0x4d, 0x3b, 0x2d, 0x9a, 0xc1, 0xf6, 0x2f, 0x35, 0x58, 0x4e, 0xcf, 0x50, 0x7a, + 0x6c, 0x41, 0x75, 0x22, 0xc7, 0xad, 0xca, 0xe1, 0x53, 0x90, 0x7c, 0x90, 0x69, 0x58, 0x46, 0xe9, + 0xdb, 0x42, 0x77, 0xf3, 0xab, 0x17, 0x9c, 0xe6, 0xbf, 0xf1, 0x8d, 0x8d, 0xdf, 0x6b, 0x50, 0x16, + 0x96, 0x41, 0xee, 0x42, 0xb9, 0x3b, 0x3a, 0x09, 0xc9, 0x9c, 0x01, 0xb4, 0xe7, 0x20, 0x7b, 0x89, + 0xbc, 0x27, 0x67, 0xaa, 0xe9, 0xa8, 0xb8, 0x91, 0x1a, 0x16, 0x1a, 0xde, 0x05, 0xee, 0x75, 0xa8, + 0x7d, 0x1e, 0x7a, 0xc1, 0x96, 0x1c, 0x33, 0x92, 0x45, 0x33, 0xbc, 0xc0, 0xff, 0x3e, 0x18, 0x3d, + 0x2e, 0xec, 0xfd, 0x22, 0x2b, 0x76, 0x85, 0x45, 0x57, 0xb0, 0x97, 0x36, 0xfe, 0xa1, 0x43, 0xf9, + 0x4b, 0x16, 0x87, 0xe4, 0x3d, 0xa8, 0xaa, 0x19, 0x08, 0x29, 0xcc, 0x3a, 0xda, 0x18, 0xde, 0x16, + 0x86, 0x23, 0x78, 0x2b, 0x43, 0xe5, 0xcc, 0x7c, 0x30, 0xd3, 0xbe, 0x2c, 0x14, 0xda, 0x4b, 0x6b, + 0xda, 0x63, 0x8d, 0x3c, 0x02, 0x43, 0x7a, 0xfe, 0x82, 0x6c, 0x16, 0xbb, 0x1d, 0x7b, 0xe9, 0xb1, + 0x46, 0x1e, 0x40, 0xad, 0x7f, 0x12, 0x4e, 0x7d, 0xb7, 0xcf, 0xe2, 0x33, 0x46, 0x0a, 0xe3, 0xc0, + 0x76, 0xe1, 0xdb, 0x5e, 0x22, 0x6b, 0x00, 0xd2, 0x37, 0x0e, 0x3d, 0x97, 0x93, 0xaa, 0xa0, 0xed, + 0x4d, 0x27, 0x72, 0xd3, 0x82, 0xd3, 0x48, 0xce, 0x42, 0x84, 0xb8, 0x8e, 0xf3, 0x43, 0x68, 0x6c, + 0x61, 0xbc, 0xda, 0x8f, 0x37, 0x8f, 0xc2, 0x38, 0x21, 0x8b, 0x23, 0xc1, 0xf6, 0x22, 0xc2, 0x5e, + 0x22, 0x8f, 0xc1, 0x1c, 0xc4, 0xe7, 0x92, 0xff, 0x15, 0x15, 0xc7, 0xf2, 0xf3, 0x2e, 0x79, 0xe5, + 0xc6, 0x9f, 0x4a, 0x60, 0x7c, 0x11, 0xc6, 0xa7, 0x2c, 0x26, 0x0f, 0xc1, 0xc0, 0xb6, 0x54, 0x99, + 0x42, 0xd6, 0xa2, 0x5e, 0x76, 0xd0, 0x5d, 0xb0, 0x50, 0x28, 0x03, 0x87, 0x9f, 0x4a, 0xd1, 0xe3, + 0x3f, 0x74, 0x52, 0x2e, 0xb2, 0xfe, 0xb1, 0x97, 0xc8, 0x23, 0x58, 0xee, 0x27, 0x31, 0x73, 0x26, + 0x59, 0xdb, 0x3d, 0xd7, 0x2b, 0xb6, 0xab, 0xb2, 0x1d, 0xec, 0xa3, 0xb4, 0xdf, 0x85, 0x72, 0x5f, + 0xbe, 0x53, 0xb0, 0xe4, 0xff, 0x61, 0xb4, 0x97, 0x53, 0x44, 0xb6, 0xef, 0xff, 0x81, 0x21, 0x0b, + 0x17, 0xf9, 0xc8, 0xb9, 0xca, 0xae, 0xdd, 0x2c, 0xa2, 0xd4, 0x02, 0x1b, 0xaa, 0x07, 0xd3, 0x78, + 0xcc, 0x06, 0x7c, 0x41, 0xef, 0xa9, 0x06, 0xec, 0x25, 0xe1, 0xac, 0xd2, 0x35, 0xe5, 0xa6, 0x73, + 0x81, 0xa4, 0x4d, 0x2e, 0x7a, 0x2e, 0x8a, 0xdb, 0x90, 0x19, 0x50, 0x2e, 0x99, 0xcb, 0x86, 0xed, + 0x8b, 0x28, 0xf4, 0x8a, 0x26, 0x65, 0x23, 0xe6, 0x15, 0x2a, 0x07, 0x92, 0x4a, 0x61, 0xd1, 0x85, + 0xd6, 0x34, 0xf2, 0x29, 0x34, 0xe6, 0xaa, 0x0c, 0x82, 0x59, 0xf7, 0xb2, 0xc2, 0x63, 0x71, 0xf1, + 0x93, 0xe6, 0x77, 0x2f, 0x56, 0xb4, 0x3f, 0xbe, 0x58, 0xd1, 0xfe, 0xf2, 0x62, 0x45, 0xfb, 0xf6, + 0xaf, 0x2b, 0x4b, 0x47, 0x06, 0xfe, 0x15, 0xfc, 0xe1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x95, + 0x81, 0xd3, 0xe2, 0x25, 0x1e, 0x00, 0x00, } diff --git a/worker/backup.go b/worker/backup.go index a909e8e5b8d..2f939a42bab 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -17,34 +17,102 @@ package worker import ( + "fmt" + "time" + "github.com/dgraph-io/dgraph/ee/backup" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" "golang.org/x/net/context" ) -// Backup handles a request coming from another node. -func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { - var resp pb.BackupResponse - bw := &backup.Worker{ - ReadTs: req.StartTs, - DB: pstore, +func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupResponse, error) { + resp := &pb.BackupResponse{Status: pb.BackupResponse_FAILED} + if err := ctx.Err(); err != nil { + glog.Errorf("Context error during backup: %v\n", err) + resp.Message = err.Error() + return resp, err } - if err := bw.Process(ctx); err != nil { - resp.Status = pb.BackupResponse_FAILED - return &resp, err + // sanity, make sure this is our group. + if groups().groupId() != in.GroupId { + err := x.Errorf("Backup request group mismatch. Mine: %d. Requested: %d\n", + groups().groupId(), in.GroupId) + resp.Message = err.Error() + return resp, err + } + glog.Infof("Export requested at %d.", in.StartTs) + + // wait for this node to catch-up. + if err := posting.Oracle().WaitForTs(ctx, in.StartTs); err != nil { + resp.Message = err.Error() + return resp, err + } + glog.Infof("Running export for group %d at timestamp %d.", in.GroupId, in.StartTs) + + // process this request + w := &backup.Worker{ + ReadTs: in.StartTs, + GroupId: in.GroupId, + SeqTs: fmt.Sprint(time.Now().UTC().UnixNano()), + DB: pstore, + } + if err := w.Process(ctx); err != nil { + resp.Message = err.Error() + return resp, err } resp.Status = pb.BackupResponse_SUCCESS - return &resp, nil + return resp, nil +} + +// Backup handles a request coming from another node. +func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { + glog.Infof("Received backup request via Grpc: %+v\n", req) + return backupProcess(ctx, req) +} + +// TODO: add stop to all goroutines to cancel on failure. +func backupDispatch(ctx context.Context, readTs uint64, gids ...uint32) chan *pb.BackupResponse { + out := make(chan *pb.BackupResponse) + go func() { + glog.Infof("Dispatching backup requests...") + for _, gid := range gids { + in := &pb.BackupRequest{StartTs: readTs, GroupId: gid} + // this node is part of the group, process backup. + if groups().groupId() == gid { + resp, err := backupProcess(ctx, in) + if err != nil { + glog.Errorf("Error while running backup: %v", err) + } + out <- resp + continue + } + // send request to any node in the group. + pl := groups().AnyServer(gid) + c := pb.NewWorkerClient(pl.Get()) + resp, err := c.Backup(ctx, in) + if err != nil { + glog.Errorf("Backup error received from group: %d. Error: %v\n", gid, err) + } + out <- resp + } + close(out) + }() + return out } // BackupOverNetwork handles a request coming from an HTTP client. func BackupOverNetwork(ctx context.Context) error { + // Check that this node can accept requests. + if err := x.HealthCheck(); err != nil { + glog.Errorf("Backup canceled, not ready to accept requests: %v\n", err) + return err + } // Get ReadTs from zero and wait for stream to catch up. ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) if err != nil { - glog.Errorf("Unable to retrieve readonly ts for export: %v\n", err) + glog.Errorf("Unable to retrieve readonly ts for backup: %v\n", err) return err } readTs := ts.ReadOnly @@ -53,7 +121,14 @@ func BackupOverNetwork(ctx context.Context) error { // Let's first collect all groups. gids := groups().KnownGroups() - glog.Infof("Requesting export for groups: %v\n", gids) + glog.Infof("Requesting backup for groups: %v\n", gids) + // This will dispatch the request to all groups and wait for their response. + // If we receive any failures, we cancel the process. + for resp := range backupDispatch(ctx, readTs, gids...) { + if resp.Status == pb.BackupResponse_FAILED { + return x.Errorf("Backup error: %s", resp.Message) + } + } return nil } diff --git a/worker/stream/stream.go b/worker/stream/stream.go index 6ffb69bc13b..dc8fb423c21 100644 --- a/worker/stream/stream.go +++ b/worker/stream/stream.go @@ -35,12 +35,12 @@ const ( MB = 1 << 20 ) -type KVStream interface { +type kvStream interface { Send(*pb.KVS) error } type Lists struct { - Stream KVStream + Stream kvStream Predicate string DB *badger.DB ChooseKeyFunc func(item *badger.Item) bool From b5cfb777547677585caa039ec37e1b0480e4ee53 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 30 Oct 2018 15:45:11 -0700 Subject: [PATCH 07/25] added destination parameter. handler support to destination URI scheme. additional logging. --- dgraph/cmd/alpha/admin.go | 22 +- ee/backup/backup.go | 28 +- ee/backup/handler.go | 32 ++- ee/backup/writer.go | 67 +++-- ee/backup/writer_local.go | 29 +-- protos/pb.proto | 2 +- protos/pb/pb.pb.go | 526 +++++++++++++++++++------------------- worker/backup.go | 26 +- 8 files changed, 405 insertions(+), 327 deletions(-) diff --git a/dgraph/cmd/alpha/admin.go b/dgraph/cmd/alpha/admin.go index c8d703397ee..7104649966f 100644 --- a/dgraph/cmd/alpha/admin.go +++ b/dgraph/cmd/alpha/admin.go @@ -32,8 +32,8 @@ import ( ) // handlerInit does some standard checks. Returns false if something is wrong. -func handlerInit(w http.ResponseWriter, r *http.Request) bool { - if r.Method != http.MethodGet { +func handlerInit(w http.ResponseWriter, r *http.Request, method string) bool { + if r.Method != method { x.SetStatus(w, x.ErrorInvalidMethod, "Invalid method") return false } @@ -47,7 +47,7 @@ func handlerInit(w http.ResponseWriter, r *http.Request) bool { } func shutDownHandler(w http.ResponseWriter, r *http.Request) { - if !handlerInit(w, r) { + if !handlerInit(w, r, http.MethodGet) { return } @@ -57,12 +57,11 @@ func shutDownHandler(w http.ResponseWriter, r *http.Request) { } func exportHandler(w http.ResponseWriter, r *http.Request) { - if !handlerInit(w, r) { + if !handlerInit(w, r, http.MethodGet) { return } - ctx := context.Background() // Export logic can be moved to dgraphzero. - if err := worker.ExportOverNetwork(ctx); err != nil { + if err := worker.ExportOverNetwork(context.Background()); err != nil { x.SetStatus(w, err.Error(), "Export failed.") return } @@ -71,11 +70,16 @@ func exportHandler(w http.ResponseWriter, r *http.Request) { } func backupHandler(w http.ResponseWriter, r *http.Request) { - if !handlerInit(w, r) { + if !handlerInit(w, r, http.MethodPost) { return } - err := worker.BackupOverNetwork(context.Background()) - if err != nil { + target := r.FormValue("destination") + if target == "" { + err := x.Errorf("You must specify a 'destination' value") + x.SetStatus(w, err.Error(), "Backup failed.") + return + } + if err := worker.BackupOverNetwork(context.Background(), target); err != nil { x.SetStatus(w, err.Error(), "Backup failed.") return } diff --git a/ee/backup/backup.go b/ee/backup/backup.go index c0ef2a8c6dc..8f51984df14 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -7,7 +7,6 @@ package backup import ( "context" - "math" "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/protos/pb" @@ -15,17 +14,23 @@ import ( "github.com/golang/glog" ) +// Worker has all the information needed to perform a backup. type Worker struct { - ReadTs uint64 - GroupId uint32 - SeqTs string - DB *badger.DB + ReadTs uint64 // Timestamp to read at. + GroupId uint32 // The group ID of this node. + SeqTs string // Sequence data to label backup at the target. + TargetURI string // The intended location as URI. + DB *badger.DB // Badger pstore managed by this node. } +// Process uses the worker values to create a stream writer then hand off the data +// retrieval to stream.Orchestrate. The writer will create all the fd's needed to +// collect the data and later move to the target. +// Returns errors on failure, nil on success. func (w *Worker) Process(ctx context.Context) error { - c, err := w.newWriter() + glog.Infof("Backup process beginning ...") + c, err := newWriter(w) if err != nil { - glog.Errorf("Backup error while creating writer: %s\n", err) return err } sl := stream.Lists{Stream: c, DB: w.DB} @@ -40,8 +45,15 @@ func (w *Worker) Process(ctx context.Context) error { return kv, nil } - if err := sl.Orchestrate(ctx, "Backup", math.MaxUint64); err != nil { + if err = sl.Orchestrate(ctx, "Backup", w.ReadTs); err != nil { return err } + + glog.Infof("Backup saving ...") + if err = c.save(); err != nil { + return err + } + + glog.Infof("Backup done.") return nil } diff --git a/ee/backup/handler.go b/ee/backup/handler.go index 4fecfbede09..6305b0fdd6b 100644 --- a/ee/backup/handler.go +++ b/ee/backup/handler.go @@ -7,6 +7,7 @@ package backup import ( "net/url" + "sync" "github.com/dgraph-io/dgraph/x" ) @@ -14,25 +15,35 @@ import ( // handler interface is implemented by uri scheme handlers. // // Session() will read any supported environment variables and authenticate if needed. -// Copy() copies a local file (from tmpDir) to a new destination, possibly remote. -// Exists() tests if a file exists. +// Copy() copies a local file to a new destination, possibly remote. +// Exists() tests if a file exists at destination. type handler interface { Copy(string, string) error Session(string, string) error } // handlers map uri scheme to a handler -var handlers = make(map[string]handler, 0) +var handlers struct { + sync.Mutex + m map[string]handler +} -func findHandler(uri string) (handler, error) { +// getSchemeHandler takes a URI and picks the parts we need for creating a scheme handler. +// The scheme handler knows how to authenticate itself (using URI params), and how to copy +// itself to the destination target. +// Returns a new file handler on success, error otherwise. +func getSchemeHandler(uri string) (handler, error) { u, err := url.Parse(uri) if err != nil { return nil, err } + // target might be just a dir like '/tmp/backup', then default to local file handler. if u.Scheme == "" { u.Scheme = "file" } - h, ok := handlers[u.Scheme] + handlers.Lock() + defer handlers.Unlock() + h, ok := handlers.m[u.Scheme] if !ok { return nil, x.Errorf("invalid scheme %q", u.Scheme) } @@ -41,3 +52,14 @@ func findHandler(uri string) (handler, error) { } return h, nil } + +func addSchemeHandler(scheme string, h handler) { + handlers.Lock() + defer handlers.Unlock() + if handlers.m == nil { + handlers.m = make(map[string]handler) + } + if _, ok := handlers.m[scheme]; !ok { + handlers.m[scheme] = h + } +} diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 6f80bd0079b..4d2a889abcd 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -6,15 +6,17 @@ package backup import ( - "encoding/binary" "fmt" "io/ioutil" "os" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/golang/glog" + "github.com/matttproud/golang_protobuf_extensions/pbutil" ) const dgraphBackupTempPrefix = "dgraph-backup-*" +const dgraphBackupSuffix = ".dgraph-backup" type writer struct { file string @@ -22,31 +24,66 @@ type writer struct { tmp *os.File } -func (w *Worker) newWriter() (*writer, error) { - // dst is where we will copy the data - dst, err := findHandler("/tmp/dgraph/") +func (w *writer) save() error { + glog.Infof("Saving backup to: %q", w.file) + if err := w.dst.Copy(w.tmp.Name(), w.file); err != nil { + return err + } + glog.V(3).Infof("copied %q to %q on target ...", w.tmp.Name(), w.file) + // we are done done, cleanup. + return w.cleanup() +} + +func (w *writer) cleanup() error { + // always remove the temp file + defer func() { + if err := os.Remove(w.tmp.Name()); err != nil { + // let the user know there's baggage left behind. they might have to delete by hand. + glog.Errorf("failed to remove temp file %q: %s", w.tmp.Name(), err) + } + }() + + glog.V(3).Info("cleaning up ...") + if err := w.tmp.Close(); err != nil { + return err + } + return nil +} + +func newWriter(worker *Worker) (*writer, error) { + var w writer + var err error + + // dst is the final destination for data. + w.dst, err = getSchemeHandler(worker.TargetURI) if err != nil { return nil, err } - // tmp file is our main working file - tmp, err := ioutil.TempFile("", dgraphBackupTempPrefix) + + // tmp file is our main working file. + // we will prepare this file and then copy to dst when done. + w.tmp, err = ioutil.TempFile("", dgraphBackupTempPrefix) if err != nil { + glog.Errorf("could not create temp file: %s\n", err) return nil, err } - // file: 1283719371922.12.3242423938.dgraph-backup - file := fmt.Sprintf("%s.%d.%d%s", - w.SeqTs, w.GroupId, w.ReadTs, dgraphBackupSuffix) - return &writer{ - dst: dst, - tmp: tmp, - file: file, - }, nil + glog.V(3).Infof("temp file: %q", w.tmp.Name()) + + // file name: 1283719371922.12.3242423938.dgraph-backup + w.file = fmt.Sprintf("%s.%d.%d%s", + worker.SeqTs, worker.GroupId, worker.ReadTs, dgraphBackupSuffix) + glog.V(3).Infof("target file %q", w.file) + + return &w, err } +// Send implements the stream.kvStream interface. +// It writes the received KV into the temp file. +// Returns error if the writing fails, nil on success. func (w *writer) Send(kvs *pb.KVS) error { var err error for _, kv := range kvs.Kv { - err = binary.Write(w.tmp, binary.LittleEndian, kv.Val) + _, err = pbutil.WriteDelimited(w.tmp, kv) if err != nil { return err } diff --git a/ee/backup/writer_local.go b/ee/backup/writer_local.go index 90b94f7624d..60b43759b7f 100644 --- a/ee/backup/writer_local.go +++ b/ee/backup/writer_local.go @@ -10,33 +10,37 @@ import ( "os" "path/filepath" - "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" ) -const dgraphBackupFullPrefix = "full-" -const dgraphBackupPartialPrefix = "part-" -const dgraphBackupSuffix = ".dgraph-backup" - +// fileHandler is used for 'file:' URI scheme. type fileHandler struct { path string } +// Session authenticates or prepares a handler session. +// Returns error on failure, nil on success. func (h *fileHandler) Session(_, path string) error { h.path = path return os.Chdir(h.path) } +// List returns a list of Dgraph backup files at target. +// Returns a list (might be empty) on success, error otherwise. func (h *fileHandler) List() ([]string, error) { return filepath.Glob(filepath.Join(h.path, "*"+dgraphBackupSuffix)) } +// Copy is called when we are ready to transmit a file to the target. +// Returns error on failure, nil on success. func (h *fileHandler) Copy(in, out string) error { if filepath.Base(out) == out { out = filepath.Join(h.path, out) } if h.Exists(out) { - return x.Errorf("file already exists: %q", out) + glog.Errorf("File already exists on target: %q", out) + return os.ErrExist } src, err := os.Open(in) @@ -58,19 +62,14 @@ func (h *fileHandler) Copy(in, out string) error { return dst.Sync() } +// Exists checks if a path (file or dir) is found at target. +// Returns true if found, false otherwise. func (h *fileHandler) Exists(path string) bool { _, err := os.Stat(path) return os.IsExist(err) } -func (h *fileHandler) Write(b []byte) (int, error) { - return 0, nil -} - -func (h *fileHandler) Close() error { - return h.Close() -} - +// Register this handler func init() { - handlers["file"] = &fileHandler{} + addSchemeHandler("file", &fileHandler{}) } diff --git a/protos/pb.proto b/protos/pb.proto index 8920e07df35..3e6c14d1f77 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -443,7 +443,7 @@ message SnapshotMeta { message BackupRequest { uint64 start_ts = 1; uint32 group_id = 2; - string endpoint = 3; + string target = 3; } message BackupResponse { diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index e74fa43af51..ce46d0707ad 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{17, 0} + return fileDescriptor_pb_fc313e30f62637c5, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{24, 0} + return fileDescriptor_pb_fc313e30f62637c5, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{24, 1} + return fileDescriptor_pb_fc313e30f62637c5, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{34, 0} + return fileDescriptor_pb_fc313e30f62637c5, []int{34, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{37, 0} + return fileDescriptor_pb_fc313e30f62637c5, []int{37, 0} } type BackupResponse_Status int32 @@ -208,7 +208,7 @@ func (x BackupResponse_Status) String() string { return proto.EnumName(BackupResponse_Status_name, int32(x)) } func (BackupResponse_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{47, 0} + return fileDescriptor_pb_fc313e30f62637c5, []int{47, 0} } type List struct { @@ -222,7 +222,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{0} + return fileDescriptor_pb_fc313e30f62637c5, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{1} + return fileDescriptor_pb_fc313e30f62637c5, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +326,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{2} + return fileDescriptor_pb_fc313e30f62637c5, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -399,7 +399,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{3} + return fileDescriptor_pb_fc313e30f62637c5, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -516,7 +516,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{4} + return fileDescriptor_pb_fc313e30f62637c5, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -563,7 +563,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{5} + return fileDescriptor_pb_fc313e30f62637c5, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -616,7 +616,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{6} + return fileDescriptor_pb_fc313e30f62637c5, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -707,7 +707,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{7} + return fileDescriptor_pb_fc313e30f62637c5, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -772,7 +772,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{8} + return fileDescriptor_pb_fc313e30f62637c5, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -847,7 +847,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{9} + return fileDescriptor_pb_fc313e30f62637c5, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -897,7 +897,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{10} + return fileDescriptor_pb_fc313e30f62637c5, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -974,7 +974,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{11} + return fileDescriptor_pb_fc313e30f62637c5, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1064,7 +1064,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{12} + return fileDescriptor_pb_fc313e30f62637c5, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1125,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{13} + return fileDescriptor_pb_fc313e30f62637c5, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1231,7 +1231,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{14} + return fileDescriptor_pb_fc313e30f62637c5, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1329,7 +1329,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{15} + return fileDescriptor_pb_fc313e30f62637c5, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1395,7 +1395,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{16} + return fileDescriptor_pb_fc313e30f62637c5, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1485,7 +1485,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{17} + return fileDescriptor_pb_fc313e30f62637c5, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1593,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{18} + return fileDescriptor_pb_fc313e30f62637c5, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1675,7 +1675,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{19} + return fileDescriptor_pb_fc313e30f62637c5, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1724,7 +1724,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{20} + return fileDescriptor_pb_fc313e30f62637c5, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1791,7 +1791,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{21} + return fileDescriptor_pb_fc313e30f62637c5, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1880,7 +1880,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{22} + return fileDescriptor_pb_fc313e30f62637c5, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1930,7 +1930,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{23} + return fileDescriptor_pb_fc313e30f62637c5, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2009,7 +2009,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{24} + return fileDescriptor_pb_fc313e30f62637c5, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2122,7 +2122,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{25} + return fileDescriptor_pb_fc313e30f62637c5, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2191,7 +2191,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{26} + return fileDescriptor_pb_fc313e30f62637c5, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2246,7 +2246,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{27} + return fileDescriptor_pb_fc313e30f62637c5, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2300,7 +2300,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{28} + return fileDescriptor_pb_fc313e30f62637c5, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2347,7 +2347,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{29} + return fileDescriptor_pb_fc313e30f62637c5, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2396,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{30} + return fileDescriptor_pb_fc313e30f62637c5, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2460,7 +2460,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{31} + return fileDescriptor_pb_fc313e30f62637c5, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2525,7 +2525,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{32} + return fileDescriptor_pb_fc313e30f62637c5, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2586,7 +2586,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{33} + return fileDescriptor_pb_fc313e30f62637c5, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2640,7 +2640,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{34} + return fileDescriptor_pb_fc313e30f62637c5, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2740,7 +2740,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{35} + return fileDescriptor_pb_fc313e30f62637c5, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2804,7 +2804,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{36} + return fileDescriptor_pb_fc313e30f62637c5, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2878,7 +2878,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{37} + return fileDescriptor_pb_fc313e30f62637c5, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2947,7 +2947,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{38} + return fileDescriptor_pb_fc313e30f62637c5, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3002,7 +3002,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{39} + return fileDescriptor_pb_fc313e30f62637c5, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3056,7 +3056,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{40} + return fileDescriptor_pb_fc313e30f62637c5, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3103,7 +3103,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{41} + return fileDescriptor_pb_fc313e30f62637c5, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3151,7 +3151,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{42} + return fileDescriptor_pb_fc313e30f62637c5, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3206,7 +3206,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{43} + return fileDescriptor_pb_fc313e30f62637c5, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3263,7 +3263,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{44} + return fileDescriptor_pb_fc313e30f62637c5, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3325,7 +3325,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{45} + return fileDescriptor_pb_fc313e30f62637c5, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3371,7 @@ func (m *SnapshotMeta) GetGroupId() uint32 { type BackupRequest struct { StartTs uint64 `protobuf:"varint,1,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3381,7 +3381,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{46} + return fileDescriptor_pb_fc313e30f62637c5, []int{46} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3424,9 +3424,9 @@ func (m *BackupRequest) GetGroupId() uint32 { return 0 } -func (m *BackupRequest) GetEndpoint() string { +func (m *BackupRequest) GetTarget() string { if m != nil { - return m.Endpoint + return m.Target } return "" } @@ -3443,7 +3443,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_f61bbe108b420f03, []int{47} + return fileDescriptor_pb_fc313e30f62637c5, []int{47} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6931,11 +6931,11 @@ func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) } - if len(m.Endpoint) > 0 { + if len(m.Target) > 0 { dAtA[i] = 0x1a i++ - i = encodeVarintPb(dAtA, i, uint64(len(m.Endpoint))) - i += copy(dAtA[i:], m.Endpoint) + i = encodeVarintPb(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -8244,7 +8244,7 @@ func (m *BackupRequest) Size() (n int) { if m.GroupId != 0 { n += 1 + sovPb(uint64(m.GroupId)) } - l = len(m.Endpoint) + l = len(m.Target) if l > 0 { n += 1 + l + sovPb(uint64(l)) } @@ -15335,7 +15335,7 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -15360,7 +15360,7 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Endpoint = string(dAtA[iNdEx:postIndex]) + m.Target = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -15588,204 +15588,204 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_f61bbe108b420f03) } - -var fileDescriptor_pb_f61bbe108b420f03 = []byte{ - // 3127 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x49, 0x73, 0xe3, 0xc6, - 0xd5, 0x02, 0x48, 0x82, 0xc0, 0x23, 0xa9, 0xa1, 0xdb, 0xe3, 0x31, 0x87, 0xb6, 0x35, 0x32, 0x3c, - 0x8b, 0x3c, 0x63, 0xeb, 0x1b, 0xcb, 0xfe, 0xca, 0xcb, 0x4d, 0x23, 0x52, 0x53, 0xf4, 0x68, 0x4b, - 0x93, 0x1a, 0x27, 0x3e, 0x98, 0x05, 0x11, 0x2d, 0x0a, 0x11, 0x08, 0xc0, 0x68, 0x50, 0x45, 0xf9, - 0x90, 0xaa, 0x5c, 0xf2, 0x1b, 0x9c, 0x4b, 0x0e, 0x39, 0x26, 0x7f, 0x20, 0xf9, 0x01, 0xa9, 0xf2, - 0x31, 0xa7, 0x54, 0xe5, 0x96, 0x9a, 0x9c, 0x72, 0x4e, 0xa5, 0x72, 0xc8, 0x25, 0xd5, 0xaf, 0x1b, - 0x0b, 0xa9, 0x65, 0xec, 0xa4, 0x72, 0x22, 0xde, 0xd2, 0xdb, 0xdb, 0xdf, 0x23, 0x98, 0xd1, 0xd1, - 0x7a, 0x14, 0x87, 0x49, 0x48, 0xf4, 0xe8, 0xa8, 0x6d, 0x39, 0x91, 0x27, 0x41, 0xbb, 0x0d, 0xe5, - 0x1d, 0x8f, 0x27, 0x84, 0x40, 0x79, 0xea, 0xb9, 0xbc, 0xa5, 0xad, 0x96, 0xd6, 0x0c, 0x8a, 0xdf, - 0xf6, 0x2e, 0x58, 0x03, 0x87, 0x9f, 0x3e, 0x77, 0xfc, 0x29, 0x23, 0x4d, 0x28, 0x9d, 0x39, 0x7e, - 0x4b, 0x5b, 0xd5, 0xd6, 0xea, 0x54, 0x7c, 0x92, 0x75, 0x30, 0xcf, 0x1c, 0x7f, 0x98, 0x9c, 0x47, - 0xac, 0xa5, 0xaf, 0x6a, 0x6b, 0xcb, 0x1b, 0xaf, 0xae, 0x47, 0x47, 0xeb, 0x07, 0x21, 0x4f, 0xbc, - 0x60, 0xbc, 0xfe, 0xdc, 0xf1, 0x07, 0xe7, 0x11, 0xa3, 0xd5, 0x33, 0xf9, 0x61, 0xef, 0x43, 0xad, - 0x1f, 0x8f, 0xb6, 0xa7, 0xc1, 0x28, 0xf1, 0xc2, 0x40, 0x9c, 0x18, 0x38, 0x13, 0x86, 0x3b, 0x5a, - 0x14, 0xbf, 0x05, 0xce, 0x89, 0xc7, 0xbc, 0x55, 0x5a, 0x2d, 0x09, 0x9c, 0xf8, 0x26, 0x2d, 0xa8, - 0x7a, 0x7c, 0x2b, 0x9c, 0x06, 0x49, 0xab, 0xbc, 0xaa, 0xad, 0x99, 0x34, 0x05, 0xed, 0xbf, 0xeb, - 0x50, 0xf9, 0xd1, 0x94, 0xc5, 0xe7, 0xb8, 0x2e, 0x49, 0xe2, 0x74, 0x2f, 0xf1, 0x4d, 0x6e, 0x42, - 0xc5, 0x77, 0x82, 0x31, 0x6f, 0xe9, 0xb8, 0x99, 0x04, 0xc8, 0x1b, 0x60, 0x39, 0xc7, 0x09, 0x8b, - 0x87, 0x53, 0xcf, 0x6d, 0x95, 0x56, 0xb5, 0x35, 0x83, 0x9a, 0x88, 0x38, 0xf4, 0x5c, 0x72, 0x1b, - 0x4c, 0x37, 0x1c, 0x8e, 0x8a, 0x67, 0xb9, 0x21, 0x9e, 0x45, 0xde, 0x01, 0x73, 0xea, 0xb9, 0x43, - 0xdf, 0xe3, 0x49, 0xab, 0xb2, 0xaa, 0xad, 0xd5, 0x36, 0x4c, 0xf1, 0x58, 0x21, 0x3b, 0x5a, 0x9d, - 0x7a, 0x2e, 0x0a, 0xf1, 0x21, 0x98, 0x3c, 0x1e, 0x0d, 0x8f, 0xa7, 0xc1, 0xa8, 0x65, 0x20, 0xd3, - 0x0d, 0xc1, 0x54, 0x78, 0x35, 0xad, 0x72, 0x09, 0x88, 0x67, 0xc5, 0xec, 0x8c, 0xc5, 0x9c, 0xb5, - 0xaa, 0xf2, 0x28, 0x05, 0x92, 0xc7, 0x50, 0x3b, 0x76, 0x46, 0x2c, 0x19, 0x46, 0x4e, 0xec, 0x4c, - 0x5a, 0x66, 0xbe, 0xd1, 0xb6, 0x40, 0x1f, 0x08, 0x2c, 0xa7, 0x70, 0x9c, 0x01, 0xe4, 0x43, 0x68, - 0x20, 0xc4, 0x87, 0xc7, 0x9e, 0x9f, 0xb0, 0xb8, 0x65, 0xe1, 0x9a, 0x65, 0x5c, 0x83, 0x98, 0x41, - 0xcc, 0x18, 0xad, 0x4b, 0x26, 0x89, 0x21, 0x6f, 0x01, 0xb0, 0x59, 0xe4, 0x04, 0xee, 0xd0, 0xf1, - 0xfd, 0x16, 0xe0, 0x1d, 0x2c, 0x89, 0xd9, 0xf4, 0x7d, 0xf2, 0xba, 0xb8, 0x9f, 0xe3, 0x0e, 0x13, - 0xde, 0x6a, 0xac, 0x6a, 0x6b, 0x65, 0x6a, 0x08, 0x70, 0xc0, 0xed, 0x0d, 0xb0, 0xd0, 0x22, 0xf0, - 0xc5, 0xf7, 0xc0, 0x38, 0x13, 0x80, 0x34, 0x9c, 0xda, 0x46, 0x43, 0x1c, 0x99, 0x19, 0x0d, 0x55, - 0x44, 0x7b, 0x05, 0xcc, 0x1d, 0x27, 0x18, 0xa7, 0x96, 0x26, 0x54, 0x81, 0x0b, 0x2c, 0x8a, 0xdf, - 0xf6, 0xb7, 0x3a, 0x18, 0x94, 0xf1, 0xa9, 0x9f, 0x90, 0x07, 0x00, 0x42, 0xd0, 0x13, 0x27, 0x89, - 0xbd, 0x99, 0xda, 0x35, 0x17, 0xb5, 0x35, 0xf5, 0xdc, 0x5d, 0x24, 0x91, 0xc7, 0x50, 0xc7, 0xdd, - 0x53, 0x56, 0x3d, 0xbf, 0x40, 0x76, 0x3f, 0x5a, 0x43, 0x16, 0xb5, 0xe2, 0x16, 0x18, 0xa8, 0x5b, - 0x69, 0x5f, 0x0d, 0xaa, 0x20, 0x72, 0x0f, 0x96, 0xbd, 0x20, 0x11, 0xb2, 0x1f, 0x25, 0x43, 0x97, - 0xf1, 0x54, 0xf9, 0x8d, 0x0c, 0xdb, 0x61, 0x3c, 0x21, 0x1f, 0x80, 0x14, 0x60, 0x7a, 0x60, 0x05, - 0x0f, 0x5c, 0xce, 0x14, 0xc3, 0xe5, 0x89, 0xc8, 0xa3, 0x4e, 0x7c, 0x1f, 0x6a, 0xe2, 0x7d, 0xe9, - 0x0a, 0x03, 0x57, 0xd4, 0xf1, 0x35, 0x4a, 0x1c, 0x14, 0x04, 0x83, 0x62, 0x17, 0xa2, 0x11, 0x06, - 0x26, 0x0d, 0x02, 0xbf, 0xed, 0x2e, 0x54, 0xf6, 0x63, 0x97, 0xc5, 0x97, 0xda, 0x38, 0x81, 0xb2, - 0xcb, 0xf8, 0x08, 0xdd, 0xcf, 0xa4, 0xf8, 0x9d, 0xdb, 0x7d, 0xa9, 0x60, 0xf7, 0xf6, 0xaf, 0x34, - 0xa8, 0xf5, 0xc3, 0x38, 0xd9, 0x65, 0x9c, 0x3b, 0x63, 0x46, 0xee, 0x40, 0x25, 0x14, 0xdb, 0x2a, - 0x09, 0x5b, 0xe2, 0x4e, 0x78, 0x0e, 0x95, 0xf8, 0x05, 0x3d, 0xe8, 0x57, 0xeb, 0xe1, 0x26, 0x54, - 0xa4, 0xc7, 0x08, 0x6f, 0xaa, 0x50, 0x09, 0x08, 0x59, 0x87, 0xc7, 0xc7, 0x9c, 0x49, 0x59, 0x56, - 0xa8, 0x82, 0xae, 0x36, 0xab, 0xff, 0x07, 0x10, 0xf7, 0xfb, 0x81, 0x56, 0x60, 0x9f, 0x40, 0x8d, - 0x3a, 0xc7, 0xc9, 0x56, 0x18, 0x24, 0x6c, 0x96, 0x90, 0x65, 0xd0, 0x3d, 0x17, 0x45, 0x64, 0x50, - 0xdd, 0x73, 0xc5, 0xe5, 0xc6, 0x71, 0x38, 0x8d, 0x50, 0x42, 0x0d, 0x2a, 0x01, 0x14, 0xa5, 0xeb, - 0xc6, 0x78, 0x63, 0x21, 0x4a, 0xd7, 0x8d, 0xc9, 0x1d, 0xa8, 0xf1, 0xc0, 0x89, 0xf8, 0x49, 0x98, - 0x88, 0xcb, 0x95, 0xf1, 0x72, 0x90, 0xa2, 0x06, 0xdc, 0xfe, 0x83, 0x06, 0xc6, 0x2e, 0x9b, 0x1c, - 0xb1, 0xf8, 0xc2, 0x29, 0xb7, 0xc1, 0xc4, 0x8d, 0x87, 0x9e, 0xab, 0x0e, 0xaa, 0x22, 0xdc, 0x73, - 0x2f, 0x3d, 0xea, 0x16, 0x18, 0x3e, 0x73, 0x84, 0xf0, 0xa5, 0x9d, 0x29, 0x48, 0xc8, 0xc6, 0x99, - 0x0c, 0x5d, 0xe6, 0xb8, 0x18, 0x62, 0x4c, 0x6a, 0x38, 0x93, 0x0e, 0x73, 0x5c, 0x71, 0x37, 0xdf, - 0xe1, 0xc9, 0x70, 0x1a, 0xb9, 0x4e, 0xc2, 0x30, 0xb4, 0x94, 0x85, 0xe1, 0xf0, 0xe4, 0x10, 0x31, - 0xe4, 0x21, 0xbc, 0x32, 0xf2, 0xa7, 0x5c, 0xc4, 0x35, 0x2f, 0x38, 0x0e, 0x87, 0x61, 0xe0, 0x9f, - 0xa3, 0x7c, 0x4d, 0x7a, 0x43, 0x11, 0x7a, 0xc1, 0x71, 0xb8, 0x1f, 0xf8, 0xe7, 0xf6, 0xbf, 0x34, - 0xa8, 0x3c, 0x45, 0x31, 0x3c, 0x86, 0xea, 0x04, 0x1f, 0x94, 0x7a, 0xef, 0x2d, 0x21, 0x61, 0xa4, - 0xad, 0xcb, 0x97, 0xf2, 0x6e, 0x90, 0xc4, 0xe7, 0x34, 0x65, 0x13, 0x2b, 0x12, 0xe7, 0xc8, 0x67, - 0x09, 0x57, 0x16, 0x51, 0x58, 0x31, 0x90, 0x04, 0xb5, 0x42, 0xb1, 0xb5, 0xb7, 0xa1, 0x5e, 0xdc, - 0x4a, 0xa4, 0x91, 0x53, 0x76, 0x8e, 0xb2, 0x2b, 0x53, 0xf1, 0x49, 0x56, 0xa1, 0x82, 0x4e, 0x8a, - 0x92, 0xab, 0x6d, 0x80, 0xd8, 0x51, 0x2e, 0xa1, 0x92, 0xf0, 0x99, 0xfe, 0x89, 0x26, 0xf6, 0x29, - 0x1e, 0x50, 0xdc, 0xc7, 0xba, 0x7a, 0x1f, 0xb9, 0xa4, 0xb0, 0x8f, 0xfd, 0x4f, 0x0d, 0xea, 0x5f, - 0xb2, 0x38, 0x3c, 0x88, 0xc3, 0x28, 0xe4, 0x8e, 0x4f, 0x6c, 0x30, 0xe4, 0xeb, 0x2e, 0x39, 0x5f, - 0x51, 0x04, 0x8f, 0x7c, 0x0f, 0xaa, 0x71, 0x7e, 0x6f, 0x45, 0x21, 0x2b, 0x00, 0x13, 0x67, 0xb6, - 0xc3, 0x1c, 0xce, 0x7a, 0x6e, 0x6a, 0x3e, 0x39, 0x86, 0xb4, 0xc1, 0x9c, 0x38, 0xb3, 0xc1, 0x2c, - 0x18, 0x70, 0xd4, 0x6e, 0x99, 0x66, 0x30, 0x79, 0x13, 0xac, 0x89, 0x33, 0x13, 0x76, 0xdc, 0x73, - 0x95, 0x76, 0x73, 0x04, 0x79, 0x1b, 0x4a, 0xc9, 0x2c, 0xc0, 0xa0, 0x20, 0xf2, 0x80, 0xc8, 0xdd, - 0x83, 0x59, 0xa0, 0x2c, 0x9e, 0x0a, 0x5a, 0x2a, 0x0d, 0x33, 0x97, 0x46, 0x13, 0x4a, 0x23, 0xcf, - 0xc5, 0x44, 0x60, 0x51, 0xf1, 0x69, 0xff, 0xae, 0x04, 0x37, 0x94, 0x2a, 0x4e, 0xbc, 0xa8, 0x9f, - 0x08, 0xbb, 0x69, 0x41, 0x15, 0xdd, 0x95, 0xc5, 0x4a, 0x23, 0x29, 0x48, 0x3e, 0x06, 0x03, 0x4d, - 0x38, 0x55, 0xf4, 0x9d, 0x5c, 0x2c, 0xd9, 0x72, 0xa9, 0x78, 0xa5, 0x71, 0xc5, 0x4e, 0x3e, 0x82, - 0xca, 0x37, 0x2c, 0x0e, 0x65, 0xf8, 0xa9, 0x6d, 0xac, 0x5c, 0xb6, 0x4e, 0x28, 0x40, 0x2d, 0x93, - 0xcc, 0xff, 0x43, 0xe9, 0xdd, 0x15, 0x01, 0x67, 0x12, 0x9e, 0x31, 0xb7, 0x55, 0xc5, 0x1b, 0x15, - 0x15, 0x9c, 0x92, 0x52, 0x71, 0x99, 0x99, 0xb8, 0xda, 0x1d, 0xa8, 0x15, 0x9e, 0x57, 0xb4, 0xb7, - 0x86, 0x94, 0xf0, 0x9d, 0x79, 0x7b, 0xb3, 0x32, 0x4f, 0x28, 0x9a, 0x6d, 0x07, 0x20, 0x7f, 0xec, - 0x7f, 0x6a, 0xfc, 0xf6, 0xcf, 0x35, 0xb8, 0xb1, 0x15, 0x06, 0x01, 0xc3, 0x1a, 0x42, 0xaa, 0x2e, - 0xb7, 0x5b, 0xed, 0x4a, 0xbb, 0x7d, 0x17, 0x2a, 0x5c, 0x30, 0xab, 0xdd, 0x5f, 0xbd, 0x44, 0x17, - 0x54, 0x72, 0x88, 0x10, 0x33, 0x71, 0x66, 0xc3, 0x88, 0x05, 0xae, 0x17, 0x8c, 0xd1, 0xce, 0xa5, - 0x06, 0x0e, 0x24, 0xc6, 0xfe, 0xb5, 0x06, 0x86, 0x34, 0xf9, 0xb9, 0x70, 0xa7, 0xcd, 0x87, 0xbb, - 0x37, 0xc1, 0x8a, 0x62, 0xe6, 0x7a, 0xa3, 0xf4, 0x54, 0x8b, 0xe6, 0x08, 0x11, 0x8d, 0x8f, 0xc3, - 0x78, 0xc4, 0x70, 0x7b, 0x93, 0x4a, 0x40, 0x94, 0x64, 0x98, 0x12, 0x30, 0x68, 0xc9, 0x88, 0x68, - 0x0a, 0x84, 0x88, 0x56, 0x62, 0x09, 0x8f, 0x9c, 0x91, 0x2c, 0x92, 0x4a, 0x54, 0x02, 0x22, 0x82, - 0x4a, 0xcd, 0xa1, 0xc6, 0x4c, 0xaa, 0x20, 0xfb, 0x37, 0x3a, 0xd4, 0x3b, 0x5e, 0xcc, 0x46, 0x09, - 0x73, 0xbb, 0xee, 0x18, 0x19, 0x59, 0x90, 0x78, 0xc9, 0xb9, 0x8a, 0xd6, 0x0a, 0xca, 0x92, 0xa9, - 0x3e, 0x5f, 0x30, 0x4a, 0x5d, 0x94, 0xb0, 0xc6, 0x95, 0x00, 0xd9, 0x00, 0x90, 0x65, 0x06, 0xd6, - 0xb9, 0xe5, 0xab, 0xeb, 0x5c, 0x0b, 0xd9, 0xc4, 0xa7, 0x10, 0x90, 0x5c, 0xe3, 0xc9, 0x48, 0x6e, - 0x60, 0x11, 0x3c, 0x15, 0x86, 0x8c, 0xd9, 0xf9, 0x88, 0xf9, 0x68, 0xa8, 0x98, 0x9d, 0x8f, 0x98, - 0x9f, 0xd5, 0x44, 0x55, 0x79, 0x1d, 0xf1, 0x4d, 0xde, 0x01, 0x3d, 0x8c, 0xf0, 0x7d, 0xea, 0xc0, - 0xe2, 0xc3, 0xd6, 0xf7, 0x23, 0xaa, 0x87, 0x91, 0xb0, 0x02, 0x59, 0xd4, 0xb5, 0x2c, 0x65, 0xdc, - 0x22, 0x3c, 0x60, 0x39, 0x42, 0x15, 0xc5, 0xbe, 0x05, 0xfa, 0x7e, 0x44, 0xaa, 0x50, 0xea, 0x77, - 0x07, 0xcd, 0x25, 0xf1, 0xd1, 0xe9, 0xee, 0x34, 0x35, 0xfb, 0x85, 0x06, 0xd6, 0xee, 0x34, 0x71, - 0x84, 0x4d, 0xf1, 0xeb, 0x94, 0x7a, 0x1b, 0x4c, 0x9e, 0x38, 0x31, 0xe6, 0x45, 0x5d, 0x86, 0x09, - 0x84, 0x07, 0x9c, 0xdc, 0x87, 0x0a, 0x73, 0xc7, 0x2c, 0xf5, 0xf6, 0xe6, 0xe2, 0x3d, 0xa9, 0x24, - 0x93, 0x35, 0x30, 0xf8, 0xe8, 0x84, 0x4d, 0x9c, 0x56, 0x39, 0x67, 0xec, 0x23, 0x46, 0xa6, 0x30, - 0xaa, 0xe8, 0x58, 0x83, 0xc7, 0x61, 0x84, 0x45, 0x69, 0x45, 0xd5, 0xe0, 0x71, 0x18, 0x89, 0x92, - 0x74, 0x03, 0x5e, 0xf3, 0xc6, 0x41, 0x18, 0xb3, 0xa1, 0x17, 0xb8, 0x6c, 0x36, 0x1c, 0x85, 0xc1, - 0xb1, 0xef, 0x8d, 0x12, 0x94, 0xa5, 0x49, 0x5f, 0x95, 0xc4, 0x9e, 0xa0, 0x6d, 0x29, 0x92, 0xfd, - 0x0e, 0x58, 0xcf, 0xd8, 0x39, 0x16, 0x84, 0x9c, 0xdc, 0x02, 0xfd, 0xf4, 0x4c, 0xe5, 0x3a, 0x43, - 0xdc, 0xe0, 0xd9, 0x73, 0xaa, 0x9f, 0x9e, 0xd9, 0x2e, 0x98, 0x7d, 0x95, 0xe8, 0xc9, 0xbb, 0x22, - 0x24, 0x62, 0x68, 0x55, 0x8e, 0x85, 0x95, 0x77, 0xa1, 0xc6, 0xa0, 0x29, 0x5d, 0xe8, 0x12, 0x2f, - 0xa2, 0x84, 0x22, 0x81, 0x62, 0x85, 0x53, 0x9a, 0xab, 0x70, 0x7e, 0xa1, 0x83, 0x99, 0xa5, 0x9d, - 0x47, 0x60, 0x4d, 0x52, 0xd9, 0x2b, 0xf7, 0xc4, 0xd2, 0x35, 0x53, 0x08, 0xcd, 0xe9, 0xea, 0xde, - 0xe5, 0xc5, 0x7b, 0xe7, 0xfe, 0x5d, 0x79, 0xa9, 0x7f, 0x3f, 0x80, 0x1b, 0x23, 0x9f, 0x39, 0xc1, - 0x30, 0x77, 0x4f, 0x69, 0x81, 0xcb, 0x88, 0x3e, 0xc8, 0x7c, 0x54, 0xc5, 0xa8, 0x6a, 0x9e, 0x4a, - 0xee, 0x41, 0xc5, 0x65, 0x7e, 0xe2, 0x14, 0x3b, 0x91, 0xfd, 0xd8, 0x19, 0xf9, 0xac, 0x23, 0xd0, - 0x54, 0x52, 0xc9, 0x1a, 0x98, 0x69, 0xb5, 0xa4, 0xfa, 0x0f, 0x2c, 0x74, 0x53, 0xc1, 0xd2, 0x8c, - 0x6a, 0xbf, 0x05, 0xa5, 0x67, 0xcf, 0xfb, 0x57, 0x6a, 0xe3, 0x2b, 0xd0, 0x9f, 0x3d, 0x2f, 0xc6, - 0xca, 0x7a, 0x96, 0xd2, 0x44, 0x07, 0xaa, 0xe7, 0x1d, 0x68, 0x1b, 0xcc, 0x29, 0x67, 0xf1, 0x2e, - 0x4b, 0x1c, 0xe5, 0xb4, 0x19, 0x2c, 0x52, 0x9b, 0x68, 0xa7, 0xbc, 0x30, 0x50, 0xe9, 0x24, 0x05, - 0xed, 0xbf, 0x95, 0xa0, 0xaa, 0x9c, 0x57, 0xec, 0x39, 0xcd, 0x4a, 0x39, 0xf1, 0x99, 0x47, 0x01, - 0xbd, 0x18, 0x05, 0x8a, 0xbd, 0x6e, 0xe9, 0xe5, 0xbd, 0x2e, 0xf9, 0x0c, 0xea, 0x91, 0xa4, 0x15, - 0xe3, 0xc6, 0xeb, 0xc5, 0x35, 0xea, 0x17, 0xd7, 0xd5, 0xa2, 0x1c, 0x10, 0x1e, 0x80, 0x4d, 0x43, - 0xe2, 0x8c, 0x51, 0xb1, 0x75, 0x5a, 0x15, 0xf0, 0xc0, 0x19, 0x5f, 0x11, 0x3d, 0xbe, 0x47, 0x10, - 0x10, 0x25, 0x6b, 0x18, 0xb5, 0xea, 0xe8, 0xd8, 0x22, 0x70, 0x14, 0x7d, 0xba, 0x31, 0xef, 0xd3, - 0x6f, 0x80, 0x35, 0x0a, 0x27, 0x13, 0x0f, 0x69, 0xcb, 0x32, 0xd9, 0x4a, 0xc4, 0x80, 0xdb, 0xdf, - 0x40, 0x55, 0x3d, 0x96, 0xd4, 0xa0, 0xda, 0xe9, 0x6e, 0x6f, 0x1e, 0xee, 0x88, 0xa8, 0x02, 0x60, - 0x3c, 0xe9, 0xed, 0x6d, 0xd2, 0x9f, 0x34, 0x35, 0x11, 0x61, 0x7a, 0x7b, 0x83, 0xa6, 0x4e, 0x2c, - 0xa8, 0x6c, 0xef, 0xec, 0x6f, 0x0e, 0x9a, 0x25, 0x62, 0x42, 0xf9, 0xc9, 0xfe, 0xfe, 0x4e, 0xb3, - 0x4c, 0xea, 0x60, 0x76, 0x36, 0x07, 0xdd, 0x41, 0x6f, 0xb7, 0xdb, 0xac, 0x08, 0xde, 0xa7, 0xdd, - 0xfd, 0xa6, 0x21, 0x3e, 0x0e, 0x7b, 0x9d, 0x66, 0x55, 0xd0, 0x0f, 0x36, 0xfb, 0xfd, 0x2f, 0xf6, - 0x69, 0xa7, 0x69, 0x8a, 0x7d, 0xfb, 0x03, 0xda, 0xdb, 0x7b, 0xda, 0xb4, 0xec, 0x0f, 0xa0, 0x56, - 0x10, 0x9a, 0x58, 0x41, 0xbb, 0xdb, 0xcd, 0x25, 0x71, 0xcc, 0xf3, 0xcd, 0x9d, 0xc3, 0x6e, 0x53, - 0x23, 0xcb, 0x00, 0xf8, 0x39, 0xdc, 0xd9, 0xdc, 0x7b, 0xda, 0xd4, 0xed, 0x9f, 0x65, 0x4b, 0xb0, - 0xf7, 0x7c, 0x00, 0xa6, 0x92, 0x74, 0x5a, 0xf2, 0xd6, 0x0a, 0x2a, 0xa1, 0x19, 0x51, 0x58, 0xd6, - 0xe8, 0x84, 0x8d, 0x4e, 0xf9, 0x74, 0xa2, 0x0c, 0x21, 0x83, 0x65, 0x1b, 0x29, 0xc4, 0x91, 0xfa, - 0xb7, 0x84, 0xb2, 0x11, 0x4a, 0x19, 0xf9, 0xe5, 0x08, 0xe5, 0x23, 0x80, 0xbc, 0x69, 0xbf, 0xa4, - 0x68, 0xbd, 0x09, 0x15, 0xc7, 0xf7, 0x1c, 0xae, 0x12, 0x91, 0x04, 0xec, 0x3d, 0xa8, 0x15, 0x5a, - 0x7d, 0xa1, 0x2b, 0xc7, 0xf7, 0x87, 0xa7, 0xec, 0x9c, 0xe3, 0x5a, 0x93, 0x56, 0x1d, 0xdf, 0x7f, - 0xc6, 0xce, 0x39, 0xb9, 0x0b, 0x15, 0x39, 0x25, 0xd0, 0x17, 0x9a, 0x51, 0x5c, 0x4a, 0x25, 0xd1, - 0x7e, 0x0f, 0x0c, 0xd9, 0xa1, 0x16, 0x4c, 0x45, 0xbb, 0x32, 0x5f, 0x7c, 0xaa, 0xee, 0x8c, 0xfd, - 0x2c, 0x79, 0xa4, 0xa6, 0x11, 0x5c, 0xce, 0x3e, 0xb4, 0xbc, 0x86, 0x92, 0x4c, 0x6a, 0x10, 0x81, - 0xcc, 0x76, 0x07, 0xcc, 0x6b, 0xe7, 0x3b, 0x4a, 0x00, 0x7a, 0x2e, 0x80, 0x4b, 0x26, 0x3e, 0xf6, - 0x4f, 0x01, 0xf2, 0xa9, 0x85, 0xb2, 0x5c, 0xb9, 0x8b, 0xb0, 0xdc, 0x87, 0x42, 0x35, 0x9e, 0xef, - 0xc6, 0x2c, 0x98, 0x7b, 0x75, 0x3e, 0xe7, 0xc8, 0xe8, 0x64, 0x15, 0xca, 0x38, 0x8c, 0x29, 0xe5, - 0xf1, 0x28, 0x9b, 0xc4, 0x20, 0xc5, 0x3e, 0x82, 0x86, 0x4c, 0x43, 0x94, 0x7d, 0x3d, 0x15, 0x5d, - 0xfe, 0x35, 0x79, 0x70, 0x05, 0x20, 0x8b, 0x9e, 0xe9, 0x58, 0xa9, 0x80, 0x11, 0x86, 0x71, 0xec, - 0x31, 0xdf, 0x4d, 0x5f, 0xa3, 0x20, 0xfb, 0x63, 0xa8, 0xa7, 0x67, 0xa8, 0xe6, 0x36, 0x4d, 0x86, - 0x52, 0x9a, 0xb2, 0xa6, 0x97, 0x2c, 0x7b, 0xa1, 0x9b, 0xe5, 0x42, 0xfb, 0xcf, 0x7a, 0xba, 0x52, - 0xf5, 0x79, 0x73, 0xe5, 0x95, 0xb6, 0x58, 0x5e, 0xcd, 0x97, 0x2a, 0xfa, 0xf7, 0x2a, 0x55, 0x3e, - 0x01, 0xcb, 0xc5, 0x7c, 0xed, 0x9d, 0xa5, 0x91, 0xad, 0xbd, 0x98, 0x9b, 0x55, 0x46, 0xf7, 0xce, - 0x18, 0xcd, 0x99, 0xc5, 0x5d, 0x92, 0xf0, 0x94, 0x05, 0xde, 0x37, 0xd8, 0xc8, 0x8a, 0x07, 0xe7, - 0x88, 0x7c, 0x2a, 0x20, 0x73, 0xb8, 0x9a, 0x0a, 0xa4, 0x03, 0x0e, 0x23, 0x1f, 0x70, 0x08, 0xa9, - 0x4d, 0x23, 0xce, 0xe2, 0x24, 0xad, 0xe5, 0x24, 0x94, 0xd5, 0x44, 0x96, 0xe2, 0x75, 0x82, 0xb1, - 0xfd, 0x29, 0x58, 0xd9, 0x5d, 0x44, 0x48, 0xd9, 0xdb, 0xdf, 0xeb, 0xca, 0x00, 0xd0, 0xdb, 0xeb, - 0x74, 0x7f, 0xdc, 0xd4, 0x44, 0x50, 0xa2, 0xdd, 0xe7, 0x5d, 0xda, 0xef, 0x36, 0x75, 0x11, 0x3c, - 0x3a, 0xdd, 0x9d, 0xee, 0xa0, 0xdb, 0x2c, 0x7d, 0x5e, 0x36, 0xab, 0x4d, 0x93, 0x9a, 0x6c, 0x16, - 0xf9, 0xde, 0xc8, 0x4b, 0xec, 0x43, 0x30, 0x77, 0x9d, 0xe8, 0x42, 0x5d, 0x9e, 0xe7, 0x9a, 0xa9, - 0x6a, 0xe6, 0x55, 0x5e, 0xb8, 0x07, 0x55, 0x15, 0x1d, 0x94, 0x35, 0xcd, 0x45, 0x8e, 0x94, 0x66, - 0xff, 0x56, 0x83, 0x9b, 0xbb, 0xe1, 0x19, 0xcb, 0x12, 0xea, 0x81, 0x73, 0xee, 0x87, 0x8e, 0xfb, - 0x12, 0xd5, 0xdd, 0x87, 0x1b, 0x3c, 0x9c, 0xc6, 0x23, 0x36, 0x5c, 0x18, 0x24, 0x34, 0x24, 0xfa, - 0xa9, 0x32, 0x41, 0x1b, 0x1a, 0x2e, 0xe3, 0x49, 0xce, 0x55, 0x42, 0xae, 0x9a, 0x40, 0xa6, 0x3c, - 0x59, 0x55, 0x50, 0x7e, 0x59, 0x55, 0x60, 0x7f, 0xa7, 0x41, 0xa3, 0x3b, 0x8b, 0xc2, 0x38, 0x49, - 0xaf, 0xf9, 0x9a, 0xa8, 0xac, 0xbf, 0x4e, 0x8d, 0xbf, 0x4c, 0x2b, 0x31, 0xfb, 0xba, 0x77, 0xed, - 0x84, 0xe3, 0x31, 0x18, 0x62, 0xb3, 0x29, 0x57, 0xe6, 0xd3, 0x12, 0xe7, 0xcd, 0x6d, 0xba, 0xde, - 0x47, 0x3a, 0x55, 0x7c, 0xc5, 0x0a, 0xa9, 0x3c, 0x57, 0x21, 0x7d, 0x06, 0x86, 0x64, 0x2d, 0xe8, - 0xb6, 0x06, 0xd5, 0xfe, 0xe1, 0xd6, 0x56, 0xb7, 0xdf, 0x6f, 0x6a, 0xa4, 0x01, 0x56, 0xe7, 0xf0, - 0x60, 0xa7, 0xb7, 0xb5, 0x39, 0x50, 0xfa, 0xdd, 0xde, 0xec, 0xed, 0x74, 0x3b, 0xcd, 0x92, 0xbd, - 0x05, 0xd6, 0x60, 0x16, 0xa8, 0xe5, 0xc5, 0xec, 0xa6, 0x5d, 0x93, 0xdd, 0xf4, 0x85, 0xec, 0xd6, - 0x87, 0x5a, 0xa1, 0xb2, 0x21, 0x6f, 0x43, 0x39, 0x99, 0x05, 0xf3, 0xb3, 0xcd, 0xf4, 0x0c, 0x8a, - 0x24, 0xf2, 0x36, 0xd4, 0x45, 0xdf, 0xe4, 0x70, 0xee, 0x8d, 0x03, 0xe6, 0xaa, 0x1d, 0x45, 0x2f, - 0xb5, 0xa9, 0x50, 0xf6, 0x1d, 0x68, 0x88, 0x46, 0xd5, 0x9b, 0x30, 0x9e, 0x38, 0x93, 0x08, 0x73, - 0xb1, 0x0a, 0xc0, 0x65, 0xaa, 0x27, 0xdc, 0xbe, 0x0f, 0xf5, 0x03, 0xc6, 0x62, 0xca, 0x78, 0x14, - 0x06, 0x1c, 0x9b, 0x16, 0x25, 0x51, 0x19, 0xed, 0x15, 0x64, 0x7f, 0x05, 0x96, 0xa8, 0x43, 0x9f, - 0x38, 0xc9, 0xe8, 0xe4, 0x87, 0xd4, 0xa9, 0xf7, 0xa1, 0x1a, 0x49, 0x4d, 0xa8, 0x4a, 0xb3, 0x8e, - 0x01, 0x47, 0x69, 0x87, 0xa6, 0x44, 0xfb, 0x23, 0x28, 0xed, 0x4d, 0x27, 0xc5, 0x49, 0x7f, 0x59, - 0xd6, 0x59, 0x73, 0x1d, 0x9a, 0x3e, 0xdf, 0xa1, 0xd9, 0x5f, 0x42, 0x2d, 0x7d, 0x6a, 0xcf, 0xc5, - 0x71, 0x3d, 0x8a, 0xba, 0xe7, 0xce, 0x49, 0x5e, 0xb6, 0x3e, 0x2c, 0x70, 0x7b, 0xa9, 0x8c, 0x24, - 0x30, 0xbf, 0xb7, 0x6a, 0xed, 0xb3, 0xbd, 0xb7, 0xa1, 0x9e, 0xd6, 0x8f, 0x58, 0xd4, 0x09, 0xe5, - 0xf9, 0x1e, 0x0b, 0x0a, 0x8a, 0x35, 0x25, 0x62, 0xc0, 0xaf, 0xb1, 0x51, 0xdb, 0x81, 0xc6, 0x13, - 0x67, 0x74, 0x3a, 0x8d, 0x0a, 0x51, 0xfe, 0x2a, 0x03, 0xb9, 0xc6, 0xd4, 0xdb, 0x60, 0xb2, 0xc0, - 0x8d, 0x42, 0x4f, 0x4d, 0x3b, 0x2d, 0x9a, 0xc1, 0xf6, 0x2f, 0x35, 0x58, 0x4e, 0xcf, 0x50, 0x7a, - 0x6c, 0x41, 0x75, 0x22, 0xc7, 0xad, 0xca, 0xe1, 0x53, 0x90, 0x7c, 0x90, 0x69, 0x58, 0x46, 0xe9, - 0xdb, 0x42, 0x77, 0xf3, 0xab, 0x17, 0x9c, 0xe6, 0xbf, 0xf1, 0x8d, 0x8d, 0xdf, 0x6b, 0x50, 0x16, - 0x96, 0x41, 0xee, 0x42, 0xb9, 0x3b, 0x3a, 0x09, 0xc9, 0x9c, 0x01, 0xb4, 0xe7, 0x20, 0x7b, 0x89, - 0xbc, 0x27, 0x67, 0xaa, 0xe9, 0xa8, 0xb8, 0x91, 0x1a, 0x16, 0x1a, 0xde, 0x05, 0xee, 0x75, 0xa8, - 0x7d, 0x1e, 0x7a, 0xc1, 0x96, 0x1c, 0x33, 0x92, 0x45, 0x33, 0xbc, 0xc0, 0xff, 0x3e, 0x18, 0x3d, - 0x2e, 0xec, 0xfd, 0x22, 0x2b, 0x76, 0x85, 0x45, 0x57, 0xb0, 0x97, 0x36, 0xfe, 0xa1, 0x43, 0xf9, - 0x4b, 0x16, 0x87, 0xe4, 0x3d, 0xa8, 0xaa, 0x19, 0x08, 0x29, 0xcc, 0x3a, 0xda, 0x18, 0xde, 0x16, - 0x86, 0x23, 0x78, 0x2b, 0x43, 0xe5, 0xcc, 0x7c, 0x30, 0xd3, 0xbe, 0x2c, 0x14, 0xda, 0x4b, 0x6b, - 0xda, 0x63, 0x8d, 0x3c, 0x02, 0x43, 0x7a, 0xfe, 0x82, 0x6c, 0x16, 0xbb, 0x1d, 0x7b, 0xe9, 0xb1, - 0x46, 0x1e, 0x40, 0xad, 0x7f, 0x12, 0x4e, 0x7d, 0xb7, 0xcf, 0xe2, 0x33, 0x46, 0x0a, 0xe3, 0xc0, - 0x76, 0xe1, 0xdb, 0x5e, 0x22, 0x6b, 0x00, 0xd2, 0x37, 0x0e, 0x3d, 0x97, 0x93, 0xaa, 0xa0, 0xed, - 0x4d, 0x27, 0x72, 0xd3, 0x82, 0xd3, 0x48, 0xce, 0x42, 0x84, 0xb8, 0x8e, 0xf3, 0x43, 0x68, 0x6c, - 0x61, 0xbc, 0xda, 0x8f, 0x37, 0x8f, 0xc2, 0x38, 0x21, 0x8b, 0x23, 0xc1, 0xf6, 0x22, 0xc2, 0x5e, - 0x22, 0x8f, 0xc1, 0x1c, 0xc4, 0xe7, 0x92, 0xff, 0x15, 0x15, 0xc7, 0xf2, 0xf3, 0x2e, 0x79, 0xe5, - 0xc6, 0x9f, 0x4a, 0x60, 0x7c, 0x11, 0xc6, 0xa7, 0x2c, 0x26, 0x0f, 0xc1, 0xc0, 0xb6, 0x54, 0x99, - 0x42, 0xd6, 0xa2, 0x5e, 0x76, 0xd0, 0x5d, 0xb0, 0x50, 0x28, 0x03, 0x87, 0x9f, 0x4a, 0xd1, 0xe3, - 0x3f, 0x74, 0x52, 0x2e, 0xb2, 0xfe, 0xb1, 0x97, 0xc8, 0x23, 0x58, 0xee, 0x27, 0x31, 0x73, 0x26, - 0x59, 0xdb, 0x3d, 0xd7, 0x2b, 0xb6, 0xab, 0xb2, 0x1d, 0xec, 0xa3, 0xb4, 0xdf, 0x85, 0x72, 0x5f, - 0xbe, 0x53, 0xb0, 0xe4, 0xff, 0x61, 0xb4, 0x97, 0x53, 0x44, 0xb6, 0xef, 0xff, 0x81, 0x21, 0x0b, - 0x17, 0xf9, 0xc8, 0xb9, 0xca, 0xae, 0xdd, 0x2c, 0xa2, 0xd4, 0x02, 0x1b, 0xaa, 0x07, 0xd3, 0x78, - 0xcc, 0x06, 0x7c, 0x41, 0xef, 0xa9, 0x06, 0xec, 0x25, 0xe1, 0xac, 0xd2, 0x35, 0xe5, 0xa6, 0x73, - 0x81, 0xa4, 0x4d, 0x2e, 0x7a, 0x2e, 0x8a, 0xdb, 0x90, 0x19, 0x50, 0x2e, 0x99, 0xcb, 0x86, 0xed, - 0x8b, 0x28, 0xf4, 0x8a, 0x26, 0x65, 0x23, 0xe6, 0x15, 0x2a, 0x07, 0x92, 0x4a, 0x61, 0xd1, 0x85, - 0xd6, 0x34, 0xf2, 0x29, 0x34, 0xe6, 0xaa, 0x0c, 0x82, 0x59, 0xf7, 0xb2, 0xc2, 0x63, 0x71, 0xf1, - 0x93, 0xe6, 0x77, 0x2f, 0x56, 0xb4, 0x3f, 0xbe, 0x58, 0xd1, 0xfe, 0xf2, 0x62, 0x45, 0xfb, 0xf6, - 0xaf, 0x2b, 0x4b, 0x47, 0x06, 0xfe, 0x15, 0xfc, 0xe1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x95, - 0x81, 0xd3, 0xe2, 0x25, 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_fc313e30f62637c5) } + +var fileDescriptor_pb_fc313e30f62637c5 = []byte{ + // 3128 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4b, 0x6f, 0xe3, 0xd6, + 0xd5, 0x26, 0x25, 0x51, 0xe4, 0x91, 0xe4, 0x51, 0x6e, 0x26, 0x13, 0x8d, 0x92, 0x78, 0x1c, 0x66, + 0x1e, 0xce, 0x4c, 0xe2, 0x6f, 0xe2, 0xe4, 0x43, 0x1e, 0x3b, 0x8f, 0x25, 0x0f, 0x94, 0xf1, 0xeb, + 0xbb, 0x92, 0x27, 0x5f, 0x03, 0x34, 0x02, 0x2d, 0x5e, 0xcb, 0xac, 0x29, 0x92, 0xe1, 0xa5, 0x0c, + 0x39, 0x8b, 0x02, 0xdd, 0xf4, 0x37, 0xa4, 0x9b, 0x2e, 0xba, 0x6c, 0xff, 0x40, 0xfb, 0x03, 0x0a, + 0x64, 0xd9, 0x55, 0x81, 0xee, 0x8a, 0xe9, 0xaa, 0xeb, 0xa2, 0xe8, 0xa2, 0x9b, 0xe2, 0x9e, 0x7b, + 0xf9, 0x90, 0xfc, 0x98, 0xa4, 0x45, 0x57, 0xe2, 0x79, 0xdc, 0xd7, 0x79, 0x9f, 0x23, 0x30, 0xa3, + 0xa3, 0xf5, 0x28, 0x0e, 0x93, 0x90, 0xe8, 0xd1, 0x51, 0xdb, 0x72, 0x22, 0x4f, 0x82, 0x76, 0x1b, + 0xca, 0x3b, 0x1e, 0x4f, 0x08, 0x81, 0xf2, 0xd4, 0x73, 0x79, 0x4b, 0x5b, 0x2d, 0xad, 0x19, 0x14, + 0xbf, 0xed, 0x5d, 0xb0, 0x06, 0x0e, 0x3f, 0x7d, 0xee, 0xf8, 0x53, 0x46, 0x9a, 0x50, 0x3a, 0x73, + 0xfc, 0x96, 0xb6, 0xaa, 0xad, 0xd5, 0xa9, 0xf8, 0x24, 0xeb, 0x60, 0x9e, 0x39, 0xfe, 0x30, 0x39, + 0x8f, 0x58, 0x4b, 0x5f, 0xd5, 0xd6, 0x96, 0x37, 0x5e, 0x5d, 0x8f, 0x8e, 0xd6, 0x0f, 0x42, 0x9e, + 0x78, 0xc1, 0x78, 0xfd, 0xb9, 0xe3, 0x0f, 0xce, 0x23, 0x46, 0xab, 0x67, 0xf2, 0xc3, 0xde, 0x87, + 0x5a, 0x3f, 0x1e, 0x6d, 0x4f, 0x83, 0x51, 0xe2, 0x85, 0x81, 0x38, 0x31, 0x70, 0x26, 0x0c, 0x77, + 0xb4, 0x28, 0x7e, 0x0b, 0x9c, 0x13, 0x8f, 0x79, 0xab, 0xb4, 0x5a, 0x12, 0x38, 0xf1, 0x4d, 0x5a, + 0x50, 0xf5, 0xf8, 0x56, 0x38, 0x0d, 0x92, 0x56, 0x79, 0x55, 0x5b, 0x33, 0x69, 0x0a, 0xda, 0x7f, + 0xd3, 0xa1, 0xf2, 0x7f, 0x53, 0x16, 0x9f, 0xe3, 0xba, 0x24, 0x89, 0xd3, 0xbd, 0xc4, 0x37, 0xb9, + 0x09, 0x15, 0xdf, 0x09, 0xc6, 0xbc, 0xa5, 0xe3, 0x66, 0x12, 0x20, 0x6f, 0x80, 0xe5, 0x1c, 0x27, + 0x2c, 0x1e, 0x4e, 0x3d, 0xb7, 0x55, 0x5a, 0xd5, 0xd6, 0x0c, 0x6a, 0x22, 0xe2, 0xd0, 0x73, 0xc9, + 0x6d, 0x30, 0xdd, 0x70, 0x38, 0x2a, 0x9e, 0xe5, 0x86, 0x78, 0x16, 0x79, 0x07, 0xcc, 0xa9, 0xe7, + 0x0e, 0x7d, 0x8f, 0x27, 0xad, 0xca, 0xaa, 0xb6, 0x56, 0xdb, 0x30, 0xc5, 0x63, 0x85, 0xec, 0x68, + 0x75, 0xea, 0xb9, 0x28, 0xc4, 0x87, 0x60, 0xf2, 0x78, 0x34, 0x3c, 0x9e, 0x06, 0xa3, 0x96, 0x81, + 0x4c, 0x37, 0x04, 0x53, 0xe1, 0xd5, 0xb4, 0xca, 0x25, 0x20, 0x9e, 0x15, 0xb3, 0x33, 0x16, 0x73, + 0xd6, 0xaa, 0xca, 0xa3, 0x14, 0x48, 0x1e, 0x43, 0xed, 0xd8, 0x19, 0xb1, 0x64, 0x18, 0x39, 0xb1, + 0x33, 0x69, 0x99, 0xf9, 0x46, 0xdb, 0x02, 0x7d, 0x20, 0xb0, 0x9c, 0xc2, 0x71, 0x06, 0x90, 0x0f, + 0xa1, 0x81, 0x10, 0x1f, 0x1e, 0x7b, 0x7e, 0xc2, 0xe2, 0x96, 0x85, 0x6b, 0x96, 0x71, 0x0d, 0x62, + 0x06, 0x31, 0x63, 0xb4, 0x2e, 0x99, 0x24, 0x86, 0xbc, 0x05, 0xc0, 0x66, 0x91, 0x13, 0xb8, 0x43, + 0xc7, 0xf7, 0x5b, 0x80, 0x77, 0xb0, 0x24, 0x66, 0xd3, 0xf7, 0xc9, 0xeb, 0xe2, 0x7e, 0x8e, 0x3b, + 0x4c, 0x78, 0xab, 0xb1, 0xaa, 0xad, 0x95, 0xa9, 0x21, 0xc0, 0x01, 0xb7, 0x37, 0xc0, 0x42, 0x8b, + 0xc0, 0x17, 0xdf, 0x03, 0xe3, 0x4c, 0x00, 0xd2, 0x70, 0x6a, 0x1b, 0x0d, 0x71, 0x64, 0x66, 0x34, + 0x54, 0x11, 0xed, 0x15, 0x30, 0x77, 0x9c, 0x60, 0x9c, 0x5a, 0x9a, 0x50, 0x05, 0x2e, 0xb0, 0x28, + 0x7e, 0xdb, 0xdf, 0xea, 0x60, 0x50, 0xc6, 0xa7, 0x7e, 0x42, 0x1e, 0x00, 0x08, 0x41, 0x4f, 0x9c, + 0x24, 0xf6, 0x66, 0x6a, 0xd7, 0x5c, 0xd4, 0xd6, 0xd4, 0x73, 0x77, 0x91, 0x44, 0x1e, 0x43, 0x1d, + 0x77, 0x4f, 0x59, 0xf5, 0xfc, 0x02, 0xd9, 0xfd, 0x68, 0x0d, 0x59, 0xd4, 0x8a, 0x5b, 0x60, 0xa0, + 0x6e, 0xa5, 0x7d, 0x35, 0xa8, 0x82, 0xc8, 0x3d, 0x58, 0xf6, 0x82, 0x44, 0xc8, 0x7e, 0x94, 0x0c, + 0x5d, 0xc6, 0x53, 0xe5, 0x37, 0x32, 0x6c, 0x87, 0xf1, 0x84, 0x7c, 0x00, 0x52, 0x80, 0xe9, 0x81, + 0x15, 0x3c, 0x70, 0x39, 0x53, 0x0c, 0x97, 0x27, 0x22, 0x8f, 0x3a, 0xf1, 0x7d, 0xa8, 0x89, 0xf7, + 0xa5, 0x2b, 0x0c, 0x5c, 0x51, 0xc7, 0xd7, 0x28, 0x71, 0x50, 0x10, 0x0c, 0x8a, 0x5d, 0x88, 0x46, + 0x18, 0x98, 0x34, 0x08, 0xfc, 0xb6, 0xbb, 0x50, 0xd9, 0x8f, 0x5d, 0x16, 0x5f, 0x6a, 0xe3, 0x04, + 0xca, 0x2e, 0xe3, 0x23, 0x74, 0x3f, 0x93, 0xe2, 0x77, 0x6e, 0xf7, 0xa5, 0x82, 0xdd, 0xdb, 0xbf, + 0xd4, 0xa0, 0xd6, 0x0f, 0xe3, 0x64, 0x97, 0x71, 0xee, 0x8c, 0x19, 0xb9, 0x03, 0x95, 0x50, 0x6c, + 0xab, 0x24, 0x6c, 0x89, 0x3b, 0xe1, 0x39, 0x54, 0xe2, 0x17, 0xf4, 0xa0, 0x5f, 0xad, 0x87, 0x9b, + 0x50, 0x91, 0x1e, 0x23, 0xbc, 0xa9, 0x42, 0x25, 0x20, 0x64, 0x1d, 0x1e, 0x1f, 0x73, 0x26, 0x65, + 0x59, 0xa1, 0x0a, 0xba, 0xda, 0xac, 0xfe, 0x17, 0x40, 0xdc, 0xef, 0x07, 0x5a, 0x81, 0x7d, 0x02, + 0x35, 0xea, 0x1c, 0x27, 0x5b, 0x61, 0x90, 0xb0, 0x59, 0x42, 0x96, 0x41, 0xf7, 0x5c, 0x14, 0x91, + 0x41, 0x75, 0xcf, 0x15, 0x97, 0x1b, 0xc7, 0xe1, 0x34, 0x42, 0x09, 0x35, 0xa8, 0x04, 0x50, 0x94, + 0xae, 0x1b, 0xe3, 0x8d, 0x85, 0x28, 0x5d, 0x37, 0x26, 0x77, 0xa0, 0xc6, 0x03, 0x27, 0xe2, 0x27, + 0x61, 0x22, 0x2e, 0x57, 0xc6, 0xcb, 0x41, 0x8a, 0x1a, 0x70, 0xfb, 0xf7, 0x1a, 0x18, 0xbb, 0x6c, + 0x72, 0xc4, 0xe2, 0x0b, 0xa7, 0xdc, 0x06, 0x13, 0x37, 0x1e, 0x7a, 0xae, 0x3a, 0xa8, 0x8a, 0x70, + 0xcf, 0xbd, 0xf4, 0xa8, 0x5b, 0x60, 0xf8, 0xcc, 0x11, 0xc2, 0x97, 0x76, 0xa6, 0x20, 0x21, 0x1b, + 0x67, 0x32, 0x74, 0x99, 0xe3, 0x62, 0x88, 0x31, 0xa9, 0xe1, 0x4c, 0x3a, 0xcc, 0x71, 0xc5, 0xdd, + 0x7c, 0x87, 0x27, 0xc3, 0x69, 0xe4, 0x3a, 0x09, 0xc3, 0xd0, 0x52, 0x16, 0x86, 0xc3, 0x93, 0x43, + 0xc4, 0x90, 0x87, 0xf0, 0xca, 0xc8, 0x9f, 0x72, 0x11, 0xd7, 0xbc, 0xe0, 0x38, 0x1c, 0x86, 0x81, + 0x7f, 0x8e, 0xf2, 0x35, 0xe9, 0x0d, 0x45, 0xe8, 0x05, 0xc7, 0xe1, 0x7e, 0xe0, 0x9f, 0xdb, 0xff, + 0xd4, 0xa0, 0xf2, 0x14, 0xc5, 0xf0, 0x18, 0xaa, 0x13, 0x7c, 0x50, 0xea, 0xbd, 0xb7, 0x84, 0x84, + 0x91, 0xb6, 0x2e, 0x5f, 0xca, 0xbb, 0x41, 0x12, 0x9f, 0xd3, 0x94, 0x4d, 0xac, 0x48, 0x9c, 0x23, + 0x9f, 0x25, 0x5c, 0x59, 0x44, 0x61, 0xc5, 0x40, 0x12, 0xd4, 0x0a, 0xc5, 0xd6, 0xde, 0x86, 0x7a, + 0x71, 0x2b, 0x91, 0x46, 0x4e, 0xd9, 0x39, 0xca, 0xae, 0x4c, 0xc5, 0x27, 0x59, 0x85, 0x0a, 0x3a, + 0x29, 0x4a, 0xae, 0xb6, 0x01, 0x62, 0x47, 0xb9, 0x84, 0x4a, 0xc2, 0x67, 0xfa, 0x27, 0x9a, 0xd8, + 0xa7, 0x78, 0x40, 0x71, 0x1f, 0xeb, 0xea, 0x7d, 0xe4, 0x92, 0xc2, 0x3e, 0xf6, 0x3f, 0x34, 0xa8, + 0x7f, 0xc9, 0xe2, 0xf0, 0x20, 0x0e, 0xa3, 0x90, 0x3b, 0x3e, 0xb1, 0xc1, 0x90, 0xaf, 0xbb, 0xe4, + 0x7c, 0x45, 0x11, 0x3c, 0xf2, 0x3d, 0xa8, 0xc6, 0xf9, 0xbd, 0x15, 0x85, 0xac, 0x00, 0x4c, 0x9c, + 0xd9, 0x0e, 0x73, 0x38, 0xeb, 0xb9, 0xa9, 0xf9, 0xe4, 0x18, 0xd2, 0x06, 0x73, 0xe2, 0xcc, 0x06, + 0xb3, 0x60, 0xc0, 0x51, 0xbb, 0x65, 0x9a, 0xc1, 0xe4, 0x4d, 0xb0, 0x26, 0xce, 0x4c, 0xd8, 0x71, + 0xcf, 0x55, 0xda, 0xcd, 0x11, 0xe4, 0x6d, 0x28, 0x25, 0xb3, 0x00, 0x83, 0x82, 0xc8, 0x03, 0x22, + 0x77, 0x0f, 0x66, 0x81, 0xb2, 0x78, 0x2a, 0x68, 0xa9, 0x34, 0xcc, 0x5c, 0x1a, 0x4d, 0x28, 0x8d, + 0x3c, 0x17, 0x13, 0x81, 0x45, 0xc5, 0xa7, 0xfd, 0xdb, 0x12, 0xdc, 0x50, 0xaa, 0x38, 0xf1, 0xa2, + 0x7e, 0x22, 0xec, 0xa6, 0x05, 0x55, 0x74, 0x57, 0x16, 0x2b, 0x8d, 0xa4, 0x20, 0xf9, 0x18, 0x0c, + 0x34, 0xe1, 0x54, 0xd1, 0x77, 0x72, 0xb1, 0x64, 0xcb, 0xa5, 0xe2, 0x95, 0xc6, 0x15, 0x3b, 0xf9, + 0x08, 0x2a, 0xdf, 0xb0, 0x38, 0x94, 0xe1, 0xa7, 0xb6, 0xb1, 0x72, 0xd9, 0x3a, 0xa1, 0x00, 0xb5, + 0x4c, 0x32, 0xff, 0x17, 0xa5, 0x77, 0x57, 0x04, 0x9c, 0x49, 0x78, 0xc6, 0xdc, 0x56, 0x15, 0x6f, + 0x54, 0x54, 0x70, 0x4a, 0x4a, 0xc5, 0x65, 0x66, 0xe2, 0x6a, 0x77, 0xa0, 0x56, 0x78, 0x5e, 0xd1, + 0xde, 0x1a, 0x52, 0xc2, 0x77, 0xe6, 0xed, 0xcd, 0xca, 0x3c, 0xa1, 0x68, 0xb6, 0x1d, 0x80, 0xfc, + 0xb1, 0xff, 0xae, 0xf1, 0xdb, 0x3f, 0xd3, 0xe0, 0xc6, 0x56, 0x18, 0x04, 0x0c, 0x6b, 0x08, 0xa9, + 0xba, 0xdc, 0x6e, 0xb5, 0x2b, 0xed, 0xf6, 0x5d, 0xa8, 0x70, 0xc1, 0xac, 0x76, 0x7f, 0xf5, 0x12, + 0x5d, 0x50, 0xc9, 0x21, 0x42, 0xcc, 0xc4, 0x99, 0x0d, 0x23, 0x16, 0xb8, 0x5e, 0x30, 0x46, 0x3b, + 0x97, 0x1a, 0x38, 0x90, 0x18, 0xfb, 0x57, 0x1a, 0x18, 0xd2, 0xe4, 0xe7, 0xc2, 0x9d, 0x36, 0x1f, + 0xee, 0xde, 0x04, 0x2b, 0x8a, 0x99, 0xeb, 0x8d, 0xd2, 0x53, 0x2d, 0x9a, 0x23, 0x44, 0x34, 0x3e, + 0x0e, 0xe3, 0x11, 0xc3, 0xed, 0x4d, 0x2a, 0x01, 0x51, 0x92, 0x61, 0x4a, 0xc0, 0xa0, 0x25, 0x23, + 0xa2, 0x29, 0x10, 0x22, 0x5a, 0x89, 0x25, 0x3c, 0x72, 0x46, 0xb2, 0x48, 0x2a, 0x51, 0x09, 0x88, + 0x08, 0x2a, 0x35, 0x87, 0x1a, 0x33, 0xa9, 0x82, 0xec, 0x5f, 0xeb, 0x50, 0xef, 0x78, 0x31, 0x1b, + 0x25, 0xcc, 0xed, 0xba, 0x63, 0x64, 0x64, 0x41, 0xe2, 0x25, 0xe7, 0x2a, 0x5a, 0x2b, 0x28, 0x4b, + 0xa6, 0xfa, 0x7c, 0xc1, 0x28, 0x75, 0x51, 0xc2, 0x1a, 0x57, 0x02, 0x64, 0x03, 0x40, 0x96, 0x19, + 0x58, 0xe7, 0x96, 0xaf, 0xae, 0x73, 0x2d, 0x64, 0x13, 0x9f, 0x42, 0x40, 0x72, 0x8d, 0x27, 0x23, + 0xb9, 0x81, 0x45, 0xf0, 0x54, 0x18, 0x32, 0x66, 0xe7, 0x23, 0xe6, 0xa3, 0xa1, 0x62, 0x76, 0x3e, + 0x62, 0x7e, 0x56, 0x13, 0x55, 0xe5, 0x75, 0xc4, 0x37, 0x79, 0x07, 0xf4, 0x30, 0xc2, 0xf7, 0xa9, + 0x03, 0x8b, 0x0f, 0x5b, 0xdf, 0x8f, 0xa8, 0x1e, 0x46, 0xc2, 0x0a, 0x64, 0x51, 0xd7, 0xb2, 0x94, + 0x71, 0x8b, 0xf0, 0x80, 0xe5, 0x08, 0x55, 0x14, 0xfb, 0x16, 0xe8, 0xfb, 0x11, 0xa9, 0x42, 0xa9, + 0xdf, 0x1d, 0x34, 0x97, 0xc4, 0x47, 0xa7, 0xbb, 0xd3, 0xd4, 0xec, 0x17, 0x1a, 0x58, 0xbb, 0xd3, + 0xc4, 0x11, 0x36, 0xc5, 0xaf, 0x53, 0xea, 0x6d, 0x30, 0x79, 0xe2, 0xc4, 0x98, 0x17, 0x75, 0x19, + 0x26, 0x10, 0x1e, 0x70, 0x72, 0x1f, 0x2a, 0xcc, 0x1d, 0xb3, 0xd4, 0xdb, 0x9b, 0x8b, 0xf7, 0xa4, + 0x92, 0x4c, 0xd6, 0xc0, 0xe0, 0xa3, 0x13, 0x36, 0x71, 0x5a, 0xe5, 0x9c, 0xb1, 0x8f, 0x18, 0x99, + 0xc2, 0xa8, 0xa2, 0x63, 0x0d, 0x1e, 0x87, 0x11, 0x16, 0xa5, 0x15, 0x55, 0x83, 0xc7, 0x61, 0x24, + 0x4a, 0xd2, 0x0d, 0x78, 0xcd, 0x1b, 0x07, 0x61, 0xcc, 0x86, 0x5e, 0xe0, 0xb2, 0xd9, 0x70, 0x14, + 0x06, 0xc7, 0xbe, 0x37, 0x4a, 0x50, 0x96, 0x26, 0x7d, 0x55, 0x12, 0x7b, 0x82, 0xb6, 0xa5, 0x48, + 0xf6, 0x3b, 0x60, 0x3d, 0x63, 0xe7, 0x58, 0x10, 0x72, 0x72, 0x0b, 0xf4, 0xd3, 0x33, 0x95, 0xeb, + 0x0c, 0x71, 0x83, 0x67, 0xcf, 0xa9, 0x7e, 0x7a, 0x66, 0xbb, 0x60, 0xf6, 0x55, 0xa2, 0x27, 0xef, + 0x8a, 0x90, 0x88, 0xa1, 0x55, 0x39, 0x16, 0x56, 0xde, 0x85, 0x1a, 0x83, 0xa6, 0x74, 0xa1, 0x4b, + 0xbc, 0x88, 0x12, 0x8a, 0x04, 0x8a, 0x15, 0x4e, 0x69, 0xae, 0xc2, 0xf9, 0xb9, 0x0e, 0x66, 0x96, + 0x76, 0x1e, 0x81, 0x35, 0x49, 0x65, 0xaf, 0xdc, 0x13, 0x4b, 0xd7, 0x4c, 0x21, 0x34, 0xa7, 0xab, + 0x7b, 0x97, 0x17, 0xef, 0x9d, 0xfb, 0x77, 0xe5, 0xa5, 0xfe, 0xfd, 0x00, 0x6e, 0x8c, 0x7c, 0xe6, + 0x04, 0xc3, 0xdc, 0x3d, 0xa5, 0x05, 0x2e, 0x23, 0xfa, 0x20, 0xf3, 0x51, 0x15, 0xa3, 0xaa, 0x79, + 0x2a, 0xb9, 0x07, 0x15, 0x97, 0xf9, 0x89, 0x53, 0xec, 0x44, 0xf6, 0x63, 0x67, 0xe4, 0xb3, 0x8e, + 0x40, 0x53, 0x49, 0x25, 0x6b, 0x60, 0xa6, 0xd5, 0x92, 0xea, 0x3f, 0xb0, 0xd0, 0x4d, 0x05, 0x4b, + 0x33, 0xaa, 0xfd, 0x16, 0x94, 0x9e, 0x3d, 0xef, 0x5f, 0xa9, 0x8d, 0xaf, 0x40, 0x7f, 0xf6, 0xbc, + 0x18, 0x2b, 0xeb, 0x59, 0x4a, 0x13, 0x1d, 0xa8, 0x9e, 0x77, 0xa0, 0x6d, 0x30, 0xa7, 0x9c, 0xc5, + 0xbb, 0x2c, 0x71, 0x94, 0xd3, 0x66, 0xb0, 0x48, 0x6d, 0xa2, 0x9d, 0xf2, 0xc2, 0x40, 0xa5, 0x93, + 0x14, 0xb4, 0xff, 0x5a, 0x82, 0xaa, 0x72, 0x5e, 0xb1, 0xe7, 0x34, 0x2b, 0xe5, 0xc4, 0x67, 0x1e, + 0x05, 0xf4, 0x62, 0x14, 0x28, 0xf6, 0xba, 0xa5, 0x97, 0xf7, 0xba, 0xe4, 0x33, 0xa8, 0x47, 0x92, + 0x56, 0x8c, 0x1b, 0xaf, 0x17, 0xd7, 0xa8, 0x5f, 0x5c, 0x57, 0x8b, 0x72, 0x40, 0x78, 0x00, 0x36, + 0x0d, 0x89, 0x33, 0x46, 0xc5, 0xd6, 0x69, 0x55, 0xc0, 0x03, 0x67, 0x7c, 0x45, 0xf4, 0xf8, 0x1e, + 0x41, 0x40, 0x94, 0xac, 0x61, 0xd4, 0xaa, 0xa3, 0x63, 0x8b, 0xc0, 0x51, 0xf4, 0xe9, 0xc6, 0xbc, + 0x4f, 0xbf, 0x01, 0xd6, 0x28, 0x9c, 0x4c, 0x3c, 0xa4, 0x2d, 0xcb, 0x64, 0x2b, 0x11, 0x03, 0x6e, + 0x7f, 0x03, 0x55, 0xf5, 0x58, 0x52, 0x83, 0x6a, 0xa7, 0xbb, 0xbd, 0x79, 0xb8, 0x23, 0xa2, 0x0a, + 0x80, 0xf1, 0xa4, 0xb7, 0xb7, 0x49, 0x7f, 0xd4, 0xd4, 0x44, 0x84, 0xe9, 0xed, 0x0d, 0x9a, 0x3a, + 0xb1, 0xa0, 0xb2, 0xbd, 0xb3, 0xbf, 0x39, 0x68, 0x96, 0x88, 0x09, 0xe5, 0x27, 0xfb, 0xfb, 0x3b, + 0xcd, 0x32, 0xa9, 0x83, 0xd9, 0xd9, 0x1c, 0x74, 0x07, 0xbd, 0xdd, 0x6e, 0xb3, 0x22, 0x78, 0x9f, + 0x76, 0xf7, 0x9b, 0x86, 0xf8, 0x38, 0xec, 0x75, 0x9a, 0x55, 0x41, 0x3f, 0xd8, 0xec, 0xf7, 0xbf, + 0xd8, 0xa7, 0x9d, 0xa6, 0x29, 0xf6, 0xed, 0x0f, 0x68, 0x6f, 0xef, 0x69, 0xd3, 0xb2, 0x3f, 0x80, + 0x5a, 0x41, 0x68, 0x62, 0x05, 0xed, 0x6e, 0x37, 0x97, 0xc4, 0x31, 0xcf, 0x37, 0x77, 0x0e, 0xbb, + 0x4d, 0x8d, 0x2c, 0x03, 0xe0, 0xe7, 0x70, 0x67, 0x73, 0xef, 0x69, 0x53, 0xb7, 0x7f, 0x9a, 0x2d, + 0xc1, 0xde, 0xf3, 0x01, 0x98, 0x4a, 0xd2, 0x69, 0xc9, 0x5b, 0x2b, 0xa8, 0x84, 0x66, 0x44, 0x61, + 0x59, 0xa3, 0x13, 0x36, 0x3a, 0xe5, 0xd3, 0x89, 0x32, 0x84, 0x0c, 0x96, 0x6d, 0xa4, 0x10, 0x47, + 0xea, 0xdf, 0x12, 0xca, 0x46, 0x28, 0x65, 0xe4, 0x97, 0x23, 0x94, 0x8f, 0x00, 0xf2, 0xa6, 0xfd, + 0x92, 0xa2, 0xf5, 0x26, 0x54, 0x1c, 0xdf, 0x73, 0xb8, 0x4a, 0x44, 0x12, 0xb0, 0xf7, 0xa0, 0x56, + 0x68, 0xf5, 0x85, 0xae, 0x1c, 0xdf, 0x1f, 0x9e, 0xb2, 0x73, 0x8e, 0x6b, 0x4d, 0x5a, 0x75, 0x7c, + 0xff, 0x19, 0x3b, 0xe7, 0xe4, 0x2e, 0x54, 0xe4, 0x94, 0x40, 0x5f, 0x68, 0x46, 0x71, 0x29, 0x95, + 0x44, 0xfb, 0x3d, 0x30, 0x64, 0x87, 0x5a, 0x30, 0x15, 0xed, 0xca, 0x7c, 0xf1, 0xa9, 0xba, 0x33, + 0xf6, 0xb3, 0xe4, 0x91, 0x9a, 0x46, 0x70, 0x39, 0xfb, 0xd0, 0xf2, 0x1a, 0x4a, 0x32, 0xa9, 0x41, + 0x04, 0x32, 0xdb, 0x1d, 0x30, 0xaf, 0x9d, 0xef, 0x28, 0x01, 0xe8, 0xb9, 0x00, 0x2e, 0x99, 0xf8, + 0xd8, 0x3f, 0x01, 0xc8, 0xa7, 0x16, 0xca, 0x72, 0xe5, 0x2e, 0xc2, 0x72, 0x1f, 0x0a, 0xd5, 0x78, + 0xbe, 0x1b, 0xb3, 0x60, 0xee, 0xd5, 0xf9, 0x9c, 0x23, 0xa3, 0x93, 0x55, 0x28, 0xe3, 0x30, 0xa6, + 0x94, 0xc7, 0xa3, 0x6c, 0x12, 0x83, 0x14, 0xfb, 0x08, 0x1a, 0x32, 0x0d, 0x51, 0xf6, 0xf5, 0x54, + 0x74, 0xf9, 0xd7, 0xe4, 0xc1, 0x15, 0x80, 0x2c, 0x7a, 0xa6, 0x63, 0xa5, 0x02, 0x46, 0x18, 0xc6, + 0xb1, 0xc7, 0x7c, 0x37, 0x7d, 0x8d, 0x82, 0xec, 0x8f, 0xa1, 0x9e, 0x9e, 0xa1, 0x9a, 0xdb, 0x34, + 0x19, 0x4a, 0x69, 0xca, 0x9a, 0x5e, 0xb2, 0xec, 0x85, 0x6e, 0x96, 0x0b, 0xed, 0x3f, 0xe9, 0xe9, + 0x4a, 0xd5, 0xe7, 0xcd, 0x95, 0x57, 0xda, 0x62, 0x79, 0x35, 0x5f, 0xaa, 0xe8, 0xdf, 0xab, 0x54, + 0xf9, 0x04, 0x2c, 0x17, 0xf3, 0xb5, 0x77, 0x96, 0x46, 0xb6, 0xf6, 0x62, 0x6e, 0x56, 0x19, 0xdd, + 0x3b, 0x63, 0x34, 0x67, 0x16, 0x77, 0x49, 0xc2, 0x53, 0x16, 0x78, 0xdf, 0x60, 0x23, 0x2b, 0x1e, + 0x9c, 0x23, 0xf2, 0xa9, 0x80, 0xcc, 0xe1, 0x6a, 0x2a, 0x90, 0x0e, 0x38, 0x8c, 0x7c, 0xc0, 0x21, + 0xa4, 0x36, 0x8d, 0x38, 0x8b, 0x93, 0xb4, 0x96, 0x93, 0x50, 0x56, 0x13, 0x59, 0x8a, 0xd7, 0x09, + 0xc6, 0xf6, 0xa7, 0x60, 0x65, 0x77, 0x11, 0x21, 0x65, 0x6f, 0x7f, 0xaf, 0x2b, 0x03, 0x40, 0x6f, + 0xaf, 0xd3, 0xfd, 0xff, 0xa6, 0x26, 0x82, 0x12, 0xed, 0x3e, 0xef, 0xd2, 0x7e, 0xb7, 0xa9, 0x8b, + 0xe0, 0xd1, 0xe9, 0xee, 0x74, 0x07, 0xdd, 0x66, 0xe9, 0xf3, 0xb2, 0x59, 0x6d, 0x9a, 0xd4, 0x64, + 0xb3, 0xc8, 0xf7, 0x46, 0x5e, 0x62, 0x1f, 0x82, 0xb9, 0xeb, 0x44, 0x17, 0xea, 0xf2, 0x3c, 0xd7, + 0x4c, 0x55, 0x33, 0xaf, 0xf2, 0xc2, 0x3d, 0xa8, 0xaa, 0xe8, 0xa0, 0xac, 0x69, 0x2e, 0x72, 0xa4, + 0x34, 0xfb, 0x37, 0x1a, 0xdc, 0xdc, 0x0d, 0xcf, 0x58, 0x96, 0x50, 0x0f, 0x9c, 0x73, 0x3f, 0x74, + 0xdc, 0x97, 0xa8, 0xee, 0x3e, 0xdc, 0xe0, 0xe1, 0x34, 0x1e, 0xb1, 0xe1, 0xc2, 0x20, 0xa1, 0x21, + 0xd1, 0x4f, 0x95, 0x09, 0xda, 0xd0, 0x70, 0x19, 0x4f, 0x72, 0xae, 0x12, 0x72, 0xd5, 0x04, 0x32, + 0xe5, 0xc9, 0xaa, 0x82, 0xf2, 0xcb, 0xaa, 0x02, 0xfb, 0x3b, 0x0d, 0x1a, 0xdd, 0x59, 0x14, 0xc6, + 0x49, 0x7a, 0xcd, 0xd7, 0x44, 0x65, 0xfd, 0x75, 0x6a, 0xfc, 0x65, 0x5a, 0x89, 0xd9, 0xd7, 0xbd, + 0x6b, 0x27, 0x1c, 0x8f, 0xc1, 0x10, 0x9b, 0x4d, 0xb9, 0x32, 0x9f, 0x96, 0x38, 0x6f, 0x6e, 0xd3, + 0xf5, 0x3e, 0xd2, 0xa9, 0xe2, 0x2b, 0x56, 0x48, 0xe5, 0xb9, 0x0a, 0xe9, 0x33, 0x30, 0x24, 0x6b, + 0x41, 0xb7, 0x35, 0xa8, 0xf6, 0x0f, 0xb7, 0xb6, 0xba, 0xfd, 0x7e, 0x53, 0x23, 0x0d, 0xb0, 0x3a, + 0x87, 0x07, 0x3b, 0xbd, 0xad, 0xcd, 0x81, 0xd2, 0xef, 0xf6, 0x66, 0x6f, 0xa7, 0xdb, 0x69, 0x96, + 0xec, 0x2d, 0xb0, 0x06, 0xb3, 0x40, 0x2d, 0x2f, 0x66, 0x37, 0xed, 0x9a, 0xec, 0xa6, 0x2f, 0x64, + 0xb7, 0x3e, 0xd4, 0x0a, 0x95, 0x0d, 0x79, 0x1b, 0xca, 0xc9, 0x2c, 0x98, 0x9f, 0x6d, 0xa6, 0x67, + 0x50, 0x24, 0x91, 0xb7, 0xa1, 0x2e, 0xfa, 0x26, 0x87, 0x73, 0x6f, 0x1c, 0x30, 0x57, 0xed, 0x28, + 0x7a, 0xa9, 0x4d, 0x85, 0xb2, 0xef, 0x40, 0x43, 0x34, 0xaa, 0xde, 0x84, 0xf1, 0xc4, 0x99, 0x44, + 0x98, 0x8b, 0x55, 0x00, 0x2e, 0x53, 0x3d, 0xe1, 0xf6, 0x7d, 0xa8, 0x1f, 0x30, 0x16, 0x53, 0xc6, + 0xa3, 0x30, 0xe0, 0xd8, 0xb4, 0x28, 0x89, 0xca, 0x68, 0xaf, 0x20, 0xfb, 0x2b, 0xb0, 0x44, 0x1d, + 0xfa, 0xc4, 0x49, 0x46, 0x27, 0x3f, 0xa4, 0x4e, 0xbd, 0x0f, 0xd5, 0x48, 0x6a, 0x42, 0x55, 0x9a, + 0x75, 0x0c, 0x38, 0x4a, 0x3b, 0x34, 0x25, 0xda, 0x1f, 0x41, 0x69, 0x6f, 0x3a, 0x29, 0x4e, 0xfa, + 0xcb, 0xb2, 0xce, 0x9a, 0xeb, 0xd0, 0xf4, 0xf9, 0x0e, 0xcd, 0xfe, 0x12, 0x6a, 0xe9, 0x53, 0x7b, + 0x2e, 0x8e, 0xeb, 0x51, 0xd4, 0x3d, 0x77, 0x4e, 0xf2, 0xb2, 0xf5, 0x61, 0x81, 0xdb, 0x4b, 0x65, + 0x24, 0x81, 0xf9, 0xbd, 0x55, 0x6b, 0x9f, 0xed, 0xbd, 0x0d, 0xf5, 0xb4, 0x7e, 0xc4, 0xa2, 0x4e, + 0x28, 0xcf, 0xf7, 0x58, 0x50, 0x50, 0xac, 0x29, 0x11, 0x03, 0x7e, 0x8d, 0x8d, 0xda, 0x3f, 0x86, + 0xc6, 0x13, 0x67, 0x74, 0x3a, 0x8d, 0x0a, 0x51, 0xfe, 0x2a, 0x03, 0xb9, 0xc6, 0xd4, 0x6f, 0x81, + 0x91, 0x38, 0xf1, 0x58, 0xcd, 0x81, 0x2c, 0xaa, 0x20, 0xfb, 0x17, 0x1a, 0x2c, 0xa7, 0xfb, 0x2b, + 0x1d, 0xb6, 0xa0, 0x3a, 0x91, 0xa3, 0x56, 0xe5, 0xec, 0x29, 0x48, 0x3e, 0xc8, 0xb4, 0x2b, 0x23, + 0xf4, 0x6d, 0xa1, 0xb7, 0xf9, 0xd5, 0x0b, 0x0e, 0xf3, 0x9f, 0xf8, 0xc5, 0xc6, 0xef, 0x34, 0x28, + 0x0b, 0xab, 0x20, 0x77, 0xa1, 0xdc, 0x1d, 0x9d, 0x84, 0x64, 0x4e, 0xf9, 0xed, 0x39, 0xc8, 0x5e, + 0x22, 0xef, 0xc9, 0x79, 0x6a, 0x3a, 0x26, 0x6e, 0xa4, 0x46, 0x85, 0x46, 0x77, 0x81, 0x7b, 0x1d, + 0x6a, 0x9f, 0x87, 0x5e, 0xb0, 0x25, 0x47, 0x8c, 0x64, 0xd1, 0x04, 0x2f, 0xf0, 0xbf, 0x0f, 0x46, + 0x8f, 0x0b, 0x5b, 0xbf, 0xc8, 0x8a, 0x1d, 0x61, 0xd1, 0x0d, 0xec, 0xa5, 0x8d, 0xbf, 0xeb, 0x50, + 0xfe, 0x92, 0xc5, 0x21, 0x79, 0x0f, 0xaa, 0x6a, 0xfe, 0x41, 0x0a, 0x73, 0x8e, 0x36, 0x86, 0xb6, + 0x85, 0xc1, 0x08, 0xde, 0xca, 0x50, 0xf9, 0x32, 0x1f, 0xca, 0xb4, 0x2f, 0x0b, 0x83, 0xf6, 0xd2, + 0x9a, 0xf6, 0x58, 0x23, 0x8f, 0xc0, 0x90, 0x5e, 0xbf, 0x20, 0x9b, 0xc5, 0x4e, 0xc7, 0x5e, 0x7a, + 0xac, 0x91, 0x07, 0x50, 0xeb, 0x9f, 0x84, 0x53, 0xdf, 0xed, 0xb3, 0xf8, 0x8c, 0x91, 0xc2, 0x28, + 0xb0, 0x5d, 0xf8, 0xb6, 0x97, 0xc8, 0x1a, 0x80, 0xf4, 0x8b, 0x43, 0xcf, 0xe5, 0xa4, 0x2a, 0x68, + 0x7b, 0xd3, 0x89, 0xdc, 0xb4, 0xe0, 0x30, 0x92, 0xb3, 0x10, 0x1d, 0xae, 0xe3, 0xfc, 0x10, 0x1a, + 0x5b, 0x18, 0xab, 0xf6, 0xe3, 0xcd, 0xa3, 0x30, 0x4e, 0xc8, 0xe2, 0x38, 0xb0, 0xbd, 0x88, 0xb0, + 0x97, 0xc8, 0x63, 0x30, 0x07, 0xf1, 0xb9, 0xe4, 0x7f, 0x45, 0xc5, 0xb0, 0xfc, 0xbc, 0x4b, 0x5e, + 0xb9, 0xf1, 0xc7, 0x12, 0x18, 0x5f, 0x84, 0xf1, 0x29, 0x8b, 0xc9, 0x43, 0x30, 0xb0, 0x25, 0x55, + 0xa6, 0x90, 0xb5, 0xa7, 0x97, 0x1d, 0x74, 0x17, 0x2c, 0x14, 0xca, 0xc0, 0xe1, 0xa7, 0x52, 0xf4, + 0xf8, 0xef, 0x9c, 0x94, 0x8b, 0xac, 0x7d, 0xec, 0x25, 0xf2, 0x08, 0x96, 0xfb, 0x49, 0xcc, 0x9c, + 0x49, 0xd6, 0x72, 0xcf, 0xf5, 0x89, 0xed, 0xaa, 0x6c, 0x05, 0xfb, 0x28, 0xed, 0x77, 0xa1, 0xdc, + 0x97, 0xef, 0x14, 0x2c, 0xf9, 0xff, 0x17, 0xed, 0xe5, 0x14, 0x91, 0xed, 0xfb, 0x3f, 0x60, 0xc8, + 0xa2, 0x45, 0x3e, 0x72, 0xae, 0xaa, 0x6b, 0x37, 0x8b, 0x28, 0xb5, 0xc0, 0x86, 0xea, 0xc1, 0x34, + 0x1e, 0xb3, 0x01, 0x5f, 0xd0, 0x7b, 0xaa, 0x01, 0x7b, 0x49, 0x38, 0xab, 0x74, 0x4d, 0xb9, 0xe9, + 0x5c, 0x10, 0x69, 0x93, 0x8b, 0x9e, 0x8b, 0xe2, 0x36, 0x64, 0xf6, 0x93, 0x4b, 0xe6, 0x32, 0x61, + 0xfb, 0x22, 0x0a, 0xbd, 0xa2, 0x49, 0xd9, 0x88, 0x79, 0x85, 0xaa, 0x81, 0xa4, 0x52, 0x58, 0x74, + 0xa1, 0x35, 0x8d, 0x7c, 0x0a, 0x8d, 0xb9, 0x0a, 0x83, 0x60, 0xc6, 0xbd, 0xac, 0xe8, 0x58, 0x5c, + 0xfc, 0xa4, 0xf9, 0xdd, 0x8b, 0x15, 0xed, 0x0f, 0x2f, 0x56, 0xb4, 0x3f, 0xbf, 0x58, 0xd1, 0xbe, + 0xfd, 0xcb, 0xca, 0xd2, 0x91, 0x81, 0x7f, 0x03, 0x7f, 0xf8, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x24, 0xf7, 0xd1, 0x46, 0x21, 0x1e, 0x00, 0x00, } diff --git a/worker/backup.go b/worker/backup.go index 2f939a42bab..01bd7d02506 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -42,21 +42,22 @@ func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupRespons resp.Message = err.Error() return resp, err } - glog.Infof("Export requested at %d.", in.StartTs) + glog.Infof("Backup requested at %d.", in.StartTs) // wait for this node to catch-up. if err := posting.Oracle().WaitForTs(ctx, in.StartTs); err != nil { resp.Message = err.Error() return resp, err } - glog.Infof("Running export for group %d at timestamp %d.", in.GroupId, in.StartTs) + glog.Infof("Running backup for group %d at timestamp %d.", in.GroupId, in.StartTs) // process this request w := &backup.Worker{ - ReadTs: in.StartTs, - GroupId: in.GroupId, - SeqTs: fmt.Sprint(time.Now().UTC().UnixNano()), - DB: pstore, + ReadTs: in.StartTs, + GroupId: in.GroupId, + SeqTs: fmt.Sprint(time.Now().UTC().UnixNano()), + TargetURI: in.Target, + DB: pstore, } if err := w.Process(ctx); err != nil { resp.Message = err.Error() @@ -67,18 +68,21 @@ func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupRespons } // Backup handles a request coming from another node. -func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.BackupResponse, error) { +func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest, +) (*pb.BackupResponse, error) { glog.Infof("Received backup request via Grpc: %+v\n", req) return backupProcess(ctx, req) } // TODO: add stop to all goroutines to cancel on failure. -func backupDispatch(ctx context.Context, readTs uint64, gids ...uint32) chan *pb.BackupResponse { +func backupDispatch(ctx context.Context, readTs uint64, target string, gids []uint32, +) chan *pb.BackupResponse { out := make(chan *pb.BackupResponse) go func() { glog.Infof("Dispatching backup requests...") for _, gid := range gids { - in := &pb.BackupRequest{StartTs: readTs, GroupId: gid} + glog.V(3).Infof("Backup dispatch to group %d snapshot at %d", gid, readTs) + in := &pb.BackupRequest{StartTs: readTs, GroupId: gid, Target: target} // this node is part of the group, process backup. if groups().groupId() == gid { resp, err := backupProcess(ctx, in) @@ -103,7 +107,7 @@ func backupDispatch(ctx context.Context, readTs uint64, gids ...uint32) chan *pb } // BackupOverNetwork handles a request coming from an HTTP client. -func BackupOverNetwork(ctx context.Context) error { +func BackupOverNetwork(ctx context.Context, target string) error { // Check that this node can accept requests. if err := x.HealthCheck(); err != nil { glog.Errorf("Backup canceled, not ready to accept requests: %v\n", err) @@ -125,7 +129,7 @@ func BackupOverNetwork(ctx context.Context) error { // This will dispatch the request to all groups and wait for their response. // If we receive any failures, we cancel the process. - for resp := range backupDispatch(ctx, readTs, gids...) { + for resp := range backupDispatch(ctx, readTs, target, gids) { if resp.Status == pb.BackupResponse_FAILED { return x.Errorf("Backup error: %s", resp.Message) } From 905f1b43812acfc27e307863399e7c045e117cd2 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 30 Oct 2018 16:43:52 -0700 Subject: [PATCH 08/25] file handler rename on same volume. added more comments and logging. --- ee/backup/handler.go | 10 +++++++++- ee/backup/writer.go | 2 +- ee/backup/writer_local.go | 7 +++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ee/backup/handler.go b/ee/backup/handler.go index 6305b0fdd6b..1e4381a1ac6 100644 --- a/ee/backup/handler.go +++ b/ee/backup/handler.go @@ -22,7 +22,13 @@ type handler interface { Session(string, string) error } -// handlers map uri scheme to a handler +// handlers map URI scheme to a handler. +// List of possible handlers: +// file - local file or NFS mounted (default if no scheme detected) +// http - multipart HTTP upload +// gs - Google Cloud Storage +// s3 - Amazon S3 +// as - Azure Storage var handlers struct { sync.Mutex m map[string]handler @@ -53,6 +59,8 @@ func getSchemeHandler(uri string) (handler, error) { return h, nil } +// addSchemeHandler registers a new scheme handler. If the handler is already registered +// we just ignore the request. func addSchemeHandler(scheme string, h handler) { handlers.Lock() defer handlers.Unlock() diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 4d2a889abcd..7987c313be4 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -78,7 +78,7 @@ func newWriter(worker *Worker) (*writer, error) { } // Send implements the stream.kvStream interface. -// It writes the received KV into the temp file. +// It writes the received KV into the temp file as a delimited binary chain. // Returns error if the writing fails, nil on success. func (w *writer) Send(kvs *pb.KVS) error { var err error diff --git a/ee/backup/writer_local.go b/ee/backup/writer_local.go index 60b43759b7f..10839b83616 100644 --- a/ee/backup/writer_local.go +++ b/ee/backup/writer_local.go @@ -9,6 +9,7 @@ import ( "io" "os" "path/filepath" + "strings" "github.com/golang/glog" ) @@ -43,6 +44,12 @@ func (h *fileHandler) Copy(in, out string) error { return os.ErrExist } + // if we are in the same volume, just rename. it should work on NFS too. + if strings.HasPrefix(in, h.path) { + glog.V(3).Infof("renaming %q to %q", in, out) + return os.Rename(in, out) + } + src, err := os.Open(in) if err != nil { return err From 8ac55fb453c9f8a949c1f6babad0a30de8ed93b1 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 30 Oct 2018 17:41:57 -0700 Subject: [PATCH 09/25] changed worker to use stream pkg. updated protos for backup. fixed mislabelled request field. --- ee/backup/backup.go | 5 +- protos/pb.proto | 2 +- protos/pb/pb.pb.go | 551 +++++++++++++++++++++++--------------------- worker/backup.go | 10 +- worker/draft.go | 5 +- worker/export.go | 9 +- worker/predicate.go | 9 +- 7 files changed, 314 insertions(+), 277 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index 8f51984df14..0c7d1c1d6a0 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -28,7 +28,6 @@ type Worker struct { // collect the data and later move to the target. // Returns errors on failure, nil on success. func (w *Worker) Process(ctx context.Context) error { - glog.Infof("Backup process beginning ...") c, err := newWriter(w) if err != nil { return err @@ -45,15 +44,15 @@ func (w *Worker) Process(ctx context.Context) error { return kv, nil } + glog.Infof("Backup started ...") if err = sl.Orchestrate(ctx, "Backup", w.ReadTs); err != nil { return err } - glog.Infof("Backup saving ...") if err = c.save(); err != nil { return err } + glog.Infof("Backup complete: group %d @ %d", w.GroupId, w.ReadTs) - glog.Infof("Backup done.") return nil } diff --git a/protos/pb.proto b/protos/pb.proto index 68c5b797e2c..753e2db61fe 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -445,7 +445,7 @@ message SnapshotMeta { } message BackupRequest { - uint64 start_ts = 1; + uint64 read_ts = 1; uint32 group_id = 2; string target = 3; } diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 3fe5caf42fa..738d1d76aea 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{17, 0} + return fileDescriptor_pb_b53a45b47504f851, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{24, 0} + return fileDescriptor_pb_b53a45b47504f851, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{24, 1} + return fileDescriptor_pb_b53a45b47504f851, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{34, 0} + return fileDescriptor_pb_b53a45b47504f851, []int{34, 0} } type ExportPayload_Status int32 @@ -179,7 +179,36 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{37, 0} + return fileDescriptor_pb_b53a45b47504f851, []int{37, 0} +} + +type BackupResponse_Status int32 + +const ( + BackupResponse_NONE BackupResponse_Status = 0 + BackupResponse_SUCCESS BackupResponse_Status = 1 + BackupResponse_DUPLICATE BackupResponse_Status = 2 + BackupResponse_FAILED BackupResponse_Status = 3 +) + +var BackupResponse_Status_name = map[int32]string{ + 0: "NONE", + 1: "SUCCESS", + 2: "DUPLICATE", + 3: "FAILED", +} +var BackupResponse_Status_value = map[string]int32{ + "NONE": 0, + "SUCCESS": 1, + "DUPLICATE": 2, + "FAILED": 3, +} + +func (x BackupResponse_Status) String() string { + return proto.EnumName(BackupResponse_Status_name, int32(x)) +} +func (BackupResponse_Status) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_pb_b53a45b47504f851, []int{47, 0} } type List struct { @@ -193,7 +222,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{0} + return fileDescriptor_pb_b53a45b47504f851, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +270,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{1} + return fileDescriptor_pb_b53a45b47504f851, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +326,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{2} + return fileDescriptor_pb_b53a45b47504f851, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +399,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{3} + return fileDescriptor_pb_b53a45b47504f851, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +516,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{4} + return fileDescriptor_pb_b53a45b47504f851, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +563,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{5} + return fileDescriptor_pb_b53a45b47504f851, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +616,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{6} + return fileDescriptor_pb_b53a45b47504f851, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +707,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{7} + return fileDescriptor_pb_b53a45b47504f851, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +772,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{8} + return fileDescriptor_pb_b53a45b47504f851, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +847,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{9} + return fileDescriptor_pb_b53a45b47504f851, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +897,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{10} + return fileDescriptor_pb_b53a45b47504f851, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +974,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{11} + return fileDescriptor_pb_b53a45b47504f851, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1064,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{12} + return fileDescriptor_pb_b53a45b47504f851, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1125,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{13} + return fileDescriptor_pb_b53a45b47504f851, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1231,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{14} + return fileDescriptor_pb_b53a45b47504f851, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1329,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{15} + return fileDescriptor_pb_b53a45b47504f851, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1395,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{16} + return fileDescriptor_pb_b53a45b47504f851, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1485,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{17} + return fileDescriptor_pb_b53a45b47504f851, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1593,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{18} + return fileDescriptor_pb_b53a45b47504f851, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1675,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{19} + return fileDescriptor_pb_b53a45b47504f851, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1697,7 +1726,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{20} + return fileDescriptor_pb_b53a45b47504f851, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1771,7 +1800,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{21} + return fileDescriptor_pb_b53a45b47504f851, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,7 +1891,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{22} + return fileDescriptor_pb_b53a45b47504f851, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1948,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{23} + return fileDescriptor_pb_b53a45b47504f851, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1998,7 +2027,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{24} + return fileDescriptor_pb_b53a45b47504f851, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2111,7 +2140,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{25} + return fileDescriptor_pb_b53a45b47504f851, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2209,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{26} + return fileDescriptor_pb_b53a45b47504f851, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2235,7 +2264,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{27} + return fileDescriptor_pb_b53a45b47504f851, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2289,7 +2318,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{28} + return fileDescriptor_pb_b53a45b47504f851, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2336,7 +2365,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{29} + return fileDescriptor_pb_b53a45b47504f851, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2385,7 +2414,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{30} + return fileDescriptor_pb_b53a45b47504f851, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2449,7 +2478,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{31} + return fileDescriptor_pb_b53a45b47504f851, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2514,7 +2543,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{32} + return fileDescriptor_pb_b53a45b47504f851, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2575,7 +2604,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{33} + return fileDescriptor_pb_b53a45b47504f851, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2629,7 +2658,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{34} + return fileDescriptor_pb_b53a45b47504f851, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2729,7 +2758,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{35} + return fileDescriptor_pb_b53a45b47504f851, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2793,7 +2822,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{36} + return fileDescriptor_pb_b53a45b47504f851, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2867,7 +2896,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{37} + return fileDescriptor_pb_b53a45b47504f851, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +2965,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{38} + return fileDescriptor_pb_b53a45b47504f851, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2991,7 +3020,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{39} + return fileDescriptor_pb_b53a45b47504f851, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3045,7 +3074,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{40} + return fileDescriptor_pb_b53a45b47504f851, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3092,7 +3121,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{41} + return fileDescriptor_pb_b53a45b47504f851, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3140,7 +3169,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{42} + return fileDescriptor_pb_b53a45b47504f851, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3195,7 +3224,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{43} + return fileDescriptor_pb_b53a45b47504f851, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3252,7 +3281,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{44} + return fileDescriptor_pb_b53a45b47504f851, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3314,7 +3343,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b959368674f22ac8, []int{45} + return fileDescriptor_pb_b53a45b47504f851, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3358,7 +3387,7 @@ func (m *SnapshotMeta) GetGroupId() uint32 { } type BackupRequest struct { - StartTs uint64 `protobuf:"varint,1,opt,name=start_ts,json=startTs,proto3" json:"start_ts,omitempty"` + ReadTs uint64 `protobuf:"varint,1,opt,name=read_ts,json=readTs,proto3" json:"read_ts,omitempty"` GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3370,7 +3399,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_fc313e30f62637c5, []int{46} + return fileDescriptor_pb_b53a45b47504f851, []int{46} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3399,9 +3428,9 @@ func (m *BackupRequest) XXX_DiscardUnknown() { var xxx_messageInfo_BackupRequest proto.InternalMessageInfo -func (m *BackupRequest) GetStartTs() uint64 { +func (m *BackupRequest) GetReadTs() uint64 { if m != nil { - return m.StartTs + return m.ReadTs } return 0 } @@ -3432,7 +3461,7 @@ func (m *BackupResponse) Reset() { *m = BackupResponse{} } func (m *BackupResponse) String() string { return proto.CompactTextString(m) } func (*BackupResponse) ProtoMessage() {} func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_fc313e30f62637c5, []int{47} + return fileDescriptor_pb_b53a45b47504f851, []int{47} } func (m *BackupResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6935,10 +6964,10 @@ func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.StartTs != 0 { + if m.ReadTs != 0 { dAtA[i] = 0x8 i++ - i = encodeVarintPb(dAtA, i, uint64(m.StartTs)) + i = encodeVarintPb(dAtA, i, uint64(m.ReadTs)) } if m.GroupId != 0 { dAtA[i] = 0x10 @@ -8258,8 +8287,8 @@ func (m *BackupRequest) Size() (n int) { } var l int _ = l - if m.StartTs != 0 { - n += 1 + sovPb(uint64(m.StartTs)) + if m.ReadTs != 0 { + n += 1 + sovPb(uint64(m.ReadTs)) } if m.GroupId != 0 { n += 1 + sovPb(uint64(m.GroupId)) @@ -15357,9 +15386,9 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartTs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ReadTs", wireType) } - m.StartTs = 0 + m.ReadTs = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowPb @@ -15369,7 +15398,7 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.StartTs |= (uint64(b) & 0x7F) << shift + m.ReadTs |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } @@ -15648,199 +15677,205 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_b959368674f22ac8) } - -var fileDescriptor_pb_b959368674f22ac8 = []byte{ - // 3056 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0xcb, 0x6e, 0xe3, 0xd6, - 0xd5, 0xa4, 0x24, 0x8a, 0x3c, 0x92, 0x3c, 0xca, 0xcd, 0x74, 0xa2, 0x28, 0xa9, 0xc7, 0x61, 0xe6, - 0xe1, 0x4c, 0x12, 0x77, 0xe2, 0xa4, 0xc8, 0x63, 0xe7, 0xb1, 0xe4, 0x81, 0x32, 0x7e, 0xf5, 0x4a, - 0x9e, 0xb4, 0x59, 0x44, 0xa0, 0xc5, 0x6b, 0x99, 0x35, 0x45, 0xb2, 0xbc, 0xa4, 0x21, 0x67, 0x51, - 0xa0, 0x9b, 0x7e, 0x43, 0x56, 0x5d, 0x14, 0xe8, 0xa6, 0xfd, 0x81, 0xf6, 0x03, 0x0a, 0x14, 0x5d, - 0x75, 0xdb, 0x5d, 0x31, 0x5d, 0x75, 0x5d, 0x14, 0x5d, 0x74, 0x53, 0xdc, 0x73, 0x2f, 0x1f, 0xd2, - 0xd8, 0x33, 0x49, 0x81, 0xae, 0xc4, 0xf3, 0xba, 0x8f, 0x73, 0xce, 0x3d, 0x2f, 0x81, 0x19, 0x9d, - 0x6c, 0x46, 0x71, 0x98, 0x84, 0x44, 0x8f, 0x4e, 0xba, 0x96, 0x13, 0x79, 0x12, 0xb4, 0xbb, 0x50, - 0xdd, 0xf3, 0x78, 0x42, 0x08, 0x54, 0x53, 0xcf, 0xe5, 0x1d, 0x6d, 0xbd, 0xb2, 0x61, 0x50, 0xfc, - 0xb6, 0xf7, 0xc1, 0x1a, 0x39, 0xfc, 0xfc, 0xa9, 0xe3, 0xa7, 0x8c, 0xb4, 0xa1, 0x72, 0xe1, 0xf8, - 0x1d, 0x6d, 0x5d, 0xdb, 0x68, 0x52, 0xf1, 0x49, 0x36, 0xc1, 0xbc, 0x70, 0xfc, 0x71, 0x72, 0x19, - 0xb1, 0x8e, 0xbe, 0xae, 0x6d, 0xac, 0x6e, 0xbd, 0xba, 0x19, 0x9d, 0x6c, 0x1e, 0x85, 0x3c, 0xf1, - 0x82, 0xe9, 0xe6, 0x53, 0xc7, 0x1f, 0x5d, 0x46, 0x8c, 0xd6, 0x2f, 0xe4, 0x87, 0x7d, 0x08, 0x8d, - 0x61, 0x3c, 0xd9, 0x4d, 0x83, 0x49, 0xe2, 0x85, 0x81, 0xd8, 0x31, 0x70, 0x66, 0x0c, 0x57, 0xb4, - 0x28, 0x7e, 0x0b, 0x9c, 0x13, 0x4f, 0x79, 0xa7, 0xb2, 0x5e, 0x11, 0x38, 0xf1, 0x4d, 0x3a, 0x50, - 0xf7, 0xf8, 0x4e, 0x98, 0x06, 0x49, 0xa7, 0xba, 0xae, 0x6d, 0x98, 0x34, 0x03, 0xed, 0x7f, 0xea, - 0x50, 0xfb, 0x51, 0xca, 0xe2, 0x4b, 0x94, 0x4b, 0x92, 0x38, 0x5b, 0x4b, 0x7c, 0x93, 0x9b, 0x50, - 0xf3, 0x9d, 0x60, 0xca, 0x3b, 0x3a, 0x2e, 0x26, 0x01, 0xf2, 0x06, 0x58, 0xce, 0x69, 0xc2, 0xe2, - 0x71, 0xea, 0xb9, 0x9d, 0xca, 0xba, 0xb6, 0x61, 0x50, 0x13, 0x11, 0xc7, 0x9e, 0x4b, 0x5e, 0x07, - 0xd3, 0x0d, 0xc7, 0x93, 0xf2, 0x5e, 0x6e, 0x88, 0x7b, 0x91, 0xb7, 0xc1, 0x4c, 0x3d, 0x77, 0xec, - 0x7b, 0x3c, 0xe9, 0xd4, 0xd6, 0xb5, 0x8d, 0xc6, 0x96, 0x29, 0x2e, 0x2b, 0x74, 0x47, 0xeb, 0xa9, - 0xe7, 0xa2, 0x12, 0x1f, 0x80, 0xc9, 0xe3, 0xc9, 0xf8, 0x34, 0x0d, 0x26, 0x1d, 0x03, 0x99, 0x6e, - 0x08, 0xa6, 0xd2, 0xad, 0x69, 0x9d, 0x4b, 0x40, 0x5c, 0x2b, 0x66, 0x17, 0x2c, 0xe6, 0xac, 0x53, - 0x97, 0x5b, 0x29, 0x90, 0x3c, 0x84, 0xc6, 0xa9, 0x33, 0x61, 0xc9, 0x38, 0x72, 0x62, 0x67, 0xd6, - 0x31, 0x8b, 0x85, 0x76, 0x05, 0xfa, 0x48, 0x60, 0x39, 0x85, 0xd3, 0x1c, 0x20, 0x1f, 0x42, 0x0b, - 0x21, 0x3e, 0x3e, 0xf5, 0xfc, 0x84, 0xc5, 0x1d, 0x0b, 0x65, 0x56, 0x51, 0x06, 0x31, 0xa3, 0x98, - 0x31, 0xda, 0x94, 0x4c, 0x12, 0x43, 0xbe, 0x0f, 0xc0, 0xe6, 0x91, 0x13, 0xb8, 0x63, 0xc7, 0xf7, - 0x3b, 0x80, 0x67, 0xb0, 0x24, 0x66, 0xdb, 0xf7, 0xc9, 0x6b, 0xe2, 0x7c, 0x8e, 0x3b, 0x4e, 0x78, - 0xa7, 0xb5, 0xae, 0x6d, 0x54, 0xa9, 0x21, 0xc0, 0x11, 0xb7, 0xb7, 0xc0, 0x42, 0x8f, 0xc0, 0x1b, - 0xdf, 0x05, 0xe3, 0x42, 0x00, 0xd2, 0x71, 0x1a, 0x5b, 0x2d, 0xb1, 0x65, 0xee, 0x34, 0x54, 0x11, - 0xed, 0x35, 0x30, 0xf7, 0x9c, 0x60, 0x9a, 0x79, 0x9a, 0x30, 0x05, 0x0a, 0x58, 0x14, 0xbf, 0xed, - 0x6f, 0x74, 0x30, 0x28, 0xe3, 0xa9, 0x9f, 0x90, 0xfb, 0x00, 0x42, 0xd1, 0x33, 0x27, 0x89, 0xbd, - 0xb9, 0x5a, 0xb5, 0x50, 0xb5, 0x95, 0x7a, 0xee, 0x3e, 0x92, 0xc8, 0x43, 0x68, 0xe2, 0xea, 0x19, - 0xab, 0x5e, 0x1c, 0x20, 0x3f, 0x1f, 0x6d, 0x20, 0x8b, 0x92, 0xb8, 0x05, 0x06, 0xda, 0x56, 0xfa, - 0x57, 0x8b, 0x2a, 0x88, 0xdc, 0x85, 0x55, 0x2f, 0x48, 0x84, 0xee, 0x27, 0xc9, 0xd8, 0x65, 0x3c, - 0x33, 0x7e, 0x2b, 0xc7, 0xf6, 0x18, 0x4f, 0xc8, 0x07, 0x20, 0x15, 0x98, 0x6d, 0x58, 0xc3, 0x0d, - 0x57, 0x73, 0xc3, 0x70, 0xb9, 0x23, 0xf2, 0xa8, 0x1d, 0xdf, 0x87, 0x86, 0xb8, 0x5f, 0x26, 0x61, - 0xa0, 0x44, 0x13, 0x6f, 0xa3, 0xd4, 0x41, 0x41, 0x30, 0x28, 0x76, 0xa1, 0x1a, 0xe1, 0x60, 0xd2, - 0x21, 0xf0, 0xdb, 0xee, 0x43, 0xed, 0x30, 0x76, 0x59, 0x7c, 0xa5, 0x8f, 0x13, 0xa8, 0xba, 0x8c, - 0x4f, 0xf0, 0xf9, 0x99, 0x14, 0xbf, 0x0b, 0xbf, 0xaf, 0x94, 0xfc, 0xde, 0xfe, 0x95, 0x06, 0x8d, - 0x61, 0x18, 0x27, 0xfb, 0x8c, 0x73, 0x67, 0xca, 0xc8, 0x6d, 0xa8, 0x85, 0x62, 0x59, 0xa5, 0x61, - 0x4b, 0x9c, 0x09, 0xf7, 0xa1, 0x12, 0xbf, 0x64, 0x07, 0xfd, 0x7a, 0x3b, 0xdc, 0x84, 0x9a, 0x7c, - 0x31, 0xe2, 0x35, 0xd5, 0xa8, 0x04, 0x84, 0xae, 0xc3, 0xd3, 0x53, 0xce, 0xa4, 0x2e, 0x6b, 0x54, - 0x41, 0xd7, 0xbb, 0xd5, 0x0f, 0x01, 0xc4, 0xf9, 0xbe, 0xa3, 0x17, 0xd8, 0x67, 0xd0, 0xa0, 0xce, - 0x69, 0xb2, 0x13, 0x06, 0x09, 0x9b, 0x27, 0x64, 0x15, 0x74, 0xcf, 0x45, 0x15, 0x19, 0x54, 0xf7, - 0x5c, 0x71, 0xb8, 0x69, 0x1c, 0xa6, 0x11, 0x6a, 0xa8, 0x45, 0x25, 0x80, 0xaa, 0x74, 0xdd, 0x18, - 0x4f, 0x2c, 0x54, 0xe9, 0xba, 0x31, 0xb9, 0x0d, 0x0d, 0x1e, 0x38, 0x11, 0x3f, 0x0b, 0x13, 0x71, - 0xb8, 0x2a, 0x1e, 0x0e, 0x32, 0xd4, 0x88, 0xdb, 0x7f, 0xd4, 0xc0, 0xd8, 0x67, 0xb3, 0x13, 0x16, - 0x3f, 0xb7, 0xcb, 0xeb, 0x60, 0xe2, 0xc2, 0x63, 0xcf, 0x55, 0x1b, 0xd5, 0x11, 0x1e, 0xb8, 0x57, - 0x6e, 0x75, 0x0b, 0x0c, 0x9f, 0x39, 0x42, 0xf9, 0xd2, 0xcf, 0x14, 0x24, 0x74, 0xe3, 0xcc, 0xc6, - 0x2e, 0x73, 0x5c, 0x0c, 0x31, 0x26, 0x35, 0x9c, 0x59, 0x8f, 0x39, 0xae, 0x38, 0x9b, 0xef, 0xf0, - 0x64, 0x9c, 0x46, 0xae, 0x93, 0x30, 0x0c, 0x2d, 0x55, 0xe1, 0x38, 0x3c, 0x39, 0x46, 0x0c, 0x79, - 0x00, 0xaf, 0x4c, 0xfc, 0x94, 0x8b, 0xb8, 0xe6, 0x05, 0xa7, 0xe1, 0x38, 0x0c, 0xfc, 0x4b, 0xd4, - 0xaf, 0x49, 0x6f, 0x28, 0xc2, 0x20, 0x38, 0x0d, 0x0f, 0x03, 0xff, 0xd2, 0xfe, 0x8f, 0x06, 0xb5, - 0xc7, 0xa8, 0x86, 0x87, 0x50, 0x9f, 0xe1, 0x85, 0xb2, 0xd7, 0x7b, 0x4b, 0x68, 0x18, 0x69, 0x9b, - 0xf2, 0xa6, 0xbc, 0x1f, 0x24, 0xf1, 0x25, 0xcd, 0xd8, 0x84, 0x44, 0xe2, 0x9c, 0xf8, 0x2c, 0xe1, - 0xca, 0x23, 0x4a, 0x12, 0x23, 0x49, 0x50, 0x12, 0x8a, 0xad, 0xbb, 0x0b, 0xcd, 0xf2, 0x52, 0x22, - 0x8d, 0x9c, 0xb3, 0x4b, 0xd4, 0x5d, 0x95, 0x8a, 0x4f, 0xb2, 0x0e, 0x35, 0x7c, 0xa4, 0xa8, 0xb9, - 0xc6, 0x16, 0x88, 0x15, 0xa5, 0x08, 0x95, 0x84, 0xcf, 0xf4, 0x4f, 0x34, 0xb1, 0x4e, 0x79, 0x83, - 0xf2, 0x3a, 0xd6, 0xf5, 0xeb, 0x48, 0x91, 0xd2, 0x3a, 0xf6, 0xbf, 0x35, 0x68, 0x7e, 0xc9, 0xe2, - 0xf0, 0x28, 0x0e, 0xa3, 0x90, 0x3b, 0x3e, 0xb1, 0xc1, 0x90, 0xb7, 0xbb, 0x62, 0x7f, 0x45, 0x11, - 0x3c, 0xf2, 0x3e, 0x68, 0xc6, 0xc5, 0xb5, 0x15, 0x85, 0xac, 0x01, 0xcc, 0x9c, 0xf9, 0x1e, 0x73, - 0x38, 0x1b, 0xb8, 0x99, 0xfb, 0x14, 0x18, 0xd2, 0x05, 0x73, 0xe6, 0xcc, 0x47, 0xf3, 0x60, 0xc4, - 0xd1, 0xba, 0x55, 0x9a, 0xc3, 0xe4, 0x4d, 0xb0, 0x66, 0xce, 0x5c, 0xf8, 0xf1, 0xc0, 0x55, 0xd6, - 0x2d, 0x10, 0xe4, 0x2d, 0xa8, 0x24, 0xf3, 0x00, 0x83, 0x82, 0xc8, 0x03, 0x22, 0x77, 0x8f, 0xe6, - 0x81, 0xf2, 0x78, 0x2a, 0x68, 0x99, 0x36, 0xcc, 0x42, 0x1b, 0x6d, 0xa8, 0x4c, 0x3c, 0x17, 0x13, - 0x81, 0x45, 0xc5, 0xa7, 0xfd, 0xfb, 0x0a, 0xdc, 0x50, 0xa6, 0x38, 0xf3, 0xa2, 0x61, 0x22, 0xfc, - 0xa6, 0x03, 0x75, 0x7c, 0xae, 0x2c, 0x56, 0x16, 0xc9, 0x40, 0xf2, 0x31, 0x18, 0xe8, 0xc2, 0x99, - 0xa1, 0x6f, 0x17, 0x6a, 0xc9, 0xc5, 0xa5, 0xe1, 0x95, 0xc5, 0x15, 0x3b, 0xf9, 0x08, 0x6a, 0x5f, - 0xb3, 0x38, 0x94, 0xe1, 0xa7, 0xb1, 0xb5, 0x76, 0x95, 0x9c, 0x30, 0x80, 0x12, 0x93, 0xcc, 0xff, - 0x47, 0xed, 0xdd, 0x11, 0x01, 0x67, 0x16, 0x5e, 0x30, 0xb7, 0x53, 0xc7, 0x13, 0x95, 0x0d, 0x9c, - 0x91, 0x32, 0x75, 0x99, 0xb9, 0xba, 0xba, 0x3d, 0x68, 0x94, 0xae, 0x57, 0xf6, 0xb7, 0x96, 0xd4, - 0xf0, 0xed, 0x45, 0x7f, 0xb3, 0xf2, 0x97, 0x50, 0x76, 0xdb, 0x1e, 0x40, 0x71, 0xd9, 0xff, 0xd5, - 0xf9, 0xed, 0x5f, 0x68, 0x70, 0x63, 0x27, 0x0c, 0x02, 0x86, 0x35, 0x84, 0x34, 0x5d, 0xe1, 0xb7, - 0xda, 0xb5, 0x7e, 0xfb, 0x0e, 0xd4, 0xb8, 0x60, 0x56, 0xab, 0xbf, 0x7a, 0x85, 0x2d, 0xa8, 0xe4, - 0x10, 0x21, 0x66, 0xe6, 0xcc, 0xc7, 0x11, 0x0b, 0x5c, 0x2f, 0x98, 0xa2, 0x9f, 0x4b, 0x0b, 0x1c, - 0x49, 0x8c, 0xfd, 0x6b, 0x0d, 0x0c, 0xe9, 0xf2, 0x0b, 0xe1, 0x4e, 0x5b, 0x0c, 0x77, 0x6f, 0x82, - 0x15, 0xc5, 0xcc, 0xf5, 0x26, 0xd9, 0xae, 0x16, 0x2d, 0x10, 0x22, 0x1a, 0x9f, 0x86, 0xf1, 0x84, - 0xe1, 0xf2, 0x26, 0x95, 0x80, 0x28, 0xc9, 0x30, 0x25, 0x60, 0xd0, 0x92, 0x11, 0xd1, 0x14, 0x08, - 0x11, 0xad, 0x84, 0x08, 0x8f, 0x9c, 0x89, 0x2c, 0x92, 0x2a, 0x54, 0x02, 0x22, 0x82, 0x4a, 0xcb, - 0xa1, 0xc5, 0x4c, 0xaa, 0x20, 0xfb, 0xb7, 0x3a, 0x34, 0x7b, 0x5e, 0xcc, 0x26, 0x09, 0x73, 0xfb, - 0xee, 0x14, 0x19, 0x59, 0x90, 0x78, 0xc9, 0xa5, 0x8a, 0xd6, 0x0a, 0xca, 0x93, 0xa9, 0xbe, 0x58, - 0x30, 0x4a, 0x5b, 0x54, 0xb0, 0xc6, 0x95, 0x00, 0xd9, 0x02, 0x90, 0x65, 0x06, 0xd6, 0xb9, 0xd5, - 0xeb, 0xeb, 0x5c, 0x0b, 0xd9, 0xc4, 0xa7, 0x50, 0x90, 0x94, 0xf1, 0x64, 0x24, 0x37, 0xb0, 0x08, - 0x4e, 0x85, 0x23, 0x63, 0x76, 0x3e, 0x61, 0x3e, 0x3a, 0x2a, 0x66, 0xe7, 0x13, 0xe6, 0xe7, 0x35, - 0x51, 0x5d, 0x1e, 0x47, 0x7c, 0x93, 0xb7, 0x41, 0x0f, 0x23, 0xbc, 0x9f, 0xda, 0xb0, 0x7c, 0xb1, - 0xcd, 0xc3, 0x88, 0xea, 0x61, 0x24, 0xbc, 0x40, 0x16, 0x75, 0x1d, 0x4b, 0x39, 0xb7, 0x08, 0x0f, - 0x58, 0x8e, 0x50, 0x45, 0xb1, 0x6f, 0x81, 0x7e, 0x18, 0x91, 0x3a, 0x54, 0x86, 0xfd, 0x51, 0x7b, - 0x45, 0x7c, 0xf4, 0xfa, 0x7b, 0x6d, 0xcd, 0x7e, 0xa6, 0x81, 0xb5, 0x9f, 0x26, 0x8e, 0xf0, 0x29, - 0xfe, 0x22, 0xa3, 0xbe, 0x0e, 0x26, 0x4f, 0x9c, 0x18, 0xf3, 0xa2, 0x2e, 0xc3, 0x04, 0xc2, 0x23, - 0x4e, 0xee, 0x41, 0x8d, 0xb9, 0x53, 0x96, 0xbd, 0xf6, 0xf6, 0xf2, 0x39, 0xa9, 0x24, 0x93, 0x0d, - 0x30, 0xf8, 0xe4, 0x8c, 0xcd, 0x9c, 0x4e, 0xb5, 0x60, 0x1c, 0x22, 0x46, 0xa6, 0x30, 0xaa, 0xe8, - 0x58, 0x83, 0xc7, 0x61, 0x84, 0x45, 0x69, 0x4d, 0xd5, 0xe0, 0x71, 0x18, 0x89, 0x92, 0x74, 0x0b, - 0xbe, 0xe7, 0x4d, 0x83, 0x30, 0x66, 0x63, 0x2f, 0x70, 0xd9, 0x7c, 0x3c, 0x09, 0x83, 0x53, 0xdf, - 0x9b, 0x24, 0xa8, 0x4b, 0x93, 0xbe, 0x2a, 0x89, 0x03, 0x41, 0xdb, 0x51, 0x24, 0xfb, 0x6d, 0xb0, - 0x9e, 0xb0, 0x4b, 0x2c, 0x08, 0x39, 0xb9, 0x05, 0xfa, 0xf9, 0x85, 0xca, 0x75, 0x86, 0x38, 0xc1, - 0x93, 0xa7, 0x54, 0x3f, 0xbf, 0xb0, 0xe7, 0x60, 0x0e, 0x55, 0xa2, 0x27, 0xef, 0x88, 0x90, 0x88, - 0xa1, 0x55, 0x3d, 0x2c, 0xac, 0xbc, 0x4b, 0x35, 0x06, 0xcd, 0xe8, 0xc2, 0x96, 0x78, 0x10, 0xa5, - 0x14, 0x09, 0x94, 0x2b, 0x9c, 0x4a, 0xb9, 0xc2, 0xc1, 0x62, 0x2d, 0x0c, 0x98, 0x72, 0x71, 0xfc, - 0xb6, 0x7f, 0xa9, 0x83, 0x99, 0xa7, 0xa2, 0x77, 0xc1, 0x9a, 0x65, 0xf6, 0x50, 0x4f, 0x16, 0xcb, - 0xd9, 0xdc, 0x48, 0xb4, 0xa0, 0xab, 0xbb, 0x54, 0x97, 0xef, 0x52, 0xbc, 0xf9, 0xda, 0x4b, 0xdf, - 0xfc, 0x7d, 0xb8, 0x31, 0xf1, 0x99, 0x13, 0x8c, 0x8b, 0x27, 0x2b, 0xbd, 0x72, 0x15, 0xd1, 0x47, - 0xf9, 0xbb, 0x55, 0x71, 0xab, 0x5e, 0xa4, 0x97, 0xbb, 0x50, 0x73, 0x99, 0x9f, 0x38, 0xe5, 0xee, - 0xe4, 0x30, 0x76, 0x26, 0x3e, 0xeb, 0x09, 0x34, 0x95, 0x54, 0xb2, 0x01, 0x66, 0x56, 0x41, 0xa9, - 0x9e, 0x04, 0x8b, 0xdf, 0x4c, 0xd9, 0x34, 0xa7, 0xda, 0x1f, 0x40, 0xe5, 0xc9, 0xd3, 0xe1, 0x75, - 0x16, 0xca, 0x75, 0xa7, 0x97, 0x74, 0xf7, 0x15, 0xe8, 0x4f, 0x9e, 0x96, 0x63, 0x6a, 0x33, 0x4f, - 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0x66, 0xca, 0x59, 0xbc, 0xcf, 0x12, 0x47, 0x3d, - 0xee, 0x1c, 0x16, 0x29, 0x50, 0xb4, 0x5d, 0x5e, 0x18, 0xa8, 0xb4, 0x93, 0x81, 0xf6, 0x3f, 0x2a, - 0x50, 0x57, 0x8f, 0x5c, 0xac, 0x99, 0xe6, 0x25, 0x9f, 0xf8, 0x2c, 0xa2, 0x85, 0x5e, 0x8e, 0x16, - 0xe5, 0x9e, 0xb8, 0xf2, 0xf2, 0x9e, 0x98, 0x7c, 0x06, 0xcd, 0x48, 0xd2, 0xca, 0xf1, 0xe5, 0xb5, - 0xb2, 0x8c, 0xfa, 0x45, 0xb9, 0x46, 0x54, 0x00, 0xe2, 0xa5, 0x60, 0x73, 0x91, 0x38, 0x53, 0x34, - 0x76, 0x93, 0xd6, 0x05, 0x3c, 0x72, 0xa6, 0xd7, 0x44, 0x99, 0x6f, 0x11, 0x2c, 0x44, 0x69, 0x1b, - 0x46, 0x9d, 0x26, 0x06, 0x00, 0x11, 0x60, 0xca, 0x6f, 0xbf, 0xb5, 0xf8, 0xf6, 0xdf, 0x00, 0x6b, - 0x12, 0xce, 0x66, 0x1e, 0xd2, 0x56, 0x65, 0x52, 0x96, 0x88, 0x11, 0xb7, 0xbf, 0x86, 0xba, 0xba, - 0x2c, 0x69, 0x40, 0xbd, 0xd7, 0xdf, 0xdd, 0x3e, 0xde, 0x13, 0xd1, 0x07, 0xc0, 0x78, 0x34, 0x38, - 0xd8, 0xa6, 0x3f, 0x69, 0x6b, 0x22, 0x12, 0x0d, 0x0e, 0x46, 0x6d, 0x9d, 0x58, 0x50, 0xdb, 0xdd, - 0x3b, 0xdc, 0x1e, 0xb5, 0x2b, 0xc4, 0x84, 0xea, 0xa3, 0xc3, 0xc3, 0xbd, 0x76, 0x95, 0x34, 0xc1, - 0xec, 0x6d, 0x8f, 0xfa, 0xa3, 0xc1, 0x7e, 0xbf, 0x5d, 0x13, 0xbc, 0x8f, 0xfb, 0x87, 0x6d, 0x43, - 0x7c, 0x1c, 0x0f, 0x7a, 0xed, 0xba, 0xa0, 0x1f, 0x6d, 0x0f, 0x87, 0x5f, 0x1c, 0xd2, 0x5e, 0xdb, - 0x14, 0xeb, 0x0e, 0x47, 0x74, 0x70, 0xf0, 0xb8, 0x6d, 0xd9, 0x1f, 0x40, 0xa3, 0xa4, 0x34, 0x21, - 0x41, 0xfb, 0xbb, 0xed, 0x15, 0xb1, 0xcd, 0xd3, 0xed, 0xbd, 0xe3, 0x7e, 0x5b, 0x23, 0xab, 0x00, - 0xf8, 0x39, 0xde, 0xdb, 0x3e, 0x78, 0xdc, 0xd6, 0xed, 0x9f, 0xe7, 0x22, 0xd8, 0xa3, 0xde, 0x07, - 0x53, 0x69, 0x3a, 0x2b, 0x8d, 0x1b, 0x25, 0x93, 0xd0, 0x9c, 0x28, 0x3c, 0x6b, 0x72, 0xc6, 0x26, - 0xe7, 0x3c, 0x9d, 0x29, 0x47, 0xc8, 0x61, 0xd9, 0x6e, 0x0a, 0x75, 0x64, 0x71, 0x40, 0x42, 0xf9, - 0xa8, 0xa5, 0x8a, 0xfc, 0x72, 0xd4, 0xf2, 0x11, 0x40, 0xd1, 0xdc, 0x5f, 0x51, 0xdc, 0xde, 0x84, - 0x9a, 0xe3, 0x7b, 0x0e, 0x57, 0x09, 0x4b, 0x02, 0xf6, 0x01, 0x34, 0x4a, 0x23, 0x01, 0x61, 0x2b, - 0xc7, 0xf7, 0xc7, 0xe7, 0xec, 0x92, 0xa3, 0xac, 0x49, 0xeb, 0x8e, 0xef, 0x3f, 0x61, 0x97, 0x9c, - 0xdc, 0x81, 0x9a, 0x9c, 0x26, 0xe8, 0x4b, 0x4d, 0x2b, 0x8a, 0x52, 0x49, 0xb4, 0xdf, 0x03, 0x43, - 0x76, 0xb2, 0x25, 0x57, 0xd1, 0xae, 0xcd, 0x2b, 0x9f, 0xaa, 0x33, 0x63, 0xdf, 0x4b, 0xde, 0x55, - 0x53, 0x0b, 0x2e, 0x67, 0x24, 0x5a, 0x51, 0x6b, 0x49, 0x26, 0x35, 0xb0, 0x40, 0x66, 0xbb, 0x07, - 0xe6, 0x0b, 0xe7, 0x40, 0x4a, 0x01, 0x7a, 0xa1, 0x80, 0x2b, 0x26, 0x43, 0xf6, 0x4f, 0x01, 0x8a, - 0xe9, 0x86, 0xf2, 0x5c, 0xb9, 0x8a, 0xf0, 0xdc, 0x07, 0xc2, 0x34, 0x9e, 0xef, 0xc6, 0x2c, 0x58, - 0xb8, 0x75, 0x31, 0x0f, 0xc9, 0xe9, 0x64, 0x1d, 0xaa, 0x38, 0xb4, 0xa9, 0x14, 0x31, 0x2a, 0x9f, - 0xd8, 0x20, 0xc5, 0x3e, 0x81, 0x96, 0x4c, 0x57, 0x94, 0xfd, 0x2c, 0x65, 0xfc, 0x85, 0x45, 0xd0, - 0x1a, 0x40, 0x1e, 0x51, 0xb3, 0xf1, 0x53, 0x09, 0x23, 0x1c, 0xe3, 0xd4, 0x63, 0xbe, 0x9b, 0xdd, - 0x46, 0x41, 0xf6, 0xc7, 0xd0, 0xcc, 0xf6, 0x50, 0x4d, 0x70, 0x96, 0x34, 0xa5, 0x36, 0x65, 0xed, - 0x2f, 0x59, 0x0e, 0x42, 0x37, 0xcf, 0x99, 0xf6, 0x5f, 0xf5, 0x4c, 0x52, 0xf5, 0x83, 0x0b, 0x65, - 0x98, 0xb6, 0x5c, 0x86, 0x2d, 0x96, 0x34, 0xfa, 0xb7, 0x2a, 0x69, 0x3e, 0x01, 0xcb, 0xc5, 0xbc, - 0xee, 0x5d, 0x64, 0x91, 0xad, 0xbb, 0x9c, 0xc3, 0x55, 0xe6, 0xf7, 0x2e, 0x18, 0x2d, 0x98, 0xc5, - 0x59, 0x92, 0xf0, 0x9c, 0x05, 0xde, 0xd7, 0xd8, 0xf0, 0x8a, 0x0b, 0x17, 0x88, 0x62, 0x7a, 0x20, - 0x73, 0xbd, 0x9a, 0x1e, 0x64, 0x83, 0x10, 0xa3, 0x18, 0x84, 0x08, 0xad, 0xa5, 0x11, 0x67, 0x71, - 0x92, 0xd5, 0x7c, 0x12, 0xca, 0x6b, 0x27, 0x4b, 0xf1, 0x3a, 0xc1, 0xd4, 0xfe, 0x14, 0xac, 0xfc, - 0x2c, 0x22, 0xa4, 0x1c, 0x1c, 0x1e, 0xf4, 0x65, 0x00, 0x18, 0x1c, 0xf4, 0xfa, 0x3f, 0x6e, 0x6b, - 0x22, 0x28, 0xd1, 0xfe, 0xd3, 0x3e, 0x1d, 0xf6, 0xdb, 0xba, 0x08, 0x1e, 0xbd, 0xfe, 0x5e, 0x7f, - 0xd4, 0x6f, 0x57, 0x3e, 0xaf, 0x9a, 0xf5, 0xb6, 0x49, 0x4d, 0x36, 0x8f, 0x7c, 0x6f, 0xe2, 0x25, - 0xf6, 0x31, 0x98, 0xfb, 0x4e, 0xf4, 0x5c, 0xfd, 0x5e, 0xe4, 0x9a, 0x54, 0x35, 0xfd, 0x2a, 0x2f, - 0xdc, 0x85, 0xba, 0x8a, 0x0e, 0xca, 0x9b, 0x16, 0x22, 0x47, 0x46, 0xb3, 0x7f, 0xa7, 0xc1, 0xcd, - 0xfd, 0xf0, 0x82, 0xe5, 0x49, 0xf6, 0xc8, 0xb9, 0xf4, 0x43, 0xc7, 0x7d, 0x89, 0xe9, 0xee, 0xc1, - 0x0d, 0x1e, 0xa6, 0xf1, 0x84, 0x8d, 0x97, 0x06, 0x0e, 0x2d, 0x89, 0x7e, 0xac, 0x5c, 0xd0, 0x86, - 0x96, 0xcb, 0x78, 0x52, 0x70, 0x55, 0x90, 0xab, 0x21, 0x90, 0x19, 0x4f, 0x5e, 0x29, 0x54, 0x5f, - 0x56, 0x29, 0xd8, 0x7f, 0xd6, 0xa0, 0xd5, 0x9f, 0x47, 0x61, 0x9c, 0x64, 0xc7, 0x7c, 0x81, 0xfb, - 0x3f, 0x04, 0x43, 0x48, 0xa5, 0x5c, 0xb9, 0x56, 0x47, 0x2c, 0xbc, 0x20, 0xbd, 0x39, 0x44, 0x3a, - 0x55, 0x7c, 0xd7, 0x97, 0x4c, 0xaf, 0x41, 0x3d, 0x0d, 0xbc, 0x79, 0x36, 0x90, 0xa9, 0x50, 0x43, - 0x80, 0x23, 0x6e, 0x7f, 0x06, 0x86, 0x5c, 0xa3, 0x64, 0xdd, 0x06, 0xd4, 0x87, 0xc7, 0x3b, 0x3b, - 0xfd, 0xe1, 0xb0, 0xad, 0x91, 0x16, 0x58, 0xbd, 0xe3, 0xa3, 0xbd, 0xc1, 0xce, 0xf6, 0x48, 0x59, - 0x78, 0x77, 0x7b, 0xb0, 0xd7, 0xef, 0xb5, 0x2b, 0xf6, 0x0e, 0x58, 0xa3, 0x79, 0xa0, 0xc4, 0xcb, - 0xf9, 0x4d, 0x7b, 0x41, 0x7e, 0xd3, 0x97, 0xf2, 0xdb, 0x10, 0x1a, 0xa5, 0x7a, 0x87, 0xbc, 0x05, - 0xd5, 0x64, 0x1e, 0x2c, 0x4e, 0x41, 0xb3, 0x3d, 0x28, 0x92, 0xc8, 0x5b, 0xd0, 0x14, 0x1d, 0x96, - 0xc3, 0xb9, 0x37, 0x0d, 0x98, 0xab, 0x56, 0x14, 0x5d, 0xd7, 0xb6, 0x42, 0xd9, 0xb7, 0xa1, 0x25, - 0x5a, 0x5a, 0x6f, 0xc6, 0x78, 0xe2, 0xcc, 0x22, 0xcc, 0xc6, 0x2a, 0x04, 0x57, 0xa9, 0x9e, 0x70, - 0xfb, 0x1e, 0x34, 0x8f, 0x18, 0x8b, 0x29, 0xe3, 0x51, 0x18, 0x70, 0x6c, 0x6f, 0x94, 0xaa, 0x65, - 0xbc, 0x57, 0x90, 0xfd, 0x15, 0x58, 0xa2, 0x62, 0x7d, 0xe4, 0x24, 0x93, 0xb3, 0xef, 0x52, 0xd1, - 0xde, 0x83, 0x7a, 0x24, 0x4d, 0xa4, 0xea, 0xcf, 0x26, 0x86, 0x1c, 0x65, 0x36, 0x9a, 0x11, 0xed, - 0x8f, 0xa0, 0x72, 0x90, 0xce, 0xca, 0xff, 0x09, 0x54, 0x65, 0xa5, 0xb5, 0xd0, 0xcb, 0xe9, 0x8b, - 0xbd, 0x9c, 0xfd, 0x25, 0x34, 0xb2, 0xab, 0x0e, 0x5c, 0x1c, 0xec, 0xa3, 0xaa, 0x07, 0xee, 0x82, - 0xe6, 0x65, 0x93, 0xc4, 0x02, 0x77, 0x90, 0xe9, 0x48, 0x02, 0x8b, 0x6b, 0xab, 0x21, 0x40, 0xbe, - 0xf6, 0x2e, 0x34, 0xb3, 0xaa, 0x12, 0xcb, 0x3a, 0x61, 0x3c, 0xdf, 0x63, 0x41, 0xc9, 0xb0, 0xa6, - 0x44, 0x8c, 0xf8, 0x0b, 0xe6, 0x75, 0x5b, 0x7f, 0xd0, 0xa0, 0x2a, 0x54, 0x43, 0xee, 0x40, 0xb5, - 0x3f, 0x39, 0x0b, 0xc9, 0x82, 0x06, 0xba, 0x0b, 0x90, 0xbd, 0x42, 0xde, 0x93, 0xe3, 0xc7, 0x6c, - 0xaa, 0xda, 0xca, 0x34, 0x8b, 0x9a, 0x7f, 0x8e, 0x7b, 0x13, 0x1a, 0x9f, 0x87, 0x5e, 0xb0, 0x23, - 0x27, 0x72, 0x64, 0xd9, 0x0e, 0xcf, 0xf1, 0xbf, 0x0f, 0xc6, 0x80, 0x0b, 0x83, 0x3f, 0xcf, 0x8a, - 0x0d, 0x54, 0xd9, 0x17, 0xec, 0x95, 0xad, 0x7f, 0xe9, 0x50, 0xfd, 0x92, 0xc5, 0x21, 0x79, 0x0f, - 0xea, 0x6a, 0x5c, 0x40, 0x4a, 0x63, 0x81, 0x2e, 0xbe, 0xf0, 0xa5, 0x39, 0x02, 0x9e, 0xca, 0x50, - 0x69, 0xa3, 0x98, 0x61, 0x74, 0xaf, 0x8a, 0x06, 0xf6, 0xca, 0x86, 0xf6, 0x50, 0x23, 0xef, 0x82, - 0x21, 0x5d, 0x7f, 0x49, 0x37, 0xcb, 0x4d, 0x80, 0xbd, 0xf2, 0x50, 0x23, 0xf7, 0xa1, 0x31, 0x3c, - 0x0b, 0x53, 0xdf, 0x1d, 0xb2, 0xf8, 0x82, 0x91, 0xd2, 0xe4, 0xac, 0x5b, 0xfa, 0xb6, 0x57, 0xc8, - 0x06, 0x80, 0x74, 0x8e, 0x63, 0xcf, 0xe5, 0xa4, 0x2e, 0x68, 0x07, 0xe9, 0x4c, 0x2e, 0x5a, 0xf2, - 0x1a, 0xc9, 0x59, 0x7a, 0x22, 0x2f, 0xe2, 0xfc, 0x10, 0x5a, 0x3b, 0xf8, 0x60, 0x0f, 0xe3, 0xed, - 0x93, 0x30, 0x4e, 0xc8, 0xf2, 0xf4, 0xac, 0xbb, 0x8c, 0xb0, 0x57, 0xc8, 0x43, 0x30, 0x47, 0xf1, - 0xa5, 0xe4, 0x7f, 0x45, 0x3d, 0xe4, 0x62, 0xbf, 0x2b, 0x6e, 0xb9, 0xf5, 0x9b, 0x0a, 0x18, 0x5f, - 0x84, 0xf1, 0x39, 0x8b, 0xc9, 0x03, 0x30, 0xb0, 0x5b, 0x53, 0xae, 0x90, 0x77, 0x6e, 0x57, 0x6d, - 0x74, 0x07, 0x2c, 0x54, 0xca, 0xc8, 0xe1, 0xe7, 0x52, 0xf5, 0xf8, 0x67, 0x96, 0xd4, 0x8b, 0x2c, - 0x01, 0xd0, 0x07, 0x56, 0x87, 0x49, 0xcc, 0x9c, 0x59, 0xde, 0xa1, 0x2e, 0xb4, 0x50, 0xdd, 0xba, - 0xec, 0x92, 0x86, 0xca, 0x38, 0xef, 0x40, 0x75, 0x28, 0x6f, 0x2a, 0x98, 0x8a, 0x81, 0x7f, 0x77, - 0x35, 0x43, 0xe4, 0x2b, 0xff, 0x00, 0x0c, 0x99, 0xbd, 0xe5, 0x35, 0x17, 0xca, 0x9b, 0x6e, 0xbb, - 0x8c, 0x52, 0x02, 0x36, 0xd4, 0x8f, 0xd2, 0x78, 0xca, 0x46, 0x7c, 0xc9, 0xf2, 0x99, 0x0d, 0x50, - 0x7b, 0x86, 0x0c, 0xf5, 0x72, 0xd1, 0x85, 0xb0, 0xdf, 0x7d, 0x1e, 0x85, 0x17, 0x6c, 0x53, 0x36, - 0x61, 0x5e, 0x29, 0x17, 0x92, 0xec, 0x52, 0xcb, 0x2f, 0x62, 0x43, 0x23, 0x9f, 0x42, 0x6b, 0x21, - 0x6f, 0x12, 0x4c, 0x2f, 0x57, 0xa5, 0xd2, 0x65, 0xe1, 0x47, 0xed, 0x3f, 0x3d, 0x5b, 0xd3, 0xfe, - 0xf2, 0x6c, 0x4d, 0xfb, 0xdb, 0xb3, 0x35, 0xed, 0x9b, 0xbf, 0xaf, 0xad, 0x9c, 0x18, 0xf8, 0x27, - 0xe8, 0x87, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xcf, 0xbb, 0x46, 0x1f, 0x1d, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_b53a45b47504f851) } + +var fileDescriptor_pb_b53a45b47504f851 = []byte{ + // 3143 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4d, 0x73, 0xe3, 0x46, + 0x76, 0x02, 0x48, 0x82, 0xc0, 0x23, 0xa9, 0xa1, 0xdb, 0x93, 0x31, 0x87, 0x76, 0x34, 0x32, 0x3c, + 0x1f, 0xf2, 0xd8, 0x56, 0x66, 0x64, 0xa7, 0xfc, 0x71, 0xd3, 0x88, 0xd4, 0x14, 0x3d, 0xfa, 0x4a, + 0x93, 0x1a, 0x27, 0x4e, 0x95, 0x59, 0x10, 0xd1, 0xa2, 0x10, 0x81, 0x00, 0x82, 0x06, 0x54, 0x94, + 0x0f, 0xa9, 0xca, 0x25, 0xbf, 0xc1, 0xb9, 0xe4, 0x90, 0x63, 0xf2, 0x07, 0x92, 0x1f, 0x90, 0xaa, + 0xd4, 0x9e, 0xf6, 0xb8, 0x7b, 0xdb, 0x9a, 0x3d, 0xed, 0x79, 0x6b, 0x6b, 0x0f, 0x7b, 0xd9, 0xea, + 0xd7, 0x8d, 0x0f, 0x72, 0x24, 0x8d, 0xbd, 0x5b, 0x7b, 0x22, 0x5e, 0xbf, 0xf7, 0xfa, 0xe3, 0x7d, + 0xbf, 0x47, 0x30, 0xa3, 0x93, 0xcd, 0x28, 0x0e, 0x93, 0x90, 0xe8, 0xd1, 0x49, 0xd7, 0x72, 0x22, + 0x4f, 0x82, 0x76, 0x17, 0xaa, 0x7b, 0x1e, 0x4f, 0x08, 0x81, 0x6a, 0xea, 0xb9, 0xbc, 0xa3, 0xad, + 0x57, 0x36, 0x0c, 0x8a, 0xdf, 0xf6, 0x3e, 0x58, 0x23, 0x87, 0x9f, 0xbf, 0x74, 0xfc, 0x94, 0x91, + 0x36, 0x54, 0x2e, 0x1c, 0xbf, 0xa3, 0xad, 0x6b, 0x1b, 0x4d, 0x2a, 0x3e, 0xc9, 0x26, 0x98, 0x17, + 0x8e, 0x3f, 0x4e, 0x2e, 0x23, 0xd6, 0xd1, 0xd7, 0xb5, 0x8d, 0xd5, 0xad, 0xb7, 0x37, 0xa3, 0x93, + 0xcd, 0xa3, 0x90, 0x27, 0x5e, 0x30, 0xdd, 0x7c, 0xe9, 0xf8, 0xa3, 0xcb, 0x88, 0xd1, 0xfa, 0x85, + 0xfc, 0xb0, 0x0f, 0xa1, 0x31, 0x8c, 0x27, 0xbb, 0x69, 0x30, 0x49, 0xbc, 0x30, 0x10, 0x27, 0x06, + 0xce, 0x8c, 0xe1, 0x8e, 0x16, 0xc5, 0x6f, 0xb1, 0xe6, 0xc4, 0x53, 0xde, 0xa9, 0xac, 0x57, 0xc4, + 0x9a, 0xf8, 0x26, 0x1d, 0xa8, 0x7b, 0x7c, 0x27, 0x4c, 0x83, 0xa4, 0x53, 0x5d, 0xd7, 0x36, 0x4c, + 0x9a, 0x81, 0xf6, 0x6f, 0x75, 0xa8, 0xfd, 0x5d, 0xca, 0xe2, 0x4b, 0xe4, 0x4b, 0x92, 0x38, 0xdb, + 0x4b, 0x7c, 0x93, 0xdb, 0x50, 0xf3, 0x9d, 0x60, 0xca, 0x3b, 0x3a, 0x6e, 0x26, 0x01, 0xf2, 0x2e, + 0x58, 0xce, 0x69, 0xc2, 0xe2, 0x71, 0xea, 0xb9, 0x9d, 0xca, 0xba, 0xb6, 0x61, 0x50, 0x13, 0x17, + 0x8e, 0x3d, 0x97, 0xdc, 0x05, 0xd3, 0x0d, 0xc7, 0x93, 0xf2, 0x59, 0x6e, 0x88, 0x67, 0x91, 0x0f, + 0xc0, 0x4c, 0x3d, 0x77, 0xec, 0x7b, 0x3c, 0xe9, 0xd4, 0xd6, 0xb5, 0x8d, 0xc6, 0x96, 0x29, 0x1e, + 0x2b, 0x64, 0x47, 0xeb, 0xa9, 0xe7, 0xa2, 0x10, 0x1f, 0x83, 0xc9, 0xe3, 0xc9, 0xf8, 0x34, 0x0d, + 0x26, 0x1d, 0x03, 0x89, 0x6e, 0x09, 0xa2, 0xd2, 0xab, 0x69, 0x9d, 0x4b, 0x40, 0x3c, 0x2b, 0x66, + 0x17, 0x2c, 0xe6, 0xac, 0x53, 0x97, 0x47, 0x29, 0x90, 0x3c, 0x81, 0xc6, 0xa9, 0x33, 0x61, 0xc9, + 0x38, 0x72, 0x62, 0x67, 0xd6, 0x31, 0x8b, 0x8d, 0x76, 0xc5, 0xf2, 0x91, 0x58, 0xe5, 0x14, 0x4e, + 0x73, 0x80, 0x7c, 0x0a, 0x2d, 0x84, 0xf8, 0xf8, 0xd4, 0xf3, 0x13, 0x16, 0x77, 0x2c, 0xe4, 0x59, + 0x45, 0x1e, 0x5c, 0x19, 0xc5, 0x8c, 0xd1, 0xa6, 0x24, 0x92, 0x2b, 0xe4, 0xaf, 0x01, 0xd8, 0x3c, + 0x72, 0x02, 0x77, 0xec, 0xf8, 0x7e, 0x07, 0xf0, 0x0e, 0x96, 0x5c, 0xd9, 0xf6, 0x7d, 0xf2, 0x8e, + 0xb8, 0x9f, 0xe3, 0x8e, 0x13, 0xde, 0x69, 0xad, 0x6b, 0x1b, 0x55, 0x6a, 0x08, 0x70, 0xc4, 0xed, + 0x2d, 0xb0, 0xd0, 0x22, 0xf0, 0xc5, 0x0f, 0xc0, 0xb8, 0x10, 0x80, 0x34, 0x9c, 0xc6, 0x56, 0x4b, + 0x1c, 0x99, 0x1b, 0x0d, 0x55, 0x48, 0x7b, 0x0d, 0xcc, 0x3d, 0x27, 0x98, 0x66, 0x96, 0x26, 0x54, + 0x81, 0x0c, 0x16, 0xc5, 0x6f, 0xfb, 0x07, 0x1d, 0x0c, 0xca, 0x78, 0xea, 0x27, 0xe4, 0x11, 0x80, + 0x10, 0xf4, 0xcc, 0x49, 0x62, 0x6f, 0xae, 0x76, 0x2d, 0x44, 0x6d, 0xa5, 0x9e, 0xbb, 0x8f, 0x28, + 0xf2, 0x04, 0x9a, 0xb8, 0x7b, 0x46, 0xaa, 0x17, 0x17, 0xc8, 0xef, 0x47, 0x1b, 0x48, 0xa2, 0x38, + 0xee, 0x80, 0x81, 0xba, 0x95, 0xf6, 0xd5, 0xa2, 0x0a, 0x22, 0x0f, 0x60, 0xd5, 0x0b, 0x12, 0x21, + 0xfb, 0x49, 0x32, 0x76, 0x19, 0xcf, 0x94, 0xdf, 0xca, 0x57, 0x7b, 0x8c, 0x27, 0xe4, 0x29, 0x48, + 0x01, 0x66, 0x07, 0xd6, 0xf0, 0xc0, 0xd5, 0x5c, 0x31, 0x5c, 0x9e, 0x88, 0x34, 0xea, 0xc4, 0x4f, + 0xa0, 0x21, 0xde, 0x97, 0x71, 0x18, 0xc8, 0xd1, 0xc4, 0xd7, 0x28, 0x71, 0x50, 0x10, 0x04, 0x8a, + 0x5c, 0x88, 0x46, 0x18, 0x98, 0x34, 0x08, 0xfc, 0xb6, 0xfb, 0x50, 0x3b, 0x8c, 0x5d, 0x16, 0x5f, + 0x69, 0xe3, 0x04, 0xaa, 0x2e, 0xe3, 0x13, 0x74, 0x3f, 0x93, 0xe2, 0x77, 0x61, 0xf7, 0x95, 0x92, + 0xdd, 0xdb, 0xff, 0xa1, 0x41, 0x63, 0x18, 0xc6, 0xc9, 0x3e, 0xe3, 0xdc, 0x99, 0x32, 0x72, 0x0f, + 0x6a, 0xa1, 0xd8, 0x56, 0x49, 0xd8, 0x12, 0x77, 0xc2, 0x73, 0xa8, 0x5c, 0x5f, 0xd2, 0x83, 0x7e, + 0xbd, 0x1e, 0x6e, 0x43, 0x4d, 0x7a, 0x8c, 0xf0, 0xa6, 0x1a, 0x95, 0x80, 0x90, 0x75, 0x78, 0x7a, + 0xca, 0x99, 0x94, 0x65, 0x8d, 0x2a, 0xe8, 0x7a, 0xb3, 0xfa, 0x5b, 0x00, 0x71, 0xbf, 0x9f, 0x68, + 0x05, 0xf6, 0x19, 0x34, 0xa8, 0x73, 0x9a, 0xec, 0x84, 0x41, 0xc2, 0xe6, 0x09, 0x59, 0x05, 0xdd, + 0x73, 0x51, 0x44, 0x06, 0xd5, 0x3d, 0x57, 0x5c, 0x6e, 0x1a, 0x87, 0x69, 0x84, 0x12, 0x6a, 0x51, + 0x09, 0xa0, 0x28, 0x5d, 0x37, 0xc6, 0x1b, 0x0b, 0x51, 0xba, 0x6e, 0x4c, 0xee, 0x41, 0x83, 0x07, + 0x4e, 0xc4, 0xcf, 0xc2, 0x44, 0x5c, 0xae, 0x8a, 0x97, 0x83, 0x6c, 0x69, 0xc4, 0xed, 0xff, 0xd3, + 0xc0, 0xd8, 0x67, 0xb3, 0x13, 0x16, 0xbf, 0x76, 0xca, 0x5d, 0x30, 0x71, 0xe3, 0xb1, 0xe7, 0xaa, + 0x83, 0xea, 0x08, 0x0f, 0xdc, 0x2b, 0x8f, 0xba, 0x03, 0x86, 0xcf, 0x1c, 0x21, 0x7c, 0x69, 0x67, + 0x0a, 0x12, 0xb2, 0x71, 0x66, 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xac, 0xc7, + 0x1c, 0x57, 0xdc, 0xcd, 0x77, 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x30, + 0x1c, 0x9e, 0x1c, 0xe3, 0x0a, 0x79, 0x0c, 0x6f, 0x4d, 0xfc, 0x94, 0x8b, 0xb8, 0xe6, 0x05, 0xa7, + 0xe1, 0x38, 0x0c, 0xfc, 0x4b, 0x94, 0xaf, 0x49, 0x6f, 0x29, 0xc4, 0x20, 0x38, 0x0d, 0x0f, 0x03, + 0xff, 0xd2, 0xfe, 0x83, 0x06, 0xb5, 0xe7, 0x28, 0x86, 0x27, 0x50, 0x9f, 0xe1, 0x83, 0x32, 0xef, + 0xbd, 0x23, 0x24, 0x8c, 0xb8, 0x4d, 0xf9, 0x52, 0xde, 0x0f, 0x92, 0xf8, 0x92, 0x66, 0x64, 0x82, + 0x23, 0x71, 0x4e, 0x7c, 0x96, 0x70, 0x65, 0x11, 0x25, 0x8e, 0x91, 0x44, 0x28, 0x0e, 0x45, 0xd6, + 0xdd, 0x85, 0x66, 0x79, 0x2b, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xca, 0xae, 0x4a, 0xc5, 0x27, 0x59, + 0x87, 0x1a, 0x3a, 0x29, 0x4a, 0xae, 0xb1, 0x05, 0x62, 0x47, 0xc9, 0x42, 0x25, 0xe2, 0x2b, 0xfd, + 0x0b, 0x4d, 0xec, 0x53, 0x3e, 0xa0, 0xbc, 0x8f, 0x75, 0xfd, 0x3e, 0x92, 0xa5, 0xb4, 0x8f, 0xfd, + 0x7b, 0x0d, 0x9a, 0xdf, 0xb2, 0x38, 0x3c, 0x8a, 0xc3, 0x28, 0xe4, 0x8e, 0x4f, 0x6c, 0x30, 0xe4, + 0xeb, 0xae, 0x38, 0x5f, 0x61, 0x04, 0x8d, 0x7c, 0x0f, 0xaa, 0x71, 0x71, 0x6f, 0x85, 0x21, 0x6b, + 0x00, 0x33, 0x67, 0xbe, 0xc7, 0x1c, 0xce, 0x06, 0x6e, 0x66, 0x3e, 0xc5, 0x0a, 0xe9, 0x82, 0x39, + 0x73, 0xe6, 0xa3, 0x79, 0x30, 0xe2, 0xa8, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x1e, 0x58, 0x33, 0x67, + 0x2e, 0xec, 0x78, 0xe0, 0x2a, 0xed, 0x16, 0x0b, 0xe4, 0x7d, 0xa8, 0x24, 0xf3, 0x00, 0x83, 0x82, + 0xc8, 0x03, 0x22, 0x77, 0x8f, 0xe6, 0x81, 0xb2, 0x78, 0x2a, 0x70, 0x99, 0x34, 0xcc, 0x42, 0x1a, + 0x6d, 0xa8, 0x4c, 0x3c, 0x17, 0x13, 0x81, 0x45, 0xc5, 0xa7, 0xfd, 0x3f, 0x15, 0xb8, 0xa5, 0x54, + 0x71, 0xe6, 0x45, 0xc3, 0x44, 0xd8, 0x4d, 0x07, 0xea, 0xe8, 0xae, 0x2c, 0x56, 0x1a, 0xc9, 0x40, + 0xf2, 0x39, 0x18, 0x68, 0xc2, 0x99, 0xa2, 0xef, 0x15, 0x62, 0xc9, 0xd9, 0xa5, 0xe2, 0x95, 0xc6, + 0x15, 0x39, 0xf9, 0x0c, 0x6a, 0xdf, 0xb3, 0x38, 0x94, 0xe1, 0xa7, 0xb1, 0xb5, 0x76, 0x15, 0x9f, + 0x50, 0x80, 0x62, 0x93, 0xc4, 0x7f, 0x41, 0xe9, 0xdd, 0x17, 0x01, 0x67, 0x16, 0x5e, 0x30, 0xb7, + 0x53, 0xc7, 0x1b, 0x95, 0x15, 0x9c, 0xa1, 0x32, 0x71, 0x99, 0xb9, 0xb8, 0xba, 0x3d, 0x68, 0x94, + 0x9e, 0x57, 0xb6, 0xb7, 0x96, 0x94, 0xf0, 0xbd, 0x45, 0x7b, 0xb3, 0x72, 0x4f, 0x28, 0x9b, 0x6d, + 0x0f, 0xa0, 0x78, 0xec, 0x9f, 0x6a, 0xfc, 0xf6, 0xbf, 0x6a, 0x70, 0x6b, 0x27, 0x0c, 0x02, 0x86, + 0x35, 0x84, 0x54, 0x5d, 0x61, 0xb7, 0xda, 0xb5, 0x76, 0xfb, 0x21, 0xd4, 0xb8, 0x20, 0x56, 0xbb, + 0xbf, 0x7d, 0x85, 0x2e, 0xa8, 0xa4, 0x10, 0x21, 0x66, 0xe6, 0xcc, 0xc7, 0x11, 0x0b, 0x5c, 0x2f, + 0x98, 0xa2, 0x9d, 0x4b, 0x0d, 0x1c, 0xc9, 0x15, 0xfb, 0x3f, 0x35, 0x30, 0xa4, 0xc9, 0x2f, 0x84, + 0x3b, 0x6d, 0x31, 0xdc, 0xbd, 0x07, 0x56, 0x14, 0x33, 0xd7, 0x9b, 0x64, 0xa7, 0x5a, 0xb4, 0x58, + 0x10, 0xd1, 0xf8, 0x34, 0x8c, 0x27, 0x0c, 0xb7, 0x37, 0xa9, 0x04, 0x44, 0x49, 0x86, 0x29, 0x01, + 0x83, 0x96, 0x8c, 0x88, 0xa6, 0x58, 0x10, 0xd1, 0x4a, 0xb0, 0xf0, 0xc8, 0x99, 0xc8, 0x22, 0xa9, + 0x42, 0x25, 0x20, 0x22, 0xa8, 0xd4, 0x1c, 0x6a, 0xcc, 0xa4, 0x0a, 0xb2, 0xff, 0x4b, 0x87, 0x66, + 0xcf, 0x8b, 0xd9, 0x24, 0x61, 0x6e, 0xdf, 0x9d, 0x22, 0x21, 0x0b, 0x12, 0x2f, 0xb9, 0x54, 0xd1, + 0x5a, 0x41, 0x79, 0x32, 0xd5, 0x17, 0x0b, 0x46, 0xa9, 0x8b, 0x0a, 0xd6, 0xb8, 0x12, 0x20, 0x5b, + 0x00, 0xb2, 0xcc, 0xc0, 0x3a, 0xb7, 0x7a, 0x7d, 0x9d, 0x6b, 0x21, 0x99, 0xf8, 0x14, 0x02, 0x92, + 0x3c, 0x9e, 0x8c, 0xe4, 0x06, 0x16, 0xc1, 0xa9, 0x30, 0x64, 0xcc, 0xce, 0x27, 0xcc, 0x47, 0x43, + 0xc5, 0xec, 0x7c, 0xc2, 0xfc, 0xbc, 0x26, 0xaa, 0xcb, 0xeb, 0x88, 0x6f, 0xf2, 0x01, 0xe8, 0x61, + 0x84, 0xef, 0x53, 0x07, 0x96, 0x1f, 0xb6, 0x79, 0x18, 0x51, 0x3d, 0x8c, 0x84, 0x15, 0xc8, 0xa2, + 0xae, 0x63, 0x29, 0xe3, 0x16, 0xe1, 0x01, 0xcb, 0x11, 0xaa, 0x30, 0xf6, 0x1d, 0xd0, 0x0f, 0x23, + 0x52, 0x87, 0xca, 0xb0, 0x3f, 0x6a, 0xaf, 0x88, 0x8f, 0x5e, 0x7f, 0xaf, 0xad, 0xd9, 0xaf, 0x34, + 0xb0, 0xf6, 0xd3, 0xc4, 0x11, 0x36, 0xc5, 0x6f, 0x52, 0xea, 0x5d, 0x30, 0x79, 0xe2, 0xc4, 0x98, + 0x17, 0x75, 0x19, 0x26, 0x10, 0x1e, 0x71, 0xf2, 0x10, 0x6a, 0xcc, 0x9d, 0xb2, 0xcc, 0xdb, 0xdb, + 0xcb, 0xf7, 0xa4, 0x12, 0x4d, 0x36, 0xc0, 0xe0, 0x93, 0x33, 0x36, 0x73, 0x3a, 0xd5, 0x82, 0x70, + 0x88, 0x2b, 0x32, 0x85, 0x51, 0x85, 0xc7, 0x1a, 0x3c, 0x0e, 0x23, 0x2c, 0x4a, 0x6b, 0xaa, 0x06, + 0x8f, 0xc3, 0x48, 0x94, 0xa4, 0x5b, 0xf0, 0x57, 0xde, 0x34, 0x08, 0x63, 0x36, 0xf6, 0x02, 0x97, + 0xcd, 0xc7, 0x93, 0x30, 0x38, 0xf5, 0xbd, 0x49, 0x82, 0xb2, 0x34, 0xe9, 0xdb, 0x12, 0x39, 0x10, + 0xb8, 0x1d, 0x85, 0xb2, 0x3f, 0x00, 0xeb, 0x05, 0xbb, 0xc4, 0x82, 0x90, 0x93, 0x3b, 0xa0, 0x9f, + 0x5f, 0xa8, 0x5c, 0x67, 0x88, 0x1b, 0xbc, 0x78, 0x49, 0xf5, 0xf3, 0x0b, 0x7b, 0x0e, 0xe6, 0x50, + 0x25, 0x7a, 0xf2, 0xa1, 0x08, 0x89, 0x18, 0x5a, 0x95, 0x63, 0x61, 0xe5, 0x5d, 0xaa, 0x31, 0x68, + 0x86, 0x17, 0xba, 0xc4, 0x8b, 0x28, 0xa1, 0x48, 0xa0, 0x5c, 0xe1, 0x54, 0xca, 0x15, 0x0e, 0x16, + 0x6b, 0x61, 0xc0, 0x94, 0x89, 0xe3, 0xb7, 0xfd, 0x6f, 0x3a, 0x98, 0x79, 0x2a, 0xfa, 0x08, 0xac, + 0x59, 0xa6, 0x0f, 0xe5, 0xb2, 0x58, 0xce, 0xe6, 0x4a, 0xa2, 0x05, 0x5e, 0xbd, 0xa5, 0xba, 0xfc, + 0x96, 0xc2, 0xe7, 0x6b, 0x6f, 0xf4, 0xf9, 0x47, 0x70, 0x6b, 0xe2, 0x33, 0x27, 0x18, 0x17, 0x2e, + 0x2b, 0xad, 0x72, 0x15, 0x97, 0x8f, 0x72, 0xbf, 0x55, 0x71, 0xab, 0x5e, 0xa4, 0x97, 0x07, 0x50, + 0x73, 0x99, 0x9f, 0x38, 0xe5, 0xee, 0xe4, 0x30, 0x76, 0x26, 0x3e, 0xeb, 0x89, 0x65, 0x2a, 0xb1, + 0x64, 0x03, 0xcc, 0xac, 0x82, 0x52, 0x3d, 0x09, 0x16, 0xbf, 0x99, 0xb0, 0x69, 0x8e, 0xb5, 0x9f, + 0x42, 0xe5, 0xc5, 0xcb, 0xe1, 0x75, 0x1a, 0xca, 0x65, 0xa7, 0x97, 0x64, 0xf7, 0x1d, 0xe8, 0x2f, + 0x5e, 0x96, 0x63, 0x6a, 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0x66, 0xca, + 0x59, 0xbc, 0xcf, 0x12, 0x47, 0x39, 0x77, 0x0e, 0x8b, 0x14, 0x28, 0xda, 0x2e, 0x2f, 0x0c, 0x54, + 0xda, 0xc9, 0x40, 0xfb, 0x37, 0x15, 0xa8, 0x2b, 0x27, 0x17, 0x7b, 0xa6, 0x79, 0xc9, 0x27, 0x3e, + 0x8b, 0x68, 0xa1, 0x97, 0xa3, 0x45, 0xb9, 0x27, 0xae, 0xbc, 0xb9, 0x27, 0x26, 0x5f, 0x41, 0x33, + 0x92, 0xb8, 0x72, 0x7c, 0x79, 0xa7, 0xcc, 0xa3, 0x7e, 0x91, 0xaf, 0x11, 0x15, 0x80, 0xf0, 0x14, + 0x6c, 0x2e, 0x12, 0x67, 0x8a, 0xca, 0x6e, 0xd2, 0xba, 0x80, 0x47, 0xce, 0xf4, 0x9a, 0x28, 0xf3, + 0x23, 0x82, 0x85, 0x28, 0x6d, 0xc3, 0xa8, 0xd3, 0xc4, 0x00, 0x20, 0x02, 0x4c, 0xd9, 0xf7, 0x5b, + 0x8b, 0xbe, 0xff, 0x2e, 0x58, 0x93, 0x70, 0x36, 0xf3, 0x10, 0xb7, 0x2a, 0x93, 0xb2, 0x5c, 0x18, + 0x71, 0xfb, 0x7b, 0xa8, 0xab, 0xc7, 0x92, 0x06, 0xd4, 0x7b, 0xfd, 0xdd, 0xed, 0xe3, 0x3d, 0x11, + 0x7d, 0x00, 0x8c, 0x67, 0x83, 0x83, 0x6d, 0xfa, 0x0f, 0x6d, 0x4d, 0x44, 0xa2, 0xc1, 0xc1, 0xa8, + 0xad, 0x13, 0x0b, 0x6a, 0xbb, 0x7b, 0x87, 0xdb, 0xa3, 0x76, 0x85, 0x98, 0x50, 0x7d, 0x76, 0x78, + 0xb8, 0xd7, 0xae, 0x92, 0x26, 0x98, 0xbd, 0xed, 0x51, 0x7f, 0x34, 0xd8, 0xef, 0xb7, 0x6b, 0x82, + 0xf6, 0x79, 0xff, 0xb0, 0x6d, 0x88, 0x8f, 0xe3, 0x41, 0xaf, 0x5d, 0x17, 0xf8, 0xa3, 0xed, 0xe1, + 0xf0, 0x9b, 0x43, 0xda, 0x6b, 0x9b, 0x62, 0xdf, 0xe1, 0x88, 0x0e, 0x0e, 0x9e, 0xb7, 0x2d, 0xfb, + 0x29, 0x34, 0x4a, 0x42, 0x13, 0x1c, 0xb4, 0xbf, 0xdb, 0x5e, 0x11, 0xc7, 0xbc, 0xdc, 0xde, 0x3b, + 0xee, 0xb7, 0x35, 0xb2, 0x0a, 0x80, 0x9f, 0xe3, 0xbd, 0xed, 0x83, 0xe7, 0x6d, 0xdd, 0xfe, 0x97, + 0x9c, 0x05, 0x7b, 0xd4, 0x47, 0x60, 0x2a, 0x49, 0x67, 0xa5, 0x71, 0xa3, 0xa4, 0x12, 0x9a, 0x23, + 0x85, 0x65, 0x4d, 0xce, 0xd8, 0xe4, 0x9c, 0xa7, 0x33, 0x65, 0x08, 0x39, 0x2c, 0xdb, 0x4d, 0x21, + 0x8e, 0x2c, 0x0e, 0x48, 0x28, 0x1f, 0xb5, 0x54, 0x91, 0x5e, 0x8e, 0x5a, 0x3e, 0x03, 0x28, 0x9a, + 0xfb, 0x2b, 0x8a, 0xdb, 0xdb, 0x50, 0x73, 0x7c, 0xcf, 0xe1, 0x2a, 0x61, 0x49, 0xc0, 0x3e, 0x80, + 0x46, 0x69, 0x24, 0x20, 0x74, 0xe5, 0xf8, 0xfe, 0xf8, 0x9c, 0x5d, 0x72, 0xe4, 0x35, 0x69, 0xdd, + 0xf1, 0xfd, 0x17, 0xec, 0x92, 0x93, 0xfb, 0x50, 0x93, 0xd3, 0x04, 0x7d, 0xa9, 0x69, 0x45, 0x56, + 0x2a, 0x91, 0xf6, 0xc7, 0x60, 0xc8, 0x4e, 0xb6, 0x64, 0x2a, 0xda, 0xb5, 0x79, 0xe5, 0x4b, 0x75, + 0x67, 0xec, 0x7b, 0xc9, 0x47, 0x6a, 0x6a, 0xc1, 0xe5, 0x8c, 0x44, 0x2b, 0x6a, 0x2d, 0x49, 0xa4, + 0x06, 0x16, 0x48, 0x6c, 0xf7, 0xc0, 0xbc, 0x71, 0x0e, 0xa4, 0x04, 0xa0, 0x17, 0x02, 0xb8, 0x62, + 0x32, 0x64, 0xff, 0x13, 0x40, 0x31, 0xdd, 0x50, 0x96, 0x2b, 0x77, 0x11, 0x96, 0xfb, 0x58, 0xa8, + 0xc6, 0xf3, 0xdd, 0x98, 0x05, 0x0b, 0xaf, 0x2e, 0xe6, 0x21, 0x39, 0x9e, 0xac, 0x43, 0x15, 0x87, + 0x36, 0x95, 0x22, 0x46, 0xe5, 0x13, 0x1b, 0xc4, 0xd8, 0x27, 0xd0, 0x92, 0xe9, 0x8a, 0xb2, 0x7f, + 0x4e, 0x19, 0xbf, 0xb1, 0x08, 0x5a, 0x03, 0xc8, 0x23, 0x6a, 0x36, 0x7e, 0x2a, 0xad, 0x08, 0xc3, + 0x38, 0xf5, 0x98, 0xef, 0x66, 0xaf, 0x51, 0x90, 0xfd, 0x39, 0x34, 0xb3, 0x33, 0x54, 0x13, 0x9c, + 0x25, 0x4d, 0x29, 0x4d, 0x59, 0xfb, 0x4b, 0x92, 0x83, 0xd0, 0xcd, 0x73, 0xa6, 0xfd, 0x4b, 0x3d, + 0xe3, 0x54, 0xfd, 0xe0, 0x42, 0x19, 0xa6, 0x2d, 0x97, 0x61, 0x8b, 0x25, 0x8d, 0xfe, 0xa3, 0x4a, + 0x9a, 0x2f, 0xc0, 0x72, 0x31, 0xaf, 0x7b, 0x17, 0x59, 0x64, 0xeb, 0x2e, 0xe7, 0x70, 0x95, 0xf9, + 0xbd, 0x0b, 0x46, 0x0b, 0x62, 0x71, 0x97, 0x24, 0x3c, 0x67, 0x81, 0xf7, 0x3d, 0x36, 0xbc, 0xe2, + 0xc1, 0xc5, 0x42, 0x31, 0x3d, 0x90, 0xb9, 0x5e, 0x4d, 0x0f, 0xb2, 0x41, 0x88, 0x51, 0x0c, 0x42, + 0x84, 0xd4, 0xd2, 0x88, 0xb3, 0x38, 0xc9, 0x6a, 0x3e, 0x09, 0xe5, 0xb5, 0x93, 0xa5, 0x68, 0x9d, + 0x60, 0x6a, 0x7f, 0x09, 0x56, 0x7e, 0x17, 0x11, 0x52, 0x0e, 0x0e, 0x0f, 0xfa, 0x32, 0x00, 0x0c, + 0x0e, 0x7a, 0xfd, 0xbf, 0x6f, 0x6b, 0x22, 0x28, 0xd1, 0xfe, 0xcb, 0x3e, 0x1d, 0xf6, 0xdb, 0xba, + 0x08, 0x1e, 0xbd, 0xfe, 0x5e, 0x7f, 0xd4, 0x6f, 0x57, 0xbe, 0xae, 0x9a, 0xf5, 0xb6, 0x49, 0x4d, + 0x36, 0x8f, 0x7c, 0x6f, 0xe2, 0x25, 0xf6, 0x31, 0x98, 0xfb, 0x4e, 0xf4, 0x5a, 0xfd, 0x5e, 0xe4, + 0x9a, 0x54, 0x35, 0xfd, 0x2a, 0x2f, 0x3c, 0x80, 0xba, 0x8a, 0x0e, 0xca, 0x9a, 0x16, 0x22, 0x47, + 0x86, 0xb3, 0xff, 0x5b, 0x83, 0xdb, 0xfb, 0xe1, 0x05, 0xcb, 0x93, 0xec, 0x91, 0x73, 0xe9, 0x87, + 0x8e, 0xfb, 0x06, 0xd5, 0x3d, 0x84, 0x5b, 0x3c, 0x4c, 0xe3, 0x09, 0x1b, 0x2f, 0x0d, 0x1c, 0x5a, + 0x72, 0xf9, 0xb9, 0x32, 0x41, 0x1b, 0x5a, 0x2e, 0xe3, 0x49, 0x41, 0x55, 0x41, 0xaa, 0x86, 0x58, + 0xcc, 0x68, 0xf2, 0x4a, 0xa1, 0xfa, 0xa6, 0x4a, 0xc1, 0xfe, 0x99, 0x06, 0xad, 0xfe, 0x3c, 0x0a, + 0xe3, 0x24, 0xbb, 0xe6, 0x0d, 0xe6, 0xff, 0x04, 0x0c, 0xc1, 0x95, 0x72, 0x65, 0x5a, 0x1d, 0xb1, + 0xf1, 0x02, 0xf7, 0xe6, 0x10, 0xf1, 0x54, 0xd1, 0x5d, 0x5f, 0x32, 0xbd, 0x03, 0xf5, 0x34, 0xf0, + 0xe6, 0xd9, 0x40, 0xa6, 0x42, 0x0d, 0x01, 0x8e, 0xb8, 0xfd, 0x15, 0x18, 0x72, 0x8f, 0x92, 0x76, + 0x1b, 0x50, 0x1f, 0x1e, 0xef, 0xec, 0xf4, 0x87, 0xc3, 0xb6, 0x46, 0x5a, 0x60, 0xf5, 0x8e, 0x8f, + 0xf6, 0x06, 0x3b, 0xdb, 0x23, 0xa5, 0xe1, 0xdd, 0xed, 0xc1, 0x5e, 0xbf, 0xd7, 0xae, 0xd8, 0x3b, + 0x60, 0x8d, 0xe6, 0x81, 0x62, 0x2f, 0xe7, 0x37, 0xed, 0x86, 0xfc, 0xa6, 0x2f, 0xe5, 0xb7, 0x21, + 0x34, 0x4a, 0xf5, 0x0e, 0x79, 0x1f, 0xaa, 0xc9, 0x3c, 0x58, 0x9c, 0x82, 0x66, 0x67, 0x50, 0x44, + 0x91, 0xf7, 0xa1, 0x29, 0x3a, 0x2c, 0x87, 0x73, 0x6f, 0x1a, 0x30, 0x57, 0xed, 0x28, 0xba, 0xae, + 0x6d, 0xb5, 0x64, 0xdf, 0x83, 0x96, 0x68, 0x69, 0xbd, 0x19, 0xe3, 0x89, 0x33, 0x8b, 0x30, 0x1b, + 0xab, 0x10, 0x5c, 0xa5, 0x7a, 0xc2, 0xed, 0x87, 0xd0, 0x3c, 0x62, 0x2c, 0xa6, 0x8c, 0x47, 0x61, + 0xc0, 0xb1, 0xbd, 0x51, 0xa2, 0x96, 0xf1, 0x5e, 0x41, 0xf6, 0x77, 0x60, 0x89, 0x8a, 0xf5, 0x99, + 0x93, 0x4c, 0xce, 0x7e, 0x4a, 0x45, 0xfb, 0x10, 0xea, 0x91, 0x54, 0x91, 0xaa, 0x3f, 0x9b, 0x18, + 0x72, 0x94, 0xda, 0x68, 0x86, 0xb4, 0x3f, 0x83, 0xca, 0x41, 0x3a, 0x2b, 0xff, 0x27, 0x50, 0x95, + 0x95, 0xd6, 0x42, 0x2f, 0xa7, 0x2f, 0xf6, 0x72, 0xf6, 0xb7, 0xd0, 0xc8, 0x9e, 0x3a, 0x70, 0x71, + 0xb0, 0x8f, 0xa2, 0x1e, 0xb8, 0x0b, 0x92, 0x97, 0x4d, 0x12, 0x0b, 0xdc, 0x41, 0x26, 0x23, 0x09, + 0x2c, 0xee, 0xad, 0x86, 0x00, 0xf9, 0xde, 0xbb, 0xd0, 0xcc, 0xaa, 0x4a, 0x2c, 0xeb, 0x84, 0xf2, + 0x7c, 0x8f, 0x05, 0x25, 0xc5, 0x9a, 0x72, 0x61, 0xc4, 0x6f, 0x98, 0xd7, 0xd9, 0xff, 0x08, 0xad, + 0x67, 0xce, 0xe4, 0x3c, 0x8d, 0xb2, 0x38, 0x5f, 0xb2, 0x4d, 0x6d, 0xc1, 0x36, 0x6f, 0x18, 0xfa, + 0xdd, 0x01, 0x23, 0x71, 0xe2, 0xa9, 0x9a, 0x17, 0x59, 0x54, 0x41, 0xf6, 0xbf, 0x6b, 0xb0, 0x9a, + 0xed, 0xae, 0x34, 0xd8, 0x81, 0xfa, 0x4c, 0x8e, 0x64, 0x95, 0xb3, 0x67, 0x20, 0x79, 0xba, 0xe4, + 0x46, 0x77, 0x85, 0xd6, 0x16, 0xb9, 0x97, 0xfc, 0xe8, 0xcf, 0xf1, 0x8a, 0xad, 0xff, 0xd5, 0xa0, + 0x2a, 0x6c, 0x82, 0xdc, 0x87, 0x6a, 0x7f, 0x72, 0x16, 0x92, 0x05, 0xd5, 0x77, 0x17, 0x20, 0x7b, + 0x85, 0x7c, 0x2c, 0xe7, 0xae, 0xd9, 0x38, 0xb9, 0x95, 0x99, 0x14, 0x9a, 0xdc, 0x6b, 0xd4, 0x9b, + 0xd0, 0xf8, 0x3a, 0xf4, 0x82, 0x1d, 0x39, 0x8a, 0x24, 0xcb, 0x06, 0xf8, 0x1a, 0xfd, 0x27, 0x60, + 0x0c, 0xb8, 0xb0, 0xf4, 0xd7, 0x49, 0xb1, 0x73, 0x2c, 0x3b, 0x81, 0xbd, 0xb2, 0xf5, 0x3b, 0x1d, + 0xaa, 0xdf, 0xb2, 0x38, 0x24, 0x1f, 0x43, 0x5d, 0xcd, 0x49, 0x48, 0x69, 0x1e, 0xd2, 0xc5, 0xd0, + 0xb6, 0x34, 0x40, 0xc1, 0x5b, 0x19, 0x2a, 0x5f, 0x16, 0xc3, 0x9b, 0xee, 0x55, 0x61, 0xd0, 0x5e, + 0xd9, 0xd0, 0x9e, 0x68, 0xe4, 0x23, 0x30, 0xa4, 0xcf, 0x2f, 0xc9, 0x66, 0xb9, 0xfb, 0xb1, 0x57, + 0x9e, 0x68, 0xe4, 0x11, 0x34, 0x86, 0x67, 0x61, 0xea, 0xbb, 0x43, 0x16, 0x5f, 0x30, 0x52, 0x1a, + 0x19, 0x76, 0x4b, 0xdf, 0xf6, 0x0a, 0xd9, 0x00, 0x90, 0x5e, 0x71, 0xec, 0xb9, 0x9c, 0xd4, 0x05, + 0xee, 0x20, 0x9d, 0xc9, 0x4d, 0x4b, 0xee, 0x22, 0x29, 0x4b, 0xb1, 0xe1, 0x26, 0xca, 0x4f, 0xa1, + 0xb5, 0x83, 0x91, 0xea, 0x30, 0xde, 0x3e, 0x09, 0xe3, 0x84, 0x2c, 0x8f, 0x0d, 0xbb, 0xcb, 0x0b, + 0xf6, 0x0a, 0x79, 0x02, 0xe6, 0x28, 0xbe, 0x94, 0xf4, 0x6f, 0xa9, 0x08, 0x56, 0x9c, 0x77, 0xc5, + 0x2b, 0xb7, 0x7e, 0x51, 0x01, 0xe3, 0x9b, 0x30, 0x3e, 0x67, 0x31, 0x79, 0x0c, 0x06, 0xb6, 0xa9, + 0xca, 0x14, 0xf2, 0x96, 0xf5, 0xaa, 0x83, 0xee, 0x83, 0x85, 0x42, 0x19, 0x39, 0xfc, 0x5c, 0x8a, + 0x1e, 0xff, 0xc5, 0x93, 0x72, 0x91, 0xb5, 0x0f, 0xda, 0xc0, 0xea, 0x30, 0x89, 0x99, 0x33, 0xcb, + 0x5b, 0xf3, 0x85, 0xde, 0xb1, 0x5b, 0x97, 0xed, 0xe1, 0x50, 0x29, 0xe7, 0x43, 0xa8, 0x0e, 0xe5, + 0x4b, 0x05, 0x51, 0xf1, 0x4f, 0x47, 0x77, 0x35, 0x5b, 0xc8, 0x77, 0xfe, 0x1b, 0x30, 0x64, 0xd9, + 0x22, 0x9f, 0xb9, 0x50, 0xd7, 0x75, 0xdb, 0xe5, 0x25, 0xc5, 0x60, 0x43, 0xfd, 0x28, 0x8d, 0xa7, + 0x6c, 0xc4, 0x97, 0x34, 0x9f, 0xe9, 0xc0, 0x5e, 0x11, 0xee, 0x2a, 0x9d, 0x53, 0x6e, 0xba, 0x10, + 0x44, 0xba, 0xe4, 0x75, 0xdf, 0x45, 0x81, 0x1b, 0x32, 0x2d, 0x4a, 0x96, 0x85, 0x14, 0xd9, 0x7d, + 0x7d, 0x09, 0x65, 0xd2, 0xa6, 0x6c, 0xc2, 0xbc, 0x52, 0xdd, 0x40, 0x32, 0x39, 0x2c, 0x3b, 0xd1, + 0x86, 0x46, 0xbe, 0x84, 0xd6, 0x42, 0x8d, 0x41, 0x30, 0x15, 0x5f, 0x55, 0x76, 0x2c, 0x33, 0x3f, + 0x6b, 0xff, 0xff, 0xab, 0x35, 0xed, 0xe7, 0xaf, 0xd6, 0xb4, 0x5f, 0xbd, 0x5a, 0xd3, 0x7e, 0xf8, + 0xf5, 0xda, 0xca, 0x89, 0x81, 0x7f, 0x18, 0x7f, 0xfa, 0xc7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4a, + 0x15, 0x0b, 0x86, 0x4b, 0x1e, 0x00, 0x00, } diff --git a/worker/backup.go b/worker/backup.go index 01bd7d02506..1159ff0a74f 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -42,18 +42,18 @@ func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupRespons resp.Message = err.Error() return resp, err } - glog.Infof("Backup requested at %d.", in.StartTs) + glog.Infof("Backup requested at %d.", in.ReadTs) // wait for this node to catch-up. - if err := posting.Oracle().WaitForTs(ctx, in.StartTs); err != nil { + if err := posting.Oracle().WaitForTs(ctx, in.ReadTs); err != nil { resp.Message = err.Error() return resp, err } - glog.Infof("Running backup for group %d at timestamp %d.", in.GroupId, in.StartTs) + glog.Infof("Running backup for group %d at timestamp %d.", in.GroupId, in.ReadTs) // process this request w := &backup.Worker{ - ReadTs: in.StartTs, + ReadTs: in.ReadTs, GroupId: in.GroupId, SeqTs: fmt.Sprint(time.Now().UTC().UnixNano()), TargetURI: in.Target, @@ -82,7 +82,7 @@ func backupDispatch(ctx context.Context, readTs uint64, target string, gids []ui glog.Infof("Dispatching backup requests...") for _, gid := range gids { glog.V(3).Infof("Backup dispatch to group %d snapshot at %d", gid, readTs) - in := &pb.BackupRequest{StartTs: readTs, GroupId: gid, Target: target} + in := &pb.BackupRequest{ReadTs: readTs, GroupId: gid, Target: target} // this node is part of the group, process backup. if groups().groupId() == gid { resp, err := backupProcess(ctx, in) diff --git a/worker/draft.go b/worker/draft.go index 4710919f676..67cadb7635b 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -37,6 +37,7 @@ import ( "github.com/dgraph-io/dgraph/raftwal" "github.com/dgraph-io/dgraph/schema" "github.com/dgraph-io/dgraph/types" + "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" @@ -774,8 +775,8 @@ func (n *node) rollupLists(readTs uint64) error { writer := x.NewTxnWriter(pstore) writer.BlindWrite = true // Do overwrite keys. - sl := streamLists{stream: writer, db: pstore} - sl.chooseKey = func(item *badger.Item) bool { + sl := stream.Lists{Stream: writer, DB: pstore} + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) if pk.IsSchema() { // Skip if schema. diff --git a/worker/export.go b/worker/export.go index 877909b2698..4453ef2875a 100644 --- a/worker/export.go +++ b/worker/export.go @@ -36,6 +36,7 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/types" "github.com/dgraph-io/dgraph/types/facets" + "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" ) @@ -269,8 +270,8 @@ func export(ctx context.Context, in *pb.ExportPayload) error { } mux := writerMux{data: dataWriter, schema: schemaWriter} - sl := streamLists{stream: &mux, db: pstore} - sl.chooseKey = func(item *badger.Item) bool { + sl := stream.Lists{Stream: &mux, DB: pstore} + sl.ChooseKeyFunc = func(item *badger.Item) bool { pk := x.Parse(item.Key()) if pk.Attr == "_predicate_" { return false @@ -282,7 +283,7 @@ func export(ctx context.Context, in *pb.ExportPayload) error { // written to a different file. return pk.IsData() || pk.IsSchema() } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() pk := x.Parse(item.Key()) @@ -315,7 +316,7 @@ func export(ctx context.Context, in *pb.ExportPayload) error { } // All prepwork done. Time to roll. - if err := sl.orchestrate(ctx, "Export", in.ReadTs); err != nil { + if err := sl.Orchestrate(ctx, "Export", in.ReadTs); err != nil { return err } if err := mux.data.Close(); err != nil { diff --git a/worker/predicate.go b/worker/predicate.go index 319ea09f753..5aae80014ff 100644 --- a/worker/predicate.go +++ b/worker/predicate.go @@ -26,6 +26,7 @@ import ( "github.com/dgraph-io/dgraph/conn" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + ws "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" ) @@ -105,12 +106,12 @@ func doStreamSnapshot(snap *pb.Snapshot, stream pb.Worker_StreamSnapshotServer) // at timestamp=1. var numKeys uint64 - sl := streamLists{stream: stream, db: pstore} - sl.chooseKey = func(_ *badger.Item) bool { + sl := ws.Lists{Stream: stream, DB: pstore} + sl.ChooseKeyFunc = func(_ *badger.Item) bool { // Pick all keys. return true } - sl.itemToKv = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { + sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { atomic.AddUint64(&numKeys, 1) item := itr.Item() pk := x.Parse(key) @@ -138,7 +139,7 @@ func doStreamSnapshot(snap *pb.Snapshot, stream pb.Worker_StreamSnapshotServer) return l.MarshalToKv() } - if err := sl.Orchestrate(s.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { + if err := sl.Orchestrate(stream.Context(), "Sending SNAPSHOT", snap.ReadTs); err != nil { return err } // Indicate that sending is done. From c8d9054812d3f2a85bace290f821d5f069209ffa Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 30 Oct 2018 18:04:37 -0700 Subject: [PATCH 10/25] logging changes for debugging --- ee/backup/backup.go | 6 +++--- ee/backup/writer.go | 17 +++++++---------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index 0c7d1c1d6a0..190ca068ebe 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -44,15 +44,15 @@ func (w *Worker) Process(ctx context.Context) error { return kv, nil } - glog.Infof("Backup started ...") + glog.V(3).Infof("Backup started ...") if err = sl.Orchestrate(ctx, "Backup", w.ReadTs); err != nil { return err } - glog.Infof("Backup saving ...") + glog.V(3).Infof("Backup saving ...") if err = c.save(); err != nil { return err } - glog.Infof("Backup complete: group %d @ %d", w.GroupId, w.ReadTs) + glog.Infof("Backup complete: group %d at %d", w.GroupId, w.ReadTs) return nil } diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 7987c313be4..5b5782fc094 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -25,7 +25,7 @@ type writer struct { } func (w *writer) save() error { - glog.Infof("Saving backup to: %q", w.file) + glog.Infof("Saving: %q", w.file) if err := w.dst.Copy(w.tmp.Name(), w.file); err != nil { return err } @@ -35,15 +35,13 @@ func (w *writer) save() error { } func (w *writer) cleanup() error { - // always remove the temp file defer func() { if err := os.Remove(w.tmp.Name()); err != nil { // let the user know there's baggage left behind. they might have to delete by hand. - glog.Errorf("failed to remove temp file %q: %s", w.tmp.Name(), err) + glog.Errorf("Failed to remove temp file %q: %s", w.tmp.Name(), err) } }() - - glog.V(3).Info("cleaning up ...") + glog.V(3).Info("Backup cleanup ...") if err := w.tmp.Close(); err != nil { return err } @@ -64,15 +62,14 @@ func newWriter(worker *Worker) (*writer, error) { // we will prepare this file and then copy to dst when done. w.tmp, err = ioutil.TempFile("", dgraphBackupTempPrefix) if err != nil { - glog.Errorf("could not create temp file: %s\n", err) + glog.Errorf("Failed to create temp file: %s\n", err) return nil, err } - glog.V(3).Infof("temp file: %q", w.tmp.Name()) + glog.V(3).Infof("Backup temp file: %q", w.tmp.Name()) - // file name: 1283719371922.12.3242423938.dgraph-backup - w.file = fmt.Sprintf("%s.%d.%d%s", + w.file = fmt.Sprintf("%s-g%d-r%d%s", worker.SeqTs, worker.GroupId, worker.ReadTs, dgraphBackupSuffix) - glog.V(3).Infof("target file %q", w.file) + glog.V(3).Infof("Backup target file name: %q", w.file) return &w, err } From 6ea468884770835777f292d3d68eaf1a8de89b65 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 30 Oct 2018 18:36:54 -0700 Subject: [PATCH 11/25] added some error checks, tweaked comments. --- .../{writer_local.go => handler_file.go} | 0 ee/backup/writer.go | 4 +-- worker/backup.go | 29 ++++++++++--------- worker/stream/stream.go | 7 ++--- 4 files changed, 19 insertions(+), 21 deletions(-) rename ee/backup/{writer_local.go => handler_file.go} (100%) diff --git a/ee/backup/writer_local.go b/ee/backup/handler_file.go similarity index 100% rename from ee/backup/writer_local.go rename to ee/backup/handler_file.go diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 5b5782fc094..3f11e8ef39e 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -65,11 +65,11 @@ func newWriter(worker *Worker) (*writer, error) { glog.Errorf("Failed to create temp file: %s\n", err) return nil, err } - glog.V(3).Infof("Backup temp file: %q", w.tmp.Name()) + glog.V(3).Infof("temp file: %q", w.tmp.Name()) w.file = fmt.Sprintf("%s-g%d-r%d%s", worker.SeqTs, worker.GroupId, worker.ReadTs, dgraphBackupSuffix) - glog.V(3).Infof("Backup target file name: %q", w.file) + glog.V(3).Infof("target file name: %q", w.file) return &w, err } diff --git a/worker/backup.go b/worker/backup.go index 1159ff0a74f..49a948778ad 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -29,6 +29,7 @@ import ( ) func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupResponse, error) { + glog.Infof("Backup request: group %d at %d", in.GroupId, in.ReadTs) resp := &pb.BackupResponse{Status: pb.BackupResponse_FAILED} if err := ctx.Err(); err != nil { glog.Errorf("Context error during backup: %v\n", err) @@ -42,16 +43,12 @@ func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupRespons resp.Message = err.Error() return resp, err } - glog.Infof("Backup requested at %d.", in.ReadTs) - // wait for this node to catch-up. if err := posting.Oracle().WaitForTs(ctx, in.ReadTs); err != nil { resp.Message = err.Error() return resp, err } - glog.Infof("Running backup for group %d at timestamp %d.", in.GroupId, in.ReadTs) - - // process this request + // create backup worker and process this request w := &backup.Worker{ ReadTs: in.ReadTs, GroupId: in.GroupId, @@ -70,7 +67,7 @@ func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupRespons // Backup handles a request coming from another node. func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest, ) (*pb.BackupResponse, error) { - glog.Infof("Received backup request via Grpc: %+v\n", req) + glog.Infof("Received backup request via Grpc: %+v", req) return backupProcess(ctx, req) } @@ -81,13 +78,13 @@ func backupDispatch(ctx context.Context, readTs uint64, target string, gids []ui go func() { glog.Infof("Dispatching backup requests...") for _, gid := range gids { - glog.V(3).Infof("Backup dispatch to group %d snapshot at %d", gid, readTs) + glog.V(3).Infof("Backup dispatched to group %d snapshot at %d", gid, readTs) in := &pb.BackupRequest{ReadTs: readTs, GroupId: gid, Target: target} // this node is part of the group, process backup. if groups().groupId() == gid { resp, err := backupProcess(ctx, in) if err != nil { - glog.Errorf("Error while running backup: %v", err) + glog.Errorf("Error while running backup: %s", err) } out <- resp continue @@ -97,7 +94,7 @@ func backupDispatch(ctx context.Context, readTs uint64, target string, gids []ui c := pb.NewWorkerClient(pl.Get()) resp, err := c.Backup(ctx, in) if err != nil { - glog.Errorf("Backup error received from group: %d. Error: %v\n", gid, err) + glog.Errorf("Backup error group %d: %s", gid, err) } out <- resp } @@ -110,22 +107,25 @@ func backupDispatch(ctx context.Context, readTs uint64, target string, gids []ui func BackupOverNetwork(ctx context.Context, target string) error { // Check that this node can accept requests. if err := x.HealthCheck(); err != nil { - glog.Errorf("Backup canceled, not ready to accept requests: %v\n", err) + glog.Errorf("Backup canceled, not ready to accept requests: %s", err) return err } // Get ReadTs from zero and wait for stream to catch up. ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) if err != nil { - glog.Errorf("Unable to retrieve readonly ts for backup: %v\n", err) + glog.Errorf("Unable to retrieve readonly ts for backup: %s", err) return err } readTs := ts.ReadOnly - glog.Infof("Got readonly ts from Zero: %d\n", readTs) - posting.Oracle().WaitForTs(ctx, readTs) + glog.Infof("Got readonly ts from Zero: %d", readTs) + if err := posting.Oracle().WaitForTs(ctx, readTs); err != nil { + glog.Errorf("Error while waiting for ts: %s", err) + return err + } // Let's first collect all groups. gids := groups().KnownGroups() - glog.Infof("Requesting backup for groups: %v\n", gids) + glog.Infof("Requesting backup for groups: %v", gids) // This will dispatch the request to all groups and wait for their response. // If we receive any failures, we cancel the process. @@ -134,5 +134,6 @@ func BackupOverNetwork(ctx context.Context, target string) error { return x.Errorf("Backup error: %s", resp.Message) } } + glog.Infof("Backup done.") return nil } diff --git a/worker/stream/stream.go b/worker/stream/stream.go index f35675ce7dc..1d2b33ecfc2 100644 --- a/worker/stream/stream.go +++ b/worker/stream/stream.go @@ -30,10 +30,7 @@ import ( "golang.org/x/net/context" ) -const ( - // MB represents a megabyte. - MB = 1 << 20 -) +const pageSize = 1 << 20 * 4 // 4MB type kvStream interface { Send(*pb.KVS) error @@ -119,7 +116,7 @@ func (sl *Lists) produceRanges(ctx context.Context, ts uint64, keyCh chan keyRan } size += item.EstimatedSize() - if size > 4*MB { + if size > pageSize { kr := keyRange{start: start, end: item.KeyCopy(nil)} keyCh <- kr start = item.KeyCopy(nil) From 00a1cd049294dbc7a412c3a31efc2af91cef7edb Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 31 Oct 2018 21:06:45 -0700 Subject: [PATCH 12/25] moved stream pkg out of worker. removed binary encoding package, using encode/binary with size delimiter. fixed race and added posting list values to backup. fixed issue with file handler that was breaking badger. refactored backup process to be simpler. added generic Status proto for any service response. added minio and used it for S3 backup uploads. --- ee/backup/backup.go | 45 +- ee/backup/handler.go | 47 +- ee/backup/handler_file.go | 75 +-- ee/backup/handler_s3.go | 112 ++++ ee/backup/session.go | 19 + ee/backup/writer.go | 97 +-- protos/pb.proto | 20 +- protos/pb/pb.pb.go | 815 +++++++++++------------ {worker/stream => stream}/doc.go | 0 {worker/stream => stream}/stream.go | 2 +- {worker/stream => stream}/stream_test.go | 0 worker/backup.go | 92 +-- worker/draft.go | 2 +- worker/export.go | 2 +- worker/predicate.go | 2 +- worker/predicate_move.go | 2 +- x/file.go | 6 + 17 files changed, 719 insertions(+), 619 deletions(-) create mode 100644 ee/backup/handler_s3.go create mode 100644 ee/backup/session.go rename {worker/stream => stream}/doc.go (100%) rename {worker/stream => stream}/stream.go (99%) rename {worker/stream => stream}/stream_test.go (100%) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index 190ca068ebe..23093b7f630 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -9,50 +9,65 @@ import ( "context" "github.com/dgraph-io/badger" + "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" - "github.com/dgraph-io/dgraph/worker/stream" + "github.com/dgraph-io/dgraph/stream" + "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" ) -// Worker has all the information needed to perform a backup. -type Worker struct { +// Request has all the information needed to perform a backup. +type Request struct { ReadTs uint64 // Timestamp to read at. GroupId uint32 // The group ID of this node. - SeqTs string // Sequence data to label backup at the target. + UnixTs string // Sequence Ts to label the backup file(s) at the target. TargetURI string // The intended location as URI. DB *badger.DB // Badger pstore managed by this node. } -// Process uses the worker values to create a stream writer then hand off the data +// Process uses the request values to create a stream writer then hand off the data // retrieval to stream.Orchestrate. The writer will create all the fd's needed to // collect the data and later move to the target. // Returns errors on failure, nil on success. -func (w *Worker) Process(ctx context.Context) error { - c, err := newWriter(w) +func (r *Request) Process(ctx context.Context) error { + w, err := newWriter(r) if err != nil { return err } - sl := stream.Lists{Stream: c, DB: w.DB} + sl := stream.Lists{Stream: w, DB: r.DB} sl.ChooseKeyFunc = func(_ *badger.Item) bool { return true } sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() - val, err := item.ValueCopy(nil) + pk := x.Parse(key) + if pk.IsSchema() { + val, err := item.ValueCopy(nil) + if err != nil { + return nil, err + } + kv := &pb.KV{ + Key: key, + Val: val, + UserMeta: []byte{item.UserMeta()}, + Version: item.Version(), + } + return kv, nil + } + l, err := posting.ReadPostingList(key, itr) if err != nil { return nil, err } - kv := &pb.KV{Key: item.KeyCopy(nil), Val: val, Version: item.Version()} - return kv, nil + return l.MarshalToKv() } glog.V(3).Infof("Backup started ...") - if err = sl.Orchestrate(ctx, "Backup", w.ReadTs); err != nil { + if err = sl.Orchestrate(ctx, "Backup", r.ReadTs); err != nil { return err } - glog.V(3).Infof("Backup saving ...") - if err = c.save(); err != nil { + glog.V(3).Infof("Backup finishing ...") + if err = w.close(); err != nil { return err } - glog.Infof("Backup complete: group %d at %d", w.GroupId, w.ReadTs) + glog.Infof("Backup complete: group %d at %d", r.GroupId, r.ReadTs) return nil } diff --git a/ee/backup/handler.go b/ee/backup/handler.go index 1e4381a1ac6..3490ba905a0 100644 --- a/ee/backup/handler.go +++ b/ee/backup/handler.go @@ -6,20 +6,19 @@ package backup import ( - "net/url" + "io" "sync" "github.com/dgraph-io/dgraph/x" ) -// handler interface is implemented by uri scheme handlers. -// -// Session() will read any supported environment variables and authenticate if needed. -// Copy() copies a local file to a new destination, possibly remote. -// Exists() tests if a file exists at destination. +// handler interface is implemented by URI scheme handlers. type handler interface { - Copy(string, string) error - Session(string, string) error + // Handlers know how to Write and Close to their target. + io.WriteCloser + // Session receives the host and path of the target. It should get all its configuration + // from the environment. + Open(*session) error } // handlers map URI scheme to a handler. @@ -34,34 +33,24 @@ var handlers struct { m map[string]handler } -// getSchemeHandler takes a URI and picks the parts we need for creating a scheme handler. -// The scheme handler knows how to authenticate itself (using URI params), and how to copy -// itself to the destination target. -// Returns a new file handler on success, error otherwise. -func getSchemeHandler(uri string) (handler, error) { - u, err := url.Parse(uri) - if err != nil { - return nil, err - } - // target might be just a dir like '/tmp/backup', then default to local file handler. - if u.Scheme == "" { - u.Scheme = "file" - } +// getHandler takes an URI scheme and finds a handler for it. +// Returns the handler on success, error otherwise. +func getHandler(scheme string) (handler, error) { handlers.Lock() defer handlers.Unlock() - h, ok := handlers.m[u.Scheme] - if !ok { - return nil, x.Errorf("invalid scheme %q", u.Scheme) + // target might be just a dir like '/tmp/backup', then default to local file handler. + if scheme == "" { + scheme = "file" } - if err := h.Session(u.Host, u.Path); err != nil { - return nil, err + if h, ok := handlers.m[scheme]; ok { + return h, nil } - return h, nil + return nil, x.Errorf("Unsupported URI scheme %q", scheme) } -// addSchemeHandler registers a new scheme handler. If the handler is already registered +// addHandler registers a new scheme handler. If the handler is already registered // we just ignore the request. -func addSchemeHandler(scheme string, h handler) { +func addHandler(scheme string, h handler) { handlers.Lock() defer handlers.Unlock() if handlers.m == nil { diff --git a/ee/backup/handler_file.go b/ee/backup/handler_file.go index 10839b83616..b7d2eb79c6d 100644 --- a/ee/backup/handler_file.go +++ b/ee/backup/handler_file.go @@ -6,77 +6,64 @@ package backup import ( - "io" "os" "path/filepath" - "strings" + "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" ) // fileHandler is used for 'file:' URI scheme. type fileHandler struct { - path string + *session + fp *os.File } -// Session authenticates or prepares a handler session. +// Open authenticates or prepares a handler session. // Returns error on failure, nil on success. -func (h *fileHandler) Session(_, path string) error { - h.path = path - return os.Chdir(h.path) -} - -// List returns a list of Dgraph backup files at target. -// Returns a list (might be empty) on success, error otherwise. -func (h *fileHandler) List() ([]string, error) { - return filepath.Glob(filepath.Join(h.path, "*"+dgraphBackupSuffix)) -} - -// Copy is called when we are ready to transmit a file to the target. -// Returns error on failure, nil on success. -func (h *fileHandler) Copy(in, out string) error { - if filepath.Base(out) == out { - out = filepath.Join(h.path, out) - } - - if h.Exists(out) { - glog.Errorf("File already exists on target: %q", out) - return os.ErrExist - } - - // if we are in the same volume, just rename. it should work on NFS too. - if strings.HasPrefix(in, h.path) { - glog.V(3).Infof("renaming %q to %q", in, out) - return os.Rename(in, out) +func (h *fileHandler) Open(s *session) error { + // check that this path exists and we can access it. + if !h.Exists(s.path) { + return x.Errorf("The path %q does not exist or it is inaccessible.", s.path) } - - src, err := os.Open(in) - if err != nil { - return err - } - defer src.Close() - - dst, err := os.Create(out) + path := filepath.Join(s.path, s.file) + fp, err := os.Create(path) if err != nil { return err } - defer dst.Close() + glog.V(3).Infof("using file path: %q", path) + h.fp = fp + h.session = s + return nil +} - if _, err = io.Copy(dst, src); err != nil { +func (h *fileHandler) Close() error { + defer func() { + if err := h.fp.Close(); err != nil { + glog.Errorf("Failed to close file %q: %s", h.file, err) + } + }() + if err := h.fp.Sync(); err != nil { return err } + return nil +} - return dst.Sync() +func (h *fileHandler) Write(b []byte) (int, error) { + return h.fp.Write(b) } // Exists checks if a path (file or dir) is found at target. // Returns true if found, false otherwise. func (h *fileHandler) Exists(path string) bool { _, err := os.Stat(path) - return os.IsExist(err) + if err == nil { + return true + } + return !os.IsNotExist(err) && !os.IsPermission(err) } // Register this handler func init() { - addSchemeHandler("file", &fileHandler{}) + addHandler("file", &fileHandler{}) } diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go new file mode 100644 index 00000000000..a5a691bc0ae --- /dev/null +++ b/ee/backup/handler_s3.go @@ -0,0 +1,112 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +import ( + "bufio" + "io" + "os" + "path/filepath" + "strings" + + "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" + minio "github.com/minio/minio-go" +) + +const ( + bufSize = 1 << 20 + defaultS3Endpoint = "s3.amazonaws.com" +) + +// s3Handler is used for 's3:' URI scheme. +type s3Handler struct { + client *minio.Client + buf *bufio.Writer + pr io.ReadCloser + pw io.WriteCloser +} + +func (h *s3Handler) Open(s *session) error { + var err error + + accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") + secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") + if accessKeyID == "" || secretAccessKey == "" { + return x.Errorf("Env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not set.") + } + // s3:///bucket/folder + if !strings.Contains(s.host, ".") { + s.path = s.host + s.host = "" + } + // no host part, use default server + if s.host == "" { + s.host = defaultS3Endpoint + } + glog.V(3).Infof("using S3 host: %s", s.host) + + if len(s.path) < 1 { + return x.Errorf("The bucket name %q is invalid", s.path) + } + // split path into bucket and blob + parts := strings.Split(s.path[1:], "/") + s.path = parts[0] // bucket + if len(parts) > 1 { + parts = append(parts, s.file) + // blob: folder1/...folderN/file1 + s.file = filepath.Join(parts[1:]...) + } + glog.V(3).Infof("sending to S3: bucket[%q] blob[%q]", s.path, s.file) + + // secure by default + secure := s.Getarg("secure") != "false" + + h.client, err = minio.New(s.host, accessKeyID, secretAccessKey, secure) + if err != nil { + return err + } + + h.pr, h.pw = io.Pipe() + h.buf = bufio.NewWriterSize(h.pw, bufSize) + + // block until done. + go func() { + for { + glog.V(3).Infof("--- blocking for pipe reader ...") + _, err := h.client.PutObject(s.path, s.file, h.pr, -1, + minio.PutObjectOptions{ContentType: "application/octet-stream"}) + if err != nil { + // TODO: need to send this back to caller + glog.Errorf("PutObject %s, %s: %v", s.path, s.file, err) + } + glog.V(3).Infof("--- done with pipe") + break + } + if err := h.pr.Close(); err != nil { + glog.V(3).Infof("failure closing pipe reader: %s", err) + } + }() + + return nil +} + +func (h *s3Handler) Write(b []byte) (int, error) { + return h.buf.Write(b) +} + +func (h *s3Handler) Close() error { + defer func() { + if err := h.pw.Close(); err != nil { + glog.V(3).Infof("failure closing pipe writer: %s", err) + } + }() + return h.buf.Flush() +} + +func init() { + addHandler("s3", &s3Handler{}) +} diff --git a/ee/backup/session.go b/ee/backup/session.go new file mode 100644 index 00000000000..ef22573fb9b --- /dev/null +++ b/ee/backup/session.go @@ -0,0 +1,19 @@ +/* + * Copyright 2018 Dgraph Labs, Inc. All rights reserved. + * + */ + +package backup + +// session holds the session config for a handler. +type session struct { + host, path, file string + args map[string][]string +} + +func (s *session) Getarg(key string) string { + if v, ok := s.args[key]; ok && len(v) > 0 { + return v[0] + } + return "" +} diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 3f11e8ef39e..716b12de245 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -6,81 +6,86 @@ package backup import ( + "encoding/binary" "fmt" - "io/ioutil" - "os" + "net/url" "github.com/dgraph-io/dgraph/protos/pb" "github.com/golang/glog" - "github.com/matttproud/golang_protobuf_extensions/pbutil" ) const dgraphBackupTempPrefix = "dgraph-backup-*" const dgraphBackupSuffix = ".dgraph-backup" +// writer handles the writes from stream.Orchestrate. It implements the kvStream interface. type writer struct { + h handler file string - dst handler - tmp *os.File } -func (w *writer) save() error { - glog.Infof("Saving: %q", w.file) - if err := w.dst.Copy(w.tmp.Name(), w.file); err != nil { - return err - } - glog.V(3).Infof("copied %q to %q on target ...", w.tmp.Name(), w.file) - // we are done done, cleanup. - return w.cleanup() -} - -func (w *writer) cleanup() error { - defer func() { - if err := os.Remove(w.tmp.Name()); err != nil { - // let the user know there's baggage left behind. they might have to delete by hand. - glog.Errorf("Failed to remove temp file %q: %s", w.tmp.Name(), err) - } - }() - glog.V(3).Info("Backup cleanup ...") - if err := w.tmp.Close(); err != nil { - return err +// newWriter parses the requested target URI, finds a handler and then tries to create a session. +// Target URI format: +// [scheme]://[host]/[path]?[args] +// +// Target URI parts: +// scheme - service handler, one of: "s3", "gs", "az", "http", "file" +// host - remote address. ex: "dgraph.s3.amazonaws.com" +// path - directory, bucket or container at target. ex: "/dgraph/backups/" +// args - specific arguments that are ok to appear in logs. +// +// Examples: +// s3://dgraph.s3.amazonaws.com/dgraph/backups?useSSL=1 +// gs://dgraph/backups/ +// as://dgraph-container/backups/ +// http://backups.dgraph.io/upload +// file:///tmp/dgraph/backups or /tmp/dgraph/backups +func newWriter(r *Request) (*writer, error) { + u, err := url.Parse(r.TargetURI) + if err != nil { + return nil, err } - return nil -} - -func newWriter(worker *Worker) (*writer, error) { - var w writer - var err error - - // dst is the final destination for data. - w.dst, err = getSchemeHandler(worker.TargetURI) + // find handler for this URI scheme + h, err := getHandler(u.Scheme) if err != nil { return nil, err } + f := fmt.Sprintf("%s-g%d-r%d%s", r.UnixTs, r.GroupId, r.ReadTs, dgraphBackupSuffix) + glog.V(3).Infof("target file: %q", f) - // tmp file is our main working file. - // we will prepare this file and then copy to dst when done. - w.tmp, err = ioutil.TempFile("", dgraphBackupTempPrefix) - if err != nil { - glog.Errorf("Failed to create temp file: %s\n", err) + // create session at + sess := &session{host: u.Host, path: u.Path, file: f, args: u.Query()} + if err := h.Open(sess); err != nil { return nil, err } - glog.V(3).Infof("temp file: %q", w.tmp.Name()) - w.file = fmt.Sprintf("%s-g%d-r%d%s", - worker.SeqTs, worker.GroupId, worker.ReadTs, dgraphBackupSuffix) - glog.V(3).Infof("target file name: %q", w.file) + return &writer{h: h, file: f}, nil +} + +func (w *writer) close() error { + return w.h.Close() +} - return &w, err +// write uses the data length as delimiter. +// XXX: we could use CRC for restore. +func (w *writer) write(kv *pb.KV) error { + if err := binary.Write(w.h, binary.LittleEndian, uint64(kv.Size())); err != nil { + return err + } + b, err := kv.Marshal() + if err != nil { + return err + } + _, err = w.h.Write(b) + return err } // Send implements the stream.kvStream interface. -// It writes the received KV into the temp file as a delimited binary chain. +// It writes the received KV the target as a delimited binary chain. // Returns error if the writing fails, nil on success. func (w *writer) Send(kvs *pb.KVS) error { var err error for _, kv := range kvs.Kv { - _, err = pbutil.WriteDelimited(w.tmp, kv) + err = w.write(kv) if err != nil { return err } diff --git a/protos/pb.proto b/protos/pb.proto index 753e2db61fe..5d464c6d0d8 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -420,7 +420,7 @@ service Worker { rpc Sort (SortMessage) returns (SortResult) {} rpc Schema (SchemaRequest) returns (SchemaResult) {} rpc PurgeTs (api.Payload) returns (Num) {} - rpc Backup (BackupRequest) returns (BackupResponse) {} + rpc Backup (BackupRequest) returns (Status) {} rpc Export (ExportPayload) returns (ExportPayload) {} rpc ReceivePredicate(stream KVS) returns (api.Payload) {} rpc MovePredicate(MovePredicatePayload) returns (api.Payload) {} @@ -444,21 +444,17 @@ message SnapshotMeta { uint32 group_id = 2; } +// Status describes a general status response. +// code: 0 = success, -1 = unknown failure +message Status { + int32 code = 1; + string msg = 2; +} + message BackupRequest { uint64 read_ts = 1; uint32 group_id = 2; string target = 3; } -message BackupResponse { - string message = 1; - enum Status { - NONE = 0; - SUCCESS = 1; - DUPLICATE = 2; - FAILED = 3; - } - Status status = 2; -} - // vim: noexpandtab sw=2 ts=2 diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 738d1d76aea..96cd6951c11 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{17, 0} + return fileDescriptor_pb_038c2d1314fe6088, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{24, 0} + return fileDescriptor_pb_038c2d1314fe6088, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{24, 1} + return fileDescriptor_pb_038c2d1314fe6088, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{34, 0} + return fileDescriptor_pb_038c2d1314fe6088, []int{34, 0} } type ExportPayload_Status int32 @@ -179,36 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{37, 0} -} - -type BackupResponse_Status int32 - -const ( - BackupResponse_NONE BackupResponse_Status = 0 - BackupResponse_SUCCESS BackupResponse_Status = 1 - BackupResponse_DUPLICATE BackupResponse_Status = 2 - BackupResponse_FAILED BackupResponse_Status = 3 -) - -var BackupResponse_Status_name = map[int32]string{ - 0: "NONE", - 1: "SUCCESS", - 2: "DUPLICATE", - 3: "FAILED", -} -var BackupResponse_Status_value = map[string]int32{ - "NONE": 0, - "SUCCESS": 1, - "DUPLICATE": 2, - "FAILED": 3, -} - -func (x BackupResponse_Status) String() string { - return proto.EnumName(BackupResponse_Status_name, int32(x)) -} -func (BackupResponse_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{47, 0} + return fileDescriptor_pb_038c2d1314fe6088, []int{37, 0} } type List struct { @@ -222,7 +193,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{0} + return fileDescriptor_pb_038c2d1314fe6088, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +241,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{1} + return fileDescriptor_pb_038c2d1314fe6088, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +297,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{2} + return fileDescriptor_pb_038c2d1314fe6088, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -399,7 +370,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{3} + return fileDescriptor_pb_038c2d1314fe6088, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -516,7 +487,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{4} + return fileDescriptor_pb_038c2d1314fe6088, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -563,7 +534,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{5} + return fileDescriptor_pb_038c2d1314fe6088, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -616,7 +587,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{6} + return fileDescriptor_pb_038c2d1314fe6088, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -707,7 +678,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{7} + return fileDescriptor_pb_038c2d1314fe6088, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -772,7 +743,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{8} + return fileDescriptor_pb_038c2d1314fe6088, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -847,7 +818,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{9} + return fileDescriptor_pb_038c2d1314fe6088, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -897,7 +868,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{10} + return fileDescriptor_pb_038c2d1314fe6088, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -974,7 +945,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{11} + return fileDescriptor_pb_038c2d1314fe6088, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1064,7 +1035,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{12} + return fileDescriptor_pb_038c2d1314fe6088, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1125,7 +1096,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{13} + return fileDescriptor_pb_038c2d1314fe6088, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1231,7 +1202,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{14} + return fileDescriptor_pb_038c2d1314fe6088, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1329,7 +1300,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{15} + return fileDescriptor_pb_038c2d1314fe6088, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1395,7 +1366,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{16} + return fileDescriptor_pb_038c2d1314fe6088, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1485,7 +1456,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{17} + return fileDescriptor_pb_038c2d1314fe6088, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1593,7 +1564,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{18} + return fileDescriptor_pb_038c2d1314fe6088, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1675,7 +1646,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{19} + return fileDescriptor_pb_038c2d1314fe6088, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1726,7 +1697,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{20} + return fileDescriptor_pb_038c2d1314fe6088, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1800,7 +1771,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{21} + return fileDescriptor_pb_038c2d1314fe6088, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1891,7 +1862,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{22} + return fileDescriptor_pb_038c2d1314fe6088, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1948,7 +1919,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{23} + return fileDescriptor_pb_038c2d1314fe6088, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2027,7 +1998,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{24} + return fileDescriptor_pb_038c2d1314fe6088, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2140,7 +2111,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{25} + return fileDescriptor_pb_038c2d1314fe6088, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2209,7 +2180,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{26} + return fileDescriptor_pb_038c2d1314fe6088, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2264,7 +2235,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{27} + return fileDescriptor_pb_038c2d1314fe6088, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2318,7 +2289,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{28} + return fileDescriptor_pb_038c2d1314fe6088, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2365,7 +2336,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{29} + return fileDescriptor_pb_038c2d1314fe6088, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2414,7 +2385,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{30} + return fileDescriptor_pb_038c2d1314fe6088, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2478,7 +2449,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{31} + return fileDescriptor_pb_038c2d1314fe6088, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2543,7 +2514,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{32} + return fileDescriptor_pb_038c2d1314fe6088, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2604,7 +2575,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{33} + return fileDescriptor_pb_038c2d1314fe6088, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2658,7 +2629,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{34} + return fileDescriptor_pb_038c2d1314fe6088, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2758,7 +2729,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{35} + return fileDescriptor_pb_038c2d1314fe6088, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2822,7 +2793,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{36} + return fileDescriptor_pb_038c2d1314fe6088, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2896,7 +2867,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{37} + return fileDescriptor_pb_038c2d1314fe6088, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2965,7 +2936,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{38} + return fileDescriptor_pb_038c2d1314fe6088, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3020,7 +2991,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{39} + return fileDescriptor_pb_038c2d1314fe6088, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3074,7 +3045,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{40} + return fileDescriptor_pb_038c2d1314fe6088, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3121,7 +3092,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{41} + return fileDescriptor_pb_038c2d1314fe6088, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3169,7 +3140,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{42} + return fileDescriptor_pb_038c2d1314fe6088, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3224,7 +3195,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{43} + return fileDescriptor_pb_038c2d1314fe6088, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3281,7 +3252,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{44} + return fileDescriptor_pb_038c2d1314fe6088, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3343,7 +3314,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{45} + return fileDescriptor_pb_038c2d1314fe6088, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3386,27 +3357,28 @@ func (m *SnapshotMeta) GetGroupId() uint32 { return 0 } -type BackupRequest struct { - ReadTs uint64 `protobuf:"varint,1,opt,name=read_ts,json=readTs,proto3" json:"read_ts,omitempty"` - GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` +// Status describes a general status response. +// code: 0 = success, -1 = unknown failure +type Status struct { + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *BackupRequest) Reset() { *m = BackupRequest{} } -func (m *BackupRequest) String() string { return proto.CompactTextString(m) } -func (*BackupRequest) ProtoMessage() {} -func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{46} +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_038c2d1314fe6088, []int{46} } -func (m *BackupRequest) XXX_Unmarshal(b []byte) error { +func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *BackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_BackupRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Status.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3416,59 +3388,53 @@ func (m *BackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (dst *BackupRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_BackupRequest.Merge(dst, src) +func (dst *Status) XXX_Merge(src proto.Message) { + xxx_messageInfo_Status.Merge(dst, src) } -func (m *BackupRequest) XXX_Size() int { +func (m *Status) XXX_Size() int { return m.Size() } -func (m *BackupRequest) XXX_DiscardUnknown() { - xxx_messageInfo_BackupRequest.DiscardUnknown(m) +func (m *Status) XXX_DiscardUnknown() { + xxx_messageInfo_Status.DiscardUnknown(m) } -var xxx_messageInfo_BackupRequest proto.InternalMessageInfo - -func (m *BackupRequest) GetReadTs() uint64 { - if m != nil { - return m.ReadTs - } - return 0 -} +var xxx_messageInfo_Status proto.InternalMessageInfo -func (m *BackupRequest) GetGroupId() uint32 { +func (m *Status) GetCode() int32 { if m != nil { - return m.GroupId + return m.Code } return 0 } -func (m *BackupRequest) GetTarget() string { +func (m *Status) GetMsg() string { if m != nil { - return m.Target + return m.Msg } return "" } -type BackupResponse struct { - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Status BackupResponse_Status `protobuf:"varint,2,opt,name=status,proto3,enum=pb.BackupResponse_Status" json:"status,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type BackupRequest struct { + ReadTs uint64 `protobuf:"varint,1,opt,name=read_ts,json=readTs,proto3" json:"read_ts,omitempty"` + GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *BackupResponse) Reset() { *m = BackupResponse{} } -func (m *BackupResponse) String() string { return proto.CompactTextString(m) } -func (*BackupResponse) ProtoMessage() {} -func (*BackupResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_b53a45b47504f851, []int{47} +func (m *BackupRequest) Reset() { *m = BackupRequest{} } +func (m *BackupRequest) String() string { return proto.CompactTextString(m) } +func (*BackupRequest) ProtoMessage() {} +func (*BackupRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_pb_038c2d1314fe6088, []int{47} } -func (m *BackupResponse) XXX_Unmarshal(b []byte) error { +func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *BackupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *BackupRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_BackupResponse.Marshal(b, m, deterministic) + return xxx_messageInfo_BackupRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3478,30 +3444,37 @@ func (m *BackupResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (dst *BackupResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_BackupResponse.Merge(dst, src) +func (dst *BackupRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupRequest.Merge(dst, src) } -func (m *BackupResponse) XXX_Size() int { +func (m *BackupRequest) XXX_Size() int { return m.Size() } -func (m *BackupResponse) XXX_DiscardUnknown() { - xxx_messageInfo_BackupResponse.DiscardUnknown(m) +func (m *BackupRequest) XXX_DiscardUnknown() { + xxx_messageInfo_BackupRequest.DiscardUnknown(m) } -var xxx_messageInfo_BackupResponse proto.InternalMessageInfo +var xxx_messageInfo_BackupRequest proto.InternalMessageInfo + +func (m *BackupRequest) GetReadTs() uint64 { + if m != nil { + return m.ReadTs + } + return 0 +} -func (m *BackupResponse) GetMessage() string { +func (m *BackupRequest) GetGroupId() uint32 { if m != nil { - return m.Message + return m.GroupId } - return "" + return 0 } -func (m *BackupResponse) GetStatus() BackupResponse_Status { +func (m *BackupRequest) GetTarget() string { if m != nil { - return m.Status + return m.Target } - return BackupResponse_NONE + return "" } func init() { @@ -3555,14 +3528,13 @@ func init() { proto.RegisterType((*Num)(nil), "pb.Num") proto.RegisterType((*AssignedIds)(nil), "pb.AssignedIds") proto.RegisterType((*SnapshotMeta)(nil), "pb.SnapshotMeta") + proto.RegisterType((*Status)(nil), "pb.Status") proto.RegisterType((*BackupRequest)(nil), "pb.BackupRequest") - proto.RegisterType((*BackupResponse)(nil), "pb.BackupResponse") proto.RegisterEnum("pb.DirectedEdge_Op", DirectedEdge_Op_name, DirectedEdge_Op_value) proto.RegisterEnum("pb.Posting_ValType", Posting_ValType_name, Posting_ValType_value) proto.RegisterEnum("pb.Posting_PostingType", Posting_PostingType_name, Posting_PostingType_value) proto.RegisterEnum("pb.SchemaUpdate_Directive", SchemaUpdate_Directive_name, SchemaUpdate_Directive_value) proto.RegisterEnum("pb.ExportPayload_Status", ExportPayload_Status_name, ExportPayload_Status_value) - proto.RegisterEnum("pb.BackupResponse_Status", BackupResponse_Status_name, BackupResponse_Status_value) } // Reference imports to suppress errors if they are not otherwise used. @@ -4102,7 +4074,7 @@ type WorkerClient interface { Sort(ctx context.Context, in *SortMessage, opts ...grpc.CallOption) (*SortResult, error) Schema(ctx context.Context, in *SchemaRequest, opts ...grpc.CallOption) (*SchemaResult, error) PurgeTs(ctx context.Context, in *api.Payload, opts ...grpc.CallOption) (*Num, error) - Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*BackupResponse, error) + Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*Status, error) Export(ctx context.Context, in *ExportPayload, opts ...grpc.CallOption) (*ExportPayload, error) ReceivePredicate(ctx context.Context, opts ...grpc.CallOption) (Worker_ReceivePredicateClient, error) MovePredicate(ctx context.Context, in *MovePredicatePayload, opts ...grpc.CallOption) (*api.Payload, error) @@ -4192,8 +4164,8 @@ func (c *workerClient) PurgeTs(ctx context.Context, in *api.Payload, opts ...grp return out, nil } -func (c *workerClient) Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*BackupResponse, error) { - out := new(BackupResponse) +func (c *workerClient) Backup(ctx context.Context, in *BackupRequest, opts ...grpc.CallOption) (*Status, error) { + out := new(Status) err := c.cc.Invoke(ctx, "/pb.Worker/Backup", in, out, opts...) if err != nil { return nil, err @@ -4262,7 +4234,7 @@ type WorkerServer interface { Sort(context.Context, *SortMessage) (*SortResult, error) Schema(context.Context, *SchemaRequest) (*SchemaResult, error) PurgeTs(context.Context, *api.Payload) (*Num, error) - Backup(context.Context, *BackupRequest) (*BackupResponse, error) + Backup(context.Context, *BackupRequest) (*Status, error) Export(context.Context, *ExportPayload) (*ExportPayload, error) ReceivePredicate(Worker_ReceivePredicateServer) error MovePredicate(context.Context, *MovePredicatePayload) (*api.Payload, error) @@ -6949,7 +6921,7 @@ func (m *SnapshotMeta) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *BackupRequest) Marshal() (dAtA []byte, err error) { +func (m *Status) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6959,26 +6931,21 @@ func (m *BackupRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Status) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l - if m.ReadTs != 0 { + if m.Code != 0 { dAtA[i] = 0x8 i++ - i = encodeVarintPb(dAtA, i, uint64(m.ReadTs)) + i = encodeVarintPb(dAtA, i, uint64(m.Code)) } - if m.GroupId != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) - } - if len(m.Target) > 0 { - dAtA[i] = 0x1a + if len(m.Msg) > 0 { + dAtA[i] = 0x12 i++ - i = encodeVarintPb(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i = encodeVarintPb(dAtA, i, uint64(len(m.Msg))) + i += copy(dAtA[i:], m.Msg) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6986,7 +6953,7 @@ func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *BackupResponse) Marshal() (dAtA []byte, err error) { +func (m *BackupRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6996,21 +6963,26 @@ func (m *BackupResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *BackupResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l - if len(m.Message) > 0 { - dAtA[i] = 0xa + if m.ReadTs != 0 { + dAtA[i] = 0x8 i++ - i = encodeVarintPb(dAtA, i, uint64(len(m.Message))) - i += copy(dAtA[i:], m.Message) + i = encodeVarintPb(dAtA, i, uint64(m.ReadTs)) } - if m.Status != 0 { + if m.GroupId != 0 { dAtA[i] = 0x10 i++ - i = encodeVarintPb(dAtA, i, uint64(m.Status)) + i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) + } + if len(m.Target) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -8281,19 +8253,16 @@ func (m *SnapshotMeta) Size() (n int) { return n } -func (m *BackupRequest) Size() (n int) { +func (m *Status) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.ReadTs != 0 { - n += 1 + sovPb(uint64(m.ReadTs)) - } - if m.GroupId != 0 { - n += 1 + sovPb(uint64(m.GroupId)) + if m.Code != 0 { + n += 1 + sovPb(uint64(m.Code)) } - l = len(m.Target) + l = len(m.Msg) if l > 0 { n += 1 + l + sovPb(uint64(l)) } @@ -8303,19 +8272,22 @@ func (m *BackupRequest) Size() (n int) { return n } -func (m *BackupResponse) Size() (n int) { +func (m *BackupRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Message) + if m.ReadTs != 0 { + n += 1 + sovPb(uint64(m.ReadTs)) + } + if m.GroupId != 0 { + n += 1 + sovPb(uint64(m.GroupId)) + } + l = len(m.Target) if l > 0 { n += 1 + l + sovPb(uint64(l)) } - if m.Status != 0 { - n += 1 + sovPb(uint64(m.Status)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15355,7 +15327,7 @@ func (m *SnapshotMeta) Unmarshal(dAtA []byte) error { } return nil } -func (m *BackupRequest) Unmarshal(dAtA []byte) error { +func (m *Status) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15378,17 +15350,17 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: BackupRequest: wiretype end group for non-group") + return fmt.Errorf("proto: Status: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: BackupRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Status: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReadTs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) } - m.ReadTs = 0 + m.Code = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowPb @@ -15398,33 +15370,14 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ReadTs |= (uint64(b) & 0x7F) << shift + m.Code |= (int32(b) & 0x7F) << shift if b < 0x80 { break } } case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field GroupId", wireType) - } - m.GroupId = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowPb - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.GroupId |= (uint32(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -15449,7 +15402,7 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Target = string(dAtA[iNdEx:postIndex]) + m.Msg = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -15473,7 +15426,7 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *BackupResponse) Unmarshal(dAtA []byte) error { +func (m *BackupRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -15496,17 +15449,17 @@ func (m *BackupResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: BackupResponse: wiretype end group for non-group") + return fmt.Errorf("proto: BackupRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: BackupResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: BackupRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadTs", wireType) } - var stringLen uint64 + m.ReadTs = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowPb @@ -15516,26 +15469,35 @@ func (m *BackupResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + m.ReadTs |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthPb - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GroupId", wireType) } - m.Status = 0 + m.GroupId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GroupId |= (uint32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) + } + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowPb @@ -15545,11 +15507,21 @@ func (m *BackupResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Status |= (BackupResponse_Status(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Target = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipPb(dAtA[iNdEx:]) @@ -15677,205 +15649,204 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_b53a45b47504f851) } - -var fileDescriptor_pb_b53a45b47504f851 = []byte{ - // 3143 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0x4d, 0x73, 0xe3, 0x46, - 0x76, 0x02, 0x48, 0x82, 0xc0, 0x23, 0xa9, 0xa1, 0xdb, 0x93, 0x31, 0x87, 0x76, 0x34, 0x32, 0x3c, - 0x1f, 0xf2, 0xd8, 0x56, 0x66, 0x64, 0xa7, 0xfc, 0x71, 0xd3, 0x88, 0xd4, 0x14, 0x3d, 0xfa, 0x4a, - 0x93, 0x1a, 0x27, 0x4e, 0x95, 0x59, 0x10, 0xd1, 0xa2, 0x10, 0x81, 0x00, 0x82, 0x06, 0x54, 0x94, - 0x0f, 0xa9, 0xca, 0x25, 0xbf, 0xc1, 0xb9, 0xe4, 0x90, 0x63, 0xf2, 0x07, 0x92, 0x1f, 0x90, 0xaa, - 0xd4, 0x9e, 0xf6, 0xb8, 0x7b, 0xdb, 0x9a, 0x3d, 0xed, 0x79, 0x6b, 0x6b, 0x0f, 0x7b, 0xd9, 0xea, - 0xd7, 0x8d, 0x0f, 0x72, 0x24, 0x8d, 0xbd, 0x5b, 0x7b, 0x22, 0x5e, 0xbf, 0xf7, 0xfa, 0xe3, 0x7d, - 0xbf, 0x47, 0x30, 0xa3, 0x93, 0xcd, 0x28, 0x0e, 0x93, 0x90, 0xe8, 0xd1, 0x49, 0xd7, 0x72, 0x22, - 0x4f, 0x82, 0x76, 0x17, 0xaa, 0x7b, 0x1e, 0x4f, 0x08, 0x81, 0x6a, 0xea, 0xb9, 0xbc, 0xa3, 0xad, - 0x57, 0x36, 0x0c, 0x8a, 0xdf, 0xf6, 0x3e, 0x58, 0x23, 0x87, 0x9f, 0xbf, 0x74, 0xfc, 0x94, 0x91, - 0x36, 0x54, 0x2e, 0x1c, 0xbf, 0xa3, 0xad, 0x6b, 0x1b, 0x4d, 0x2a, 0x3e, 0xc9, 0x26, 0x98, 0x17, - 0x8e, 0x3f, 0x4e, 0x2e, 0x23, 0xd6, 0xd1, 0xd7, 0xb5, 0x8d, 0xd5, 0xad, 0xb7, 0x37, 0xa3, 0x93, - 0xcd, 0xa3, 0x90, 0x27, 0x5e, 0x30, 0xdd, 0x7c, 0xe9, 0xf8, 0xa3, 0xcb, 0x88, 0xd1, 0xfa, 0x85, - 0xfc, 0xb0, 0x0f, 0xa1, 0x31, 0x8c, 0x27, 0xbb, 0x69, 0x30, 0x49, 0xbc, 0x30, 0x10, 0x27, 0x06, - 0xce, 0x8c, 0xe1, 0x8e, 0x16, 0xc5, 0x6f, 0xb1, 0xe6, 0xc4, 0x53, 0xde, 0xa9, 0xac, 0x57, 0xc4, - 0x9a, 0xf8, 0x26, 0x1d, 0xa8, 0x7b, 0x7c, 0x27, 0x4c, 0x83, 0xa4, 0x53, 0x5d, 0xd7, 0x36, 0x4c, - 0x9a, 0x81, 0xf6, 0x6f, 0x75, 0xa8, 0xfd, 0x5d, 0xca, 0xe2, 0x4b, 0xe4, 0x4b, 0x92, 0x38, 0xdb, - 0x4b, 0x7c, 0x93, 0xdb, 0x50, 0xf3, 0x9d, 0x60, 0xca, 0x3b, 0x3a, 0x6e, 0x26, 0x01, 0xf2, 0x2e, - 0x58, 0xce, 0x69, 0xc2, 0xe2, 0x71, 0xea, 0xb9, 0x9d, 0xca, 0xba, 0xb6, 0x61, 0x50, 0x13, 0x17, - 0x8e, 0x3d, 0x97, 0xdc, 0x05, 0xd3, 0x0d, 0xc7, 0x93, 0xf2, 0x59, 0x6e, 0x88, 0x67, 0x91, 0x0f, - 0xc0, 0x4c, 0x3d, 0x77, 0xec, 0x7b, 0x3c, 0xe9, 0xd4, 0xd6, 0xb5, 0x8d, 0xc6, 0x96, 0x29, 0x1e, - 0x2b, 0x64, 0x47, 0xeb, 0xa9, 0xe7, 0xa2, 0x10, 0x1f, 0x83, 0xc9, 0xe3, 0xc9, 0xf8, 0x34, 0x0d, - 0x26, 0x1d, 0x03, 0x89, 0x6e, 0x09, 0xa2, 0xd2, 0xab, 0x69, 0x9d, 0x4b, 0x40, 0x3c, 0x2b, 0x66, - 0x17, 0x2c, 0xe6, 0xac, 0x53, 0x97, 0x47, 0x29, 0x90, 0x3c, 0x81, 0xc6, 0xa9, 0x33, 0x61, 0xc9, - 0x38, 0x72, 0x62, 0x67, 0xd6, 0x31, 0x8b, 0x8d, 0x76, 0xc5, 0xf2, 0x91, 0x58, 0xe5, 0x14, 0x4e, - 0x73, 0x80, 0x7c, 0x0a, 0x2d, 0x84, 0xf8, 0xf8, 0xd4, 0xf3, 0x13, 0x16, 0x77, 0x2c, 0xe4, 0x59, - 0x45, 0x1e, 0x5c, 0x19, 0xc5, 0x8c, 0xd1, 0xa6, 0x24, 0x92, 0x2b, 0xe4, 0xaf, 0x01, 0xd8, 0x3c, - 0x72, 0x02, 0x77, 0xec, 0xf8, 0x7e, 0x07, 0xf0, 0x0e, 0x96, 0x5c, 0xd9, 0xf6, 0x7d, 0xf2, 0x8e, - 0xb8, 0x9f, 0xe3, 0x8e, 0x13, 0xde, 0x69, 0xad, 0x6b, 0x1b, 0x55, 0x6a, 0x08, 0x70, 0xc4, 0xed, - 0x2d, 0xb0, 0xd0, 0x22, 0xf0, 0xc5, 0x0f, 0xc0, 0xb8, 0x10, 0x80, 0x34, 0x9c, 0xc6, 0x56, 0x4b, - 0x1c, 0x99, 0x1b, 0x0d, 0x55, 0x48, 0x7b, 0x0d, 0xcc, 0x3d, 0x27, 0x98, 0x66, 0x96, 0x26, 0x54, - 0x81, 0x0c, 0x16, 0xc5, 0x6f, 0xfb, 0x07, 0x1d, 0x0c, 0xca, 0x78, 0xea, 0x27, 0xe4, 0x11, 0x80, - 0x10, 0xf4, 0xcc, 0x49, 0x62, 0x6f, 0xae, 0x76, 0x2d, 0x44, 0x6d, 0xa5, 0x9e, 0xbb, 0x8f, 0x28, - 0xf2, 0x04, 0x9a, 0xb8, 0x7b, 0x46, 0xaa, 0x17, 0x17, 0xc8, 0xef, 0x47, 0x1b, 0x48, 0xa2, 0x38, - 0xee, 0x80, 0x81, 0xba, 0x95, 0xf6, 0xd5, 0xa2, 0x0a, 0x22, 0x0f, 0x60, 0xd5, 0x0b, 0x12, 0x21, - 0xfb, 0x49, 0x32, 0x76, 0x19, 0xcf, 0x94, 0xdf, 0xca, 0x57, 0x7b, 0x8c, 0x27, 0xe4, 0x29, 0x48, - 0x01, 0x66, 0x07, 0xd6, 0xf0, 0xc0, 0xd5, 0x5c, 0x31, 0x5c, 0x9e, 0x88, 0x34, 0xea, 0xc4, 0x4f, - 0xa0, 0x21, 0xde, 0x97, 0x71, 0x18, 0xc8, 0xd1, 0xc4, 0xd7, 0x28, 0x71, 0x50, 0x10, 0x04, 0x8a, - 0x5c, 0x88, 0x46, 0x18, 0x98, 0x34, 0x08, 0xfc, 0xb6, 0xfb, 0x50, 0x3b, 0x8c, 0x5d, 0x16, 0x5f, - 0x69, 0xe3, 0x04, 0xaa, 0x2e, 0xe3, 0x13, 0x74, 0x3f, 0x93, 0xe2, 0x77, 0x61, 0xf7, 0x95, 0x92, - 0xdd, 0xdb, 0xff, 0xa1, 0x41, 0x63, 0x18, 0xc6, 0xc9, 0x3e, 0xe3, 0xdc, 0x99, 0x32, 0x72, 0x0f, - 0x6a, 0xa1, 0xd8, 0x56, 0x49, 0xd8, 0x12, 0x77, 0xc2, 0x73, 0xa8, 0x5c, 0x5f, 0xd2, 0x83, 0x7e, - 0xbd, 0x1e, 0x6e, 0x43, 0x4d, 0x7a, 0x8c, 0xf0, 0xa6, 0x1a, 0x95, 0x80, 0x90, 0x75, 0x78, 0x7a, - 0xca, 0x99, 0x94, 0x65, 0x8d, 0x2a, 0xe8, 0x7a, 0xb3, 0xfa, 0x5b, 0x00, 0x71, 0xbf, 0x9f, 0x68, - 0x05, 0xf6, 0x19, 0x34, 0xa8, 0x73, 0x9a, 0xec, 0x84, 0x41, 0xc2, 0xe6, 0x09, 0x59, 0x05, 0xdd, - 0x73, 0x51, 0x44, 0x06, 0xd5, 0x3d, 0x57, 0x5c, 0x6e, 0x1a, 0x87, 0x69, 0x84, 0x12, 0x6a, 0x51, - 0x09, 0xa0, 0x28, 0x5d, 0x37, 0xc6, 0x1b, 0x0b, 0x51, 0xba, 0x6e, 0x4c, 0xee, 0x41, 0x83, 0x07, - 0x4e, 0xc4, 0xcf, 0xc2, 0x44, 0x5c, 0xae, 0x8a, 0x97, 0x83, 0x6c, 0x69, 0xc4, 0xed, 0xff, 0xd3, - 0xc0, 0xd8, 0x67, 0xb3, 0x13, 0x16, 0xbf, 0x76, 0xca, 0x5d, 0x30, 0x71, 0xe3, 0xb1, 0xe7, 0xaa, - 0x83, 0xea, 0x08, 0x0f, 0xdc, 0x2b, 0x8f, 0xba, 0x03, 0x86, 0xcf, 0x1c, 0x21, 0x7c, 0x69, 0x67, - 0x0a, 0x12, 0xb2, 0x71, 0x66, 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xac, 0xc7, - 0x1c, 0x57, 0xdc, 0xcd, 0x77, 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x30, - 0x1c, 0x9e, 0x1c, 0xe3, 0x0a, 0x79, 0x0c, 0x6f, 0x4d, 0xfc, 0x94, 0x8b, 0xb8, 0xe6, 0x05, 0xa7, - 0xe1, 0x38, 0x0c, 0xfc, 0x4b, 0x94, 0xaf, 0x49, 0x6f, 0x29, 0xc4, 0x20, 0x38, 0x0d, 0x0f, 0x03, - 0xff, 0xd2, 0xfe, 0x83, 0x06, 0xb5, 0xe7, 0x28, 0x86, 0x27, 0x50, 0x9f, 0xe1, 0x83, 0x32, 0xef, - 0xbd, 0x23, 0x24, 0x8c, 0xb8, 0x4d, 0xf9, 0x52, 0xde, 0x0f, 0x92, 0xf8, 0x92, 0x66, 0x64, 0x82, - 0x23, 0x71, 0x4e, 0x7c, 0x96, 0x70, 0x65, 0x11, 0x25, 0x8e, 0x91, 0x44, 0x28, 0x0e, 0x45, 0xd6, - 0xdd, 0x85, 0x66, 0x79, 0x2b, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xca, 0xae, 0x4a, 0xc5, 0x27, 0x59, - 0x87, 0x1a, 0x3a, 0x29, 0x4a, 0xae, 0xb1, 0x05, 0x62, 0x47, 0xc9, 0x42, 0x25, 0xe2, 0x2b, 0xfd, - 0x0b, 0x4d, 0xec, 0x53, 0x3e, 0xa0, 0xbc, 0x8f, 0x75, 0xfd, 0x3e, 0x92, 0xa5, 0xb4, 0x8f, 0xfd, - 0x7b, 0x0d, 0x9a, 0xdf, 0xb2, 0x38, 0x3c, 0x8a, 0xc3, 0x28, 0xe4, 0x8e, 0x4f, 0x6c, 0x30, 0xe4, - 0xeb, 0xae, 0x38, 0x5f, 0x61, 0x04, 0x8d, 0x7c, 0x0f, 0xaa, 0x71, 0x71, 0x6f, 0x85, 0x21, 0x6b, - 0x00, 0x33, 0x67, 0xbe, 0xc7, 0x1c, 0xce, 0x06, 0x6e, 0x66, 0x3e, 0xc5, 0x0a, 0xe9, 0x82, 0x39, - 0x73, 0xe6, 0xa3, 0x79, 0x30, 0xe2, 0xa8, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x1e, 0x58, 0x33, 0x67, - 0x2e, 0xec, 0x78, 0xe0, 0x2a, 0xed, 0x16, 0x0b, 0xe4, 0x7d, 0xa8, 0x24, 0xf3, 0x00, 0x83, 0x82, - 0xc8, 0x03, 0x22, 0x77, 0x8f, 0xe6, 0x81, 0xb2, 0x78, 0x2a, 0x70, 0x99, 0x34, 0xcc, 0x42, 0x1a, - 0x6d, 0xa8, 0x4c, 0x3c, 0x17, 0x13, 0x81, 0x45, 0xc5, 0xa7, 0xfd, 0x3f, 0x15, 0xb8, 0xa5, 0x54, - 0x71, 0xe6, 0x45, 0xc3, 0x44, 0xd8, 0x4d, 0x07, 0xea, 0xe8, 0xae, 0x2c, 0x56, 0x1a, 0xc9, 0x40, - 0xf2, 0x39, 0x18, 0x68, 0xc2, 0x99, 0xa2, 0xef, 0x15, 0x62, 0xc9, 0xd9, 0xa5, 0xe2, 0x95, 0xc6, - 0x15, 0x39, 0xf9, 0x0c, 0x6a, 0xdf, 0xb3, 0x38, 0x94, 0xe1, 0xa7, 0xb1, 0xb5, 0x76, 0x15, 0x9f, - 0x50, 0x80, 0x62, 0x93, 0xc4, 0x7f, 0x41, 0xe9, 0xdd, 0x17, 0x01, 0x67, 0x16, 0x5e, 0x30, 0xb7, - 0x53, 0xc7, 0x1b, 0x95, 0x15, 0x9c, 0xa1, 0x32, 0x71, 0x99, 0xb9, 0xb8, 0xba, 0x3d, 0x68, 0x94, - 0x9e, 0x57, 0xb6, 0xb7, 0x96, 0x94, 0xf0, 0xbd, 0x45, 0x7b, 0xb3, 0x72, 0x4f, 0x28, 0x9b, 0x6d, - 0x0f, 0xa0, 0x78, 0xec, 0x9f, 0x6a, 0xfc, 0xf6, 0xbf, 0x6a, 0x70, 0x6b, 0x27, 0x0c, 0x02, 0x86, - 0x35, 0x84, 0x54, 0x5d, 0x61, 0xb7, 0xda, 0xb5, 0x76, 0xfb, 0x21, 0xd4, 0xb8, 0x20, 0x56, 0xbb, - 0xbf, 0x7d, 0x85, 0x2e, 0xa8, 0xa4, 0x10, 0x21, 0x66, 0xe6, 0xcc, 0xc7, 0x11, 0x0b, 0x5c, 0x2f, - 0x98, 0xa2, 0x9d, 0x4b, 0x0d, 0x1c, 0xc9, 0x15, 0xfb, 0x3f, 0x35, 0x30, 0xa4, 0xc9, 0x2f, 0x84, - 0x3b, 0x6d, 0x31, 0xdc, 0xbd, 0x07, 0x56, 0x14, 0x33, 0xd7, 0x9b, 0x64, 0xa7, 0x5a, 0xb4, 0x58, - 0x10, 0xd1, 0xf8, 0x34, 0x8c, 0x27, 0x0c, 0xb7, 0x37, 0xa9, 0x04, 0x44, 0x49, 0x86, 0x29, 0x01, - 0x83, 0x96, 0x8c, 0x88, 0xa6, 0x58, 0x10, 0xd1, 0x4a, 0xb0, 0xf0, 0xc8, 0x99, 0xc8, 0x22, 0xa9, - 0x42, 0x25, 0x20, 0x22, 0xa8, 0xd4, 0x1c, 0x6a, 0xcc, 0xa4, 0x0a, 0xb2, 0xff, 0x4b, 0x87, 0x66, - 0xcf, 0x8b, 0xd9, 0x24, 0x61, 0x6e, 0xdf, 0x9d, 0x22, 0x21, 0x0b, 0x12, 0x2f, 0xb9, 0x54, 0xd1, - 0x5a, 0x41, 0x79, 0x32, 0xd5, 0x17, 0x0b, 0x46, 0xa9, 0x8b, 0x0a, 0xd6, 0xb8, 0x12, 0x20, 0x5b, - 0x00, 0xb2, 0xcc, 0xc0, 0x3a, 0xb7, 0x7a, 0x7d, 0x9d, 0x6b, 0x21, 0x99, 0xf8, 0x14, 0x02, 0x92, - 0x3c, 0x9e, 0x8c, 0xe4, 0x06, 0x16, 0xc1, 0xa9, 0x30, 0x64, 0xcc, 0xce, 0x27, 0xcc, 0x47, 0x43, - 0xc5, 0xec, 0x7c, 0xc2, 0xfc, 0xbc, 0x26, 0xaa, 0xcb, 0xeb, 0x88, 0x6f, 0xf2, 0x01, 0xe8, 0x61, - 0x84, 0xef, 0x53, 0x07, 0x96, 0x1f, 0xb6, 0x79, 0x18, 0x51, 0x3d, 0x8c, 0x84, 0x15, 0xc8, 0xa2, - 0xae, 0x63, 0x29, 0xe3, 0x16, 0xe1, 0x01, 0xcb, 0x11, 0xaa, 0x30, 0xf6, 0x1d, 0xd0, 0x0f, 0x23, - 0x52, 0x87, 0xca, 0xb0, 0x3f, 0x6a, 0xaf, 0x88, 0x8f, 0x5e, 0x7f, 0xaf, 0xad, 0xd9, 0xaf, 0x34, - 0xb0, 0xf6, 0xd3, 0xc4, 0x11, 0x36, 0xc5, 0x6f, 0x52, 0xea, 0x5d, 0x30, 0x79, 0xe2, 0xc4, 0x98, - 0x17, 0x75, 0x19, 0x26, 0x10, 0x1e, 0x71, 0xf2, 0x10, 0x6a, 0xcc, 0x9d, 0xb2, 0xcc, 0xdb, 0xdb, - 0xcb, 0xf7, 0xa4, 0x12, 0x4d, 0x36, 0xc0, 0xe0, 0x93, 0x33, 0x36, 0x73, 0x3a, 0xd5, 0x82, 0x70, - 0x88, 0x2b, 0x32, 0x85, 0x51, 0x85, 0xc7, 0x1a, 0x3c, 0x0e, 0x23, 0x2c, 0x4a, 0x6b, 0xaa, 0x06, - 0x8f, 0xc3, 0x48, 0x94, 0xa4, 0x5b, 0xf0, 0x57, 0xde, 0x34, 0x08, 0x63, 0x36, 0xf6, 0x02, 0x97, - 0xcd, 0xc7, 0x93, 0x30, 0x38, 0xf5, 0xbd, 0x49, 0x82, 0xb2, 0x34, 0xe9, 0xdb, 0x12, 0x39, 0x10, - 0xb8, 0x1d, 0x85, 0xb2, 0x3f, 0x00, 0xeb, 0x05, 0xbb, 0xc4, 0x82, 0x90, 0x93, 0x3b, 0xa0, 0x9f, - 0x5f, 0xa8, 0x5c, 0x67, 0x88, 0x1b, 0xbc, 0x78, 0x49, 0xf5, 0xf3, 0x0b, 0x7b, 0x0e, 0xe6, 0x50, - 0x25, 0x7a, 0xf2, 0xa1, 0x08, 0x89, 0x18, 0x5a, 0x95, 0x63, 0x61, 0xe5, 0x5d, 0xaa, 0x31, 0x68, - 0x86, 0x17, 0xba, 0xc4, 0x8b, 0x28, 0xa1, 0x48, 0xa0, 0x5c, 0xe1, 0x54, 0xca, 0x15, 0x0e, 0x16, - 0x6b, 0x61, 0xc0, 0x94, 0x89, 0xe3, 0xb7, 0xfd, 0x6f, 0x3a, 0x98, 0x79, 0x2a, 0xfa, 0x08, 0xac, - 0x59, 0xa6, 0x0f, 0xe5, 0xb2, 0x58, 0xce, 0xe6, 0x4a, 0xa2, 0x05, 0x5e, 0xbd, 0xa5, 0xba, 0xfc, - 0x96, 0xc2, 0xe7, 0x6b, 0x6f, 0xf4, 0xf9, 0x47, 0x70, 0x6b, 0xe2, 0x33, 0x27, 0x18, 0x17, 0x2e, - 0x2b, 0xad, 0x72, 0x15, 0x97, 0x8f, 0x72, 0xbf, 0x55, 0x71, 0xab, 0x5e, 0xa4, 0x97, 0x07, 0x50, - 0x73, 0x99, 0x9f, 0x38, 0xe5, 0xee, 0xe4, 0x30, 0x76, 0x26, 0x3e, 0xeb, 0x89, 0x65, 0x2a, 0xb1, - 0x64, 0x03, 0xcc, 0xac, 0x82, 0x52, 0x3d, 0x09, 0x16, 0xbf, 0x99, 0xb0, 0x69, 0x8e, 0xb5, 0x9f, - 0x42, 0xe5, 0xc5, 0xcb, 0xe1, 0x75, 0x1a, 0xca, 0x65, 0xa7, 0x97, 0x64, 0xf7, 0x1d, 0xe8, 0x2f, - 0x5e, 0x96, 0x63, 0x6a, 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0x66, 0xca, - 0x59, 0xbc, 0xcf, 0x12, 0x47, 0x39, 0x77, 0x0e, 0x8b, 0x14, 0x28, 0xda, 0x2e, 0x2f, 0x0c, 0x54, - 0xda, 0xc9, 0x40, 0xfb, 0x37, 0x15, 0xa8, 0x2b, 0x27, 0x17, 0x7b, 0xa6, 0x79, 0xc9, 0x27, 0x3e, - 0x8b, 0x68, 0xa1, 0x97, 0xa3, 0x45, 0xb9, 0x27, 0xae, 0xbc, 0xb9, 0x27, 0x26, 0x5f, 0x41, 0x33, - 0x92, 0xb8, 0x72, 0x7c, 0x79, 0xa7, 0xcc, 0xa3, 0x7e, 0x91, 0xaf, 0x11, 0x15, 0x80, 0xf0, 0x14, - 0x6c, 0x2e, 0x12, 0x67, 0x8a, 0xca, 0x6e, 0xd2, 0xba, 0x80, 0x47, 0xce, 0xf4, 0x9a, 0x28, 0xf3, - 0x23, 0x82, 0x85, 0x28, 0x6d, 0xc3, 0xa8, 0xd3, 0xc4, 0x00, 0x20, 0x02, 0x4c, 0xd9, 0xf7, 0x5b, - 0x8b, 0xbe, 0xff, 0x2e, 0x58, 0x93, 0x70, 0x36, 0xf3, 0x10, 0xb7, 0x2a, 0x93, 0xb2, 0x5c, 0x18, - 0x71, 0xfb, 0x7b, 0xa8, 0xab, 0xc7, 0x92, 0x06, 0xd4, 0x7b, 0xfd, 0xdd, 0xed, 0xe3, 0x3d, 0x11, - 0x7d, 0x00, 0x8c, 0x67, 0x83, 0x83, 0x6d, 0xfa, 0x0f, 0x6d, 0x4d, 0x44, 0xa2, 0xc1, 0xc1, 0xa8, - 0xad, 0x13, 0x0b, 0x6a, 0xbb, 0x7b, 0x87, 0xdb, 0xa3, 0x76, 0x85, 0x98, 0x50, 0x7d, 0x76, 0x78, - 0xb8, 0xd7, 0xae, 0x92, 0x26, 0x98, 0xbd, 0xed, 0x51, 0x7f, 0x34, 0xd8, 0xef, 0xb7, 0x6b, 0x82, - 0xf6, 0x79, 0xff, 0xb0, 0x6d, 0x88, 0x8f, 0xe3, 0x41, 0xaf, 0x5d, 0x17, 0xf8, 0xa3, 0xed, 0xe1, - 0xf0, 0x9b, 0x43, 0xda, 0x6b, 0x9b, 0x62, 0xdf, 0xe1, 0x88, 0x0e, 0x0e, 0x9e, 0xb7, 0x2d, 0xfb, - 0x29, 0x34, 0x4a, 0x42, 0x13, 0x1c, 0xb4, 0xbf, 0xdb, 0x5e, 0x11, 0xc7, 0xbc, 0xdc, 0xde, 0x3b, - 0xee, 0xb7, 0x35, 0xb2, 0x0a, 0x80, 0x9f, 0xe3, 0xbd, 0xed, 0x83, 0xe7, 0x6d, 0xdd, 0xfe, 0x97, - 0x9c, 0x05, 0x7b, 0xd4, 0x47, 0x60, 0x2a, 0x49, 0x67, 0xa5, 0x71, 0xa3, 0xa4, 0x12, 0x9a, 0x23, - 0x85, 0x65, 0x4d, 0xce, 0xd8, 0xe4, 0x9c, 0xa7, 0x33, 0x65, 0x08, 0x39, 0x2c, 0xdb, 0x4d, 0x21, - 0x8e, 0x2c, 0x0e, 0x48, 0x28, 0x1f, 0xb5, 0x54, 0x91, 0x5e, 0x8e, 0x5a, 0x3e, 0x03, 0x28, 0x9a, - 0xfb, 0x2b, 0x8a, 0xdb, 0xdb, 0x50, 0x73, 0x7c, 0xcf, 0xe1, 0x2a, 0x61, 0x49, 0xc0, 0x3e, 0x80, - 0x46, 0x69, 0x24, 0x20, 0x74, 0xe5, 0xf8, 0xfe, 0xf8, 0x9c, 0x5d, 0x72, 0xe4, 0x35, 0x69, 0xdd, - 0xf1, 0xfd, 0x17, 0xec, 0x92, 0x93, 0xfb, 0x50, 0x93, 0xd3, 0x04, 0x7d, 0xa9, 0x69, 0x45, 0x56, - 0x2a, 0x91, 0xf6, 0xc7, 0x60, 0xc8, 0x4e, 0xb6, 0x64, 0x2a, 0xda, 0xb5, 0x79, 0xe5, 0x4b, 0x75, - 0x67, 0xec, 0x7b, 0xc9, 0x47, 0x6a, 0x6a, 0xc1, 0xe5, 0x8c, 0x44, 0x2b, 0x6a, 0x2d, 0x49, 0xa4, - 0x06, 0x16, 0x48, 0x6c, 0xf7, 0xc0, 0xbc, 0x71, 0x0e, 0xa4, 0x04, 0xa0, 0x17, 0x02, 0xb8, 0x62, - 0x32, 0x64, 0xff, 0x13, 0x40, 0x31, 0xdd, 0x50, 0x96, 0x2b, 0x77, 0x11, 0x96, 0xfb, 0x58, 0xa8, - 0xc6, 0xf3, 0xdd, 0x98, 0x05, 0x0b, 0xaf, 0x2e, 0xe6, 0x21, 0x39, 0x9e, 0xac, 0x43, 0x15, 0x87, - 0x36, 0x95, 0x22, 0x46, 0xe5, 0x13, 0x1b, 0xc4, 0xd8, 0x27, 0xd0, 0x92, 0xe9, 0x8a, 0xb2, 0x7f, - 0x4e, 0x19, 0xbf, 0xb1, 0x08, 0x5a, 0x03, 0xc8, 0x23, 0x6a, 0x36, 0x7e, 0x2a, 0xad, 0x08, 0xc3, - 0x38, 0xf5, 0x98, 0xef, 0x66, 0xaf, 0x51, 0x90, 0xfd, 0x39, 0x34, 0xb3, 0x33, 0x54, 0x13, 0x9c, - 0x25, 0x4d, 0x29, 0x4d, 0x59, 0xfb, 0x4b, 0x92, 0x83, 0xd0, 0xcd, 0x73, 0xa6, 0xfd, 0x4b, 0x3d, - 0xe3, 0x54, 0xfd, 0xe0, 0x42, 0x19, 0xa6, 0x2d, 0x97, 0x61, 0x8b, 0x25, 0x8d, 0xfe, 0xa3, 0x4a, - 0x9a, 0x2f, 0xc0, 0x72, 0x31, 0xaf, 0x7b, 0x17, 0x59, 0x64, 0xeb, 0x2e, 0xe7, 0x70, 0x95, 0xf9, - 0xbd, 0x0b, 0x46, 0x0b, 0x62, 0x71, 0x97, 0x24, 0x3c, 0x67, 0x81, 0xf7, 0x3d, 0x36, 0xbc, 0xe2, - 0xc1, 0xc5, 0x42, 0x31, 0x3d, 0x90, 0xb9, 0x5e, 0x4d, 0x0f, 0xb2, 0x41, 0x88, 0x51, 0x0c, 0x42, - 0x84, 0xd4, 0xd2, 0x88, 0xb3, 0x38, 0xc9, 0x6a, 0x3e, 0x09, 0xe5, 0xb5, 0x93, 0xa5, 0x68, 0x9d, - 0x60, 0x6a, 0x7f, 0x09, 0x56, 0x7e, 0x17, 0x11, 0x52, 0x0e, 0x0e, 0x0f, 0xfa, 0x32, 0x00, 0x0c, - 0x0e, 0x7a, 0xfd, 0xbf, 0x6f, 0x6b, 0x22, 0x28, 0xd1, 0xfe, 0xcb, 0x3e, 0x1d, 0xf6, 0xdb, 0xba, - 0x08, 0x1e, 0xbd, 0xfe, 0x5e, 0x7f, 0xd4, 0x6f, 0x57, 0xbe, 0xae, 0x9a, 0xf5, 0xb6, 0x49, 0x4d, - 0x36, 0x8f, 0x7c, 0x6f, 0xe2, 0x25, 0xf6, 0x31, 0x98, 0xfb, 0x4e, 0xf4, 0x5a, 0xfd, 0x5e, 0xe4, - 0x9a, 0x54, 0x35, 0xfd, 0x2a, 0x2f, 0x3c, 0x80, 0xba, 0x8a, 0x0e, 0xca, 0x9a, 0x16, 0x22, 0x47, - 0x86, 0xb3, 0xff, 0x5b, 0x83, 0xdb, 0xfb, 0xe1, 0x05, 0xcb, 0x93, 0xec, 0x91, 0x73, 0xe9, 0x87, - 0x8e, 0xfb, 0x06, 0xd5, 0x3d, 0x84, 0x5b, 0x3c, 0x4c, 0xe3, 0x09, 0x1b, 0x2f, 0x0d, 0x1c, 0x5a, - 0x72, 0xf9, 0xb9, 0x32, 0x41, 0x1b, 0x5a, 0x2e, 0xe3, 0x49, 0x41, 0x55, 0x41, 0xaa, 0x86, 0x58, - 0xcc, 0x68, 0xf2, 0x4a, 0xa1, 0xfa, 0xa6, 0x4a, 0xc1, 0xfe, 0x99, 0x06, 0xad, 0xfe, 0x3c, 0x0a, - 0xe3, 0x24, 0xbb, 0xe6, 0x0d, 0xe6, 0xff, 0x04, 0x0c, 0xc1, 0x95, 0x72, 0x65, 0x5a, 0x1d, 0xb1, - 0xf1, 0x02, 0xf7, 0xe6, 0x10, 0xf1, 0x54, 0xd1, 0x5d, 0x5f, 0x32, 0xbd, 0x03, 0xf5, 0x34, 0xf0, - 0xe6, 0xd9, 0x40, 0xa6, 0x42, 0x0d, 0x01, 0x8e, 0xb8, 0xfd, 0x15, 0x18, 0x72, 0x8f, 0x92, 0x76, - 0x1b, 0x50, 0x1f, 0x1e, 0xef, 0xec, 0xf4, 0x87, 0xc3, 0xb6, 0x46, 0x5a, 0x60, 0xf5, 0x8e, 0x8f, - 0xf6, 0x06, 0x3b, 0xdb, 0x23, 0xa5, 0xe1, 0xdd, 0xed, 0xc1, 0x5e, 0xbf, 0xd7, 0xae, 0xd8, 0x3b, - 0x60, 0x8d, 0xe6, 0x81, 0x62, 0x2f, 0xe7, 0x37, 0xed, 0x86, 0xfc, 0xa6, 0x2f, 0xe5, 0xb7, 0x21, - 0x34, 0x4a, 0xf5, 0x0e, 0x79, 0x1f, 0xaa, 0xc9, 0x3c, 0x58, 0x9c, 0x82, 0x66, 0x67, 0x50, 0x44, - 0x91, 0xf7, 0xa1, 0x29, 0x3a, 0x2c, 0x87, 0x73, 0x6f, 0x1a, 0x30, 0x57, 0xed, 0x28, 0xba, 0xae, - 0x6d, 0xb5, 0x64, 0xdf, 0x83, 0x96, 0x68, 0x69, 0xbd, 0x19, 0xe3, 0x89, 0x33, 0x8b, 0x30, 0x1b, - 0xab, 0x10, 0x5c, 0xa5, 0x7a, 0xc2, 0xed, 0x87, 0xd0, 0x3c, 0x62, 0x2c, 0xa6, 0x8c, 0x47, 0x61, - 0xc0, 0xb1, 0xbd, 0x51, 0xa2, 0x96, 0xf1, 0x5e, 0x41, 0xf6, 0x77, 0x60, 0x89, 0x8a, 0xf5, 0x99, - 0x93, 0x4c, 0xce, 0x7e, 0x4a, 0x45, 0xfb, 0x10, 0xea, 0x91, 0x54, 0x91, 0xaa, 0x3f, 0x9b, 0x18, - 0x72, 0x94, 0xda, 0x68, 0x86, 0xb4, 0x3f, 0x83, 0xca, 0x41, 0x3a, 0x2b, 0xff, 0x27, 0x50, 0x95, - 0x95, 0xd6, 0x42, 0x2f, 0xa7, 0x2f, 0xf6, 0x72, 0xf6, 0xb7, 0xd0, 0xc8, 0x9e, 0x3a, 0x70, 0x71, - 0xb0, 0x8f, 0xa2, 0x1e, 0xb8, 0x0b, 0x92, 0x97, 0x4d, 0x12, 0x0b, 0xdc, 0x41, 0x26, 0x23, 0x09, - 0x2c, 0xee, 0xad, 0x86, 0x00, 0xf9, 0xde, 0xbb, 0xd0, 0xcc, 0xaa, 0x4a, 0x2c, 0xeb, 0x84, 0xf2, - 0x7c, 0x8f, 0x05, 0x25, 0xc5, 0x9a, 0x72, 0x61, 0xc4, 0x6f, 0x98, 0xd7, 0xd9, 0xff, 0x08, 0xad, - 0x67, 0xce, 0xe4, 0x3c, 0x8d, 0xb2, 0x38, 0x5f, 0xb2, 0x4d, 0x6d, 0xc1, 0x36, 0x6f, 0x18, 0xfa, - 0xdd, 0x01, 0x23, 0x71, 0xe2, 0xa9, 0x9a, 0x17, 0x59, 0x54, 0x41, 0xf6, 0xbf, 0x6b, 0xb0, 0x9a, - 0xed, 0xae, 0x34, 0xd8, 0x81, 0xfa, 0x4c, 0x8e, 0x64, 0x95, 0xb3, 0x67, 0x20, 0x79, 0xba, 0xe4, - 0x46, 0x77, 0x85, 0xd6, 0x16, 0xb9, 0x97, 0xfc, 0xe8, 0xcf, 0xf1, 0x8a, 0xad, 0xff, 0xd5, 0xa0, - 0x2a, 0x6c, 0x82, 0xdc, 0x87, 0x6a, 0x7f, 0x72, 0x16, 0x92, 0x05, 0xd5, 0x77, 0x17, 0x20, 0x7b, - 0x85, 0x7c, 0x2c, 0xe7, 0xae, 0xd9, 0x38, 0xb9, 0x95, 0x99, 0x14, 0x9a, 0xdc, 0x6b, 0xd4, 0x9b, - 0xd0, 0xf8, 0x3a, 0xf4, 0x82, 0x1d, 0x39, 0x8a, 0x24, 0xcb, 0x06, 0xf8, 0x1a, 0xfd, 0x27, 0x60, - 0x0c, 0xb8, 0xb0, 0xf4, 0xd7, 0x49, 0xb1, 0x73, 0x2c, 0x3b, 0x81, 0xbd, 0xb2, 0xf5, 0x3b, 0x1d, - 0xaa, 0xdf, 0xb2, 0x38, 0x24, 0x1f, 0x43, 0x5d, 0xcd, 0x49, 0x48, 0x69, 0x1e, 0xd2, 0xc5, 0xd0, - 0xb6, 0x34, 0x40, 0xc1, 0x5b, 0x19, 0x2a, 0x5f, 0x16, 0xc3, 0x9b, 0xee, 0x55, 0x61, 0xd0, 0x5e, - 0xd9, 0xd0, 0x9e, 0x68, 0xe4, 0x23, 0x30, 0xa4, 0xcf, 0x2f, 0xc9, 0x66, 0xb9, 0xfb, 0xb1, 0x57, - 0x9e, 0x68, 0xe4, 0x11, 0x34, 0x86, 0x67, 0x61, 0xea, 0xbb, 0x43, 0x16, 0x5f, 0x30, 0x52, 0x1a, - 0x19, 0x76, 0x4b, 0xdf, 0xf6, 0x0a, 0xd9, 0x00, 0x90, 0x5e, 0x71, 0xec, 0xb9, 0x9c, 0xd4, 0x05, - 0xee, 0x20, 0x9d, 0xc9, 0x4d, 0x4b, 0xee, 0x22, 0x29, 0x4b, 0xb1, 0xe1, 0x26, 0xca, 0x4f, 0xa1, - 0xb5, 0x83, 0x91, 0xea, 0x30, 0xde, 0x3e, 0x09, 0xe3, 0x84, 0x2c, 0x8f, 0x0d, 0xbb, 0xcb, 0x0b, - 0xf6, 0x0a, 0x79, 0x02, 0xe6, 0x28, 0xbe, 0x94, 0xf4, 0x6f, 0xa9, 0x08, 0x56, 0x9c, 0x77, 0xc5, - 0x2b, 0xb7, 0x7e, 0x51, 0x01, 0xe3, 0x9b, 0x30, 0x3e, 0x67, 0x31, 0x79, 0x0c, 0x06, 0xb6, 0xa9, - 0xca, 0x14, 0xf2, 0x96, 0xf5, 0xaa, 0x83, 0xee, 0x83, 0x85, 0x42, 0x19, 0x39, 0xfc, 0x5c, 0x8a, - 0x1e, 0xff, 0xc5, 0x93, 0x72, 0x91, 0xb5, 0x0f, 0xda, 0xc0, 0xea, 0x30, 0x89, 0x99, 0x33, 0xcb, - 0x5b, 0xf3, 0x85, 0xde, 0xb1, 0x5b, 0x97, 0xed, 0xe1, 0x50, 0x29, 0xe7, 0x43, 0xa8, 0x0e, 0xe5, - 0x4b, 0x05, 0x51, 0xf1, 0x4f, 0x47, 0x77, 0x35, 0x5b, 0xc8, 0x77, 0xfe, 0x1b, 0x30, 0x64, 0xd9, - 0x22, 0x9f, 0xb9, 0x50, 0xd7, 0x75, 0xdb, 0xe5, 0x25, 0xc5, 0x60, 0x43, 0xfd, 0x28, 0x8d, 0xa7, - 0x6c, 0xc4, 0x97, 0x34, 0x9f, 0xe9, 0xc0, 0x5e, 0x11, 0xee, 0x2a, 0x9d, 0x53, 0x6e, 0xba, 0x10, - 0x44, 0xba, 0xe4, 0x75, 0xdf, 0x45, 0x81, 0x1b, 0x32, 0x2d, 0x4a, 0x96, 0x85, 0x14, 0xd9, 0x7d, - 0x7d, 0x09, 0x65, 0xd2, 0xa6, 0x6c, 0xc2, 0xbc, 0x52, 0xdd, 0x40, 0x32, 0x39, 0x2c, 0x3b, 0xd1, - 0x86, 0x46, 0xbe, 0x84, 0xd6, 0x42, 0x8d, 0x41, 0x30, 0x15, 0x5f, 0x55, 0x76, 0x2c, 0x33, 0x3f, - 0x6b, 0xff, 0xff, 0xab, 0x35, 0xed, 0xe7, 0xaf, 0xd6, 0xb4, 0x5f, 0xbd, 0x5a, 0xd3, 0x7e, 0xf8, - 0xf5, 0xda, 0xca, 0x89, 0x81, 0x7f, 0x18, 0x7f, 0xfa, 0xc7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4a, - 0x15, 0x0b, 0x86, 0x4b, 0x1e, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_038c2d1314fe6088) } + +var fileDescriptor_pb_038c2d1314fe6088 = []byte{ + // 3130 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x72, 0xe3, 0xd6, + 0x95, 0x02, 0x48, 0x82, 0xc0, 0x21, 0xa9, 0xa6, 0xaf, 0x7b, 0xda, 0x34, 0xed, 0x51, 0xcb, 0x70, + 0x3f, 0xd4, 0x6d, 0x5b, 0xd3, 0x96, 0x3d, 0xe5, 0xc7, 0x4e, 0x2d, 0x52, 0x5d, 0x74, 0xeb, 0x35, + 0x97, 0x54, 0x7b, 0xc6, 0x53, 0x65, 0x16, 0x44, 0x5c, 0x51, 0x18, 0x81, 0x00, 0x06, 0x17, 0x50, + 0x51, 0x5e, 0x4c, 0xd5, 0x6c, 0xe6, 0x1b, 0xbc, 0x9a, 0x45, 0x96, 0xc9, 0x0f, 0x24, 0x1f, 0x90, + 0xaa, 0x54, 0x56, 0xde, 0x66, 0x97, 0xea, 0xac, 0xb2, 0x4e, 0xa5, 0xb2, 0xc8, 0x26, 0x75, 0xcf, + 0xbd, 0x78, 0x90, 0x2d, 0xa9, 0xed, 0x54, 0x65, 0x45, 0x9c, 0xd7, 0x7d, 0x9c, 0x73, 0xee, 0x79, + 0x11, 0xcc, 0xe8, 0x64, 0x33, 0x8a, 0xc3, 0x24, 0x24, 0x7a, 0x74, 0xd2, 0xb5, 0x9c, 0xc8, 0x93, + 0xa0, 0xdd, 0x85, 0xea, 0x9e, 0xc7, 0x13, 0x42, 0xa0, 0x9a, 0x7a, 0x2e, 0xef, 0x68, 0xeb, 0x95, + 0x0d, 0x83, 0xe2, 0xb7, 0xbd, 0x0f, 0xd6, 0xc8, 0xe1, 0xe7, 0x2f, 0x1c, 0x3f, 0x65, 0xa4, 0x0d, + 0x95, 0x0b, 0xc7, 0xef, 0x68, 0xeb, 0xda, 0x46, 0x93, 0x8a, 0x4f, 0xb2, 0x09, 0xe6, 0x85, 0xe3, + 0x8f, 0x93, 0xcb, 0x88, 0x75, 0xf4, 0x75, 0x6d, 0x63, 0x75, 0xeb, 0xcd, 0xcd, 0xe8, 0x64, 0xf3, + 0x28, 0xe4, 0x89, 0x17, 0x4c, 0x37, 0x5f, 0x38, 0xfe, 0xe8, 0x32, 0x62, 0xb4, 0x7e, 0x21, 0x3f, + 0xec, 0x43, 0x68, 0x0c, 0xe3, 0xc9, 0x6e, 0x1a, 0x4c, 0x12, 0x2f, 0x0c, 0xc4, 0x8e, 0x81, 0x33, + 0x63, 0xb8, 0xa2, 0x45, 0xf1, 0x5b, 0xe0, 0x9c, 0x78, 0xca, 0x3b, 0x95, 0xf5, 0x8a, 0xc0, 0x89, + 0x6f, 0xd2, 0x81, 0xba, 0xc7, 0x77, 0xc2, 0x34, 0x48, 0x3a, 0xd5, 0x75, 0x6d, 0xc3, 0xa4, 0x19, + 0x68, 0xff, 0x49, 0x87, 0xda, 0xbf, 0xa5, 0x2c, 0xbe, 0x44, 0xb9, 0x24, 0x89, 0xb3, 0xb5, 0xc4, + 0x37, 0xb9, 0x0d, 0x35, 0xdf, 0x09, 0xa6, 0xbc, 0xa3, 0xe3, 0x62, 0x12, 0x20, 0xef, 0x80, 0xe5, + 0x9c, 0x26, 0x2c, 0x1e, 0xa7, 0x9e, 0xdb, 0xa9, 0xac, 0x6b, 0x1b, 0x06, 0x35, 0x11, 0x71, 0xec, + 0xb9, 0xe4, 0x6d, 0x30, 0xdd, 0x70, 0x3c, 0x29, 0xef, 0xe5, 0x86, 0xb8, 0x17, 0x79, 0x1f, 0xcc, + 0xd4, 0x73, 0xc7, 0xbe, 0xc7, 0x93, 0x4e, 0x6d, 0x5d, 0xdb, 0x68, 0x6c, 0x99, 0xe2, 0xb2, 0x42, + 0x77, 0xb4, 0x9e, 0x7a, 0x2e, 0x2a, 0xf1, 0x31, 0x98, 0x3c, 0x9e, 0x8c, 0x4f, 0xd3, 0x60, 0xd2, + 0x31, 0x90, 0xe9, 0x96, 0x60, 0x2a, 0xdd, 0x9a, 0xd6, 0xb9, 0x04, 0xc4, 0xb5, 0x62, 0x76, 0xc1, + 0x62, 0xce, 0x3a, 0x75, 0xb9, 0x95, 0x02, 0xc9, 0x13, 0x68, 0x9c, 0x3a, 0x13, 0x96, 0x8c, 0x23, + 0x27, 0x76, 0x66, 0x1d, 0xb3, 0x58, 0x68, 0x57, 0xa0, 0x8f, 0x04, 0x96, 0x53, 0x38, 0xcd, 0x01, + 0xf2, 0x09, 0xb4, 0x10, 0xe2, 0xe3, 0x53, 0xcf, 0x4f, 0x58, 0xdc, 0xb1, 0x50, 0x66, 0x15, 0x65, + 0x10, 0x33, 0x8a, 0x19, 0xa3, 0x4d, 0xc9, 0x24, 0x31, 0xe4, 0x9f, 0x01, 0xd8, 0x3c, 0x72, 0x02, + 0x77, 0xec, 0xf8, 0x7e, 0x07, 0xf0, 0x0c, 0x96, 0xc4, 0x6c, 0xfb, 0x3e, 0x79, 0x4b, 0x9c, 0xcf, + 0x71, 0xc7, 0x09, 0xef, 0xb4, 0xd6, 0xb5, 0x8d, 0x2a, 0x35, 0x04, 0x38, 0xe2, 0xf6, 0x16, 0x58, + 0xe8, 0x11, 0x78, 0xe3, 0xfb, 0x60, 0x5c, 0x08, 0x40, 0x3a, 0x4e, 0x63, 0xab, 0x25, 0xb6, 0xcc, + 0x9d, 0x86, 0x2a, 0xa2, 0xbd, 0x06, 0xe6, 0x9e, 0x13, 0x4c, 0x33, 0x4f, 0x13, 0xa6, 0x40, 0x01, + 0x8b, 0xe2, 0xb7, 0xfd, 0xbd, 0x0e, 0x06, 0x65, 0x3c, 0xf5, 0x13, 0xf2, 0x10, 0x40, 0x28, 0x7a, + 0xe6, 0x24, 0xb1, 0x37, 0x57, 0xab, 0x16, 0xaa, 0xb6, 0x52, 0xcf, 0xdd, 0x47, 0x12, 0x79, 0x02, + 0x4d, 0x5c, 0x3d, 0x63, 0xd5, 0x8b, 0x03, 0xe4, 0xe7, 0xa3, 0x0d, 0x64, 0x51, 0x12, 0x77, 0xc0, + 0x40, 0xdb, 0x4a, 0xff, 0x6a, 0x51, 0x05, 0x91, 0xfb, 0xb0, 0xea, 0x05, 0x89, 0xd0, 0xfd, 0x24, + 0x19, 0xbb, 0x8c, 0x67, 0xc6, 0x6f, 0xe5, 0xd8, 0x1e, 0xe3, 0x09, 0xf9, 0x18, 0xa4, 0x02, 0xb3, + 0x0d, 0x6b, 0xb8, 0xe1, 0x6a, 0x6e, 0x18, 0x2e, 0x77, 0x44, 0x1e, 0xb5, 0xe3, 0x47, 0xd0, 0x10, + 0xf7, 0xcb, 0x24, 0x0c, 0x94, 0x68, 0xe2, 0x6d, 0x94, 0x3a, 0x28, 0x08, 0x06, 0xc5, 0x2e, 0x54, + 0x23, 0x1c, 0x4c, 0x3a, 0x04, 0x7e, 0xdb, 0x7d, 0xa8, 0x1d, 0xc6, 0x2e, 0x8b, 0xaf, 0xf4, 0x71, + 0x02, 0x55, 0x97, 0xf1, 0x09, 0x3e, 0x3f, 0x93, 0xe2, 0x77, 0xe1, 0xf7, 0x95, 0x92, 0xdf, 0xdb, + 0xff, 0xaf, 0x41, 0x63, 0x18, 0xc6, 0xc9, 0x3e, 0xe3, 0xdc, 0x99, 0x32, 0x72, 0x17, 0x6a, 0xa1, + 0x58, 0x56, 0x69, 0xd8, 0x12, 0x67, 0xc2, 0x7d, 0xa8, 0xc4, 0x2f, 0xd9, 0x41, 0xbf, 0xde, 0x0e, + 0xb7, 0xa1, 0x26, 0x5f, 0x8c, 0x78, 0x4d, 0x35, 0x2a, 0x01, 0xa1, 0xeb, 0xf0, 0xf4, 0x94, 0x33, + 0xa9, 0xcb, 0x1a, 0x55, 0xd0, 0xf5, 0x6e, 0xf5, 0xaf, 0x00, 0xe2, 0x7c, 0x3f, 0xd1, 0x0b, 0xec, + 0x33, 0x68, 0x50, 0xe7, 0x34, 0xd9, 0x09, 0x83, 0x84, 0xcd, 0x13, 0xb2, 0x0a, 0xba, 0xe7, 0xa2, + 0x8a, 0x0c, 0xaa, 0x7b, 0xae, 0x38, 0xdc, 0x34, 0x0e, 0xd3, 0x08, 0x35, 0xd4, 0xa2, 0x12, 0x40, + 0x55, 0xba, 0x6e, 0x8c, 0x27, 0x16, 0xaa, 0x74, 0xdd, 0x98, 0xdc, 0x85, 0x06, 0x0f, 0x9c, 0x88, + 0x9f, 0x85, 0x89, 0x38, 0x5c, 0x15, 0x0f, 0x07, 0x19, 0x6a, 0xc4, 0xed, 0x5f, 0x6b, 0x60, 0xec, + 0xb3, 0xd9, 0x09, 0x8b, 0x5f, 0xd9, 0xe5, 0x6d, 0x30, 0x71, 0xe1, 0xb1, 0xe7, 0xaa, 0x8d, 0xea, + 0x08, 0x0f, 0xdc, 0x2b, 0xb7, 0xba, 0x03, 0x86, 0xcf, 0x1c, 0xa1, 0x7c, 0xe9, 0x67, 0x0a, 0x12, + 0xba, 0x71, 0x66, 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xac, 0xc7, 0x1c, 0x57, + 0x9c, 0xcd, 0x77, 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x70, 0x1c, 0x9e, + 0x1c, 0x23, 0x86, 0x3c, 0x86, 0x37, 0x26, 0x7e, 0xca, 0x45, 0x5c, 0xf3, 0x82, 0xd3, 0x70, 0x1c, + 0x06, 0xfe, 0x25, 0xea, 0xd7, 0xa4, 0xb7, 0x14, 0x61, 0x10, 0x9c, 0x86, 0x87, 0x81, 0x7f, 0x69, + 0xff, 0x55, 0x83, 0xda, 0x33, 0x54, 0xc3, 0x13, 0xa8, 0xcf, 0xf0, 0x42, 0xd9, 0xeb, 0xbd, 0x23, + 0x34, 0x8c, 0xb4, 0x4d, 0x79, 0x53, 0xde, 0x0f, 0x92, 0xf8, 0x92, 0x66, 0x6c, 0x42, 0x22, 0x71, + 0x4e, 0x7c, 0x96, 0x70, 0xe5, 0x11, 0x25, 0x89, 0x91, 0x24, 0x28, 0x09, 0xc5, 0xd6, 0xdd, 0x85, + 0x66, 0x79, 0x29, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4a, 0xc5, 0x27, 0x59, 0x87, 0x1a, + 0x3e, 0x52, 0xd4, 0x5c, 0x63, 0x0b, 0xc4, 0x8a, 0x52, 0x84, 0x4a, 0xc2, 0x97, 0xfa, 0xe7, 0x9a, + 0x58, 0xa7, 0xbc, 0x41, 0x79, 0x1d, 0xeb, 0xfa, 0x75, 0xa4, 0x48, 0x69, 0x1d, 0xfb, 0x2f, 0x1a, + 0x34, 0xbf, 0x61, 0x71, 0x78, 0x14, 0x87, 0x51, 0xc8, 0x1d, 0x9f, 0xd8, 0x60, 0xc8, 0xdb, 0x5d, + 0xb1, 0xbf, 0xa2, 0x08, 0x1e, 0x79, 0x1f, 0x34, 0xe3, 0xe2, 0xda, 0x8a, 0x42, 0xd6, 0x00, 0x66, + 0xce, 0x7c, 0x8f, 0x39, 0x9c, 0x0d, 0xdc, 0xcc, 0x7d, 0x0a, 0x0c, 0xe9, 0x82, 0x39, 0x73, 0xe6, + 0xa3, 0x79, 0x30, 0xe2, 0x68, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x2e, 0x58, 0x33, 0x67, 0x2e, 0xfc, + 0x78, 0xe0, 0x2a, 0xeb, 0x16, 0x08, 0xf2, 0x1e, 0x54, 0x92, 0x79, 0x80, 0x41, 0x41, 0xe4, 0x01, + 0x91, 0xbb, 0x47, 0xf3, 0x40, 0x79, 0x3c, 0x15, 0xb4, 0x4c, 0x1b, 0x66, 0xa1, 0x8d, 0x36, 0x54, + 0x26, 0x9e, 0x8b, 0x89, 0xc0, 0xa2, 0xe2, 0xd3, 0xfe, 0x65, 0x05, 0x6e, 0x29, 0x53, 0x9c, 0x79, + 0xd1, 0x30, 0x11, 0x7e, 0xd3, 0x81, 0x3a, 0x3e, 0x57, 0x16, 0x2b, 0x8b, 0x64, 0x20, 0xf9, 0x0c, + 0x0c, 0x74, 0xe1, 0xcc, 0xd0, 0x77, 0x0b, 0xb5, 0xe4, 0xe2, 0xd2, 0xf0, 0xca, 0xe2, 0x8a, 0x9d, + 0x7c, 0x0a, 0xb5, 0xef, 0x58, 0x1c, 0xca, 0xf0, 0xd3, 0xd8, 0x5a, 0xbb, 0x4a, 0x4e, 0x18, 0x40, + 0x89, 0x49, 0xe6, 0x7f, 0xa0, 0xf6, 0xee, 0x89, 0x80, 0x33, 0x0b, 0x2f, 0x98, 0xdb, 0xa9, 0xe3, + 0x89, 0xca, 0x06, 0xce, 0x48, 0x99, 0xba, 0xcc, 0x5c, 0x5d, 0xdd, 0x1e, 0x34, 0x4a, 0xd7, 0x2b, + 0xfb, 0x5b, 0x4b, 0x6a, 0xf8, 0xee, 0xa2, 0xbf, 0x59, 0xf9, 0x4b, 0x28, 0xbb, 0x6d, 0x0f, 0xa0, + 0xb8, 0xec, 0xdf, 0xeb, 0xfc, 0xf6, 0xff, 0x6a, 0x70, 0x6b, 0x27, 0x0c, 0x02, 0x86, 0x35, 0x84, + 0x34, 0x5d, 0xe1, 0xb7, 0xda, 0xb5, 0x7e, 0xfb, 0x08, 0x6a, 0x5c, 0x30, 0xab, 0xd5, 0xdf, 0xbc, + 0xc2, 0x16, 0x54, 0x72, 0x88, 0x10, 0x33, 0x73, 0xe6, 0xe3, 0x88, 0x05, 0xae, 0x17, 0x4c, 0xd1, + 0xcf, 0xa5, 0x05, 0x8e, 0x24, 0xc6, 0xfe, 0x99, 0x06, 0x86, 0x74, 0xf9, 0x85, 0x70, 0xa7, 0x2d, + 0x86, 0xbb, 0x77, 0xc1, 0x8a, 0x62, 0xe6, 0x7a, 0x93, 0x6c, 0x57, 0x8b, 0x16, 0x08, 0x11, 0x8d, + 0x4f, 0xc3, 0x78, 0xc2, 0x70, 0x79, 0x93, 0x4a, 0x40, 0x94, 0x64, 0x98, 0x12, 0x30, 0x68, 0xc9, + 0x88, 0x68, 0x0a, 0x84, 0x88, 0x56, 0x42, 0x84, 0x47, 0xce, 0x44, 0x16, 0x49, 0x15, 0x2a, 0x01, + 0x11, 0x41, 0xa5, 0xe5, 0xd0, 0x62, 0x26, 0x55, 0x90, 0xfd, 0x73, 0x1d, 0x9a, 0x3d, 0x2f, 0x66, + 0x93, 0x84, 0xb9, 0x7d, 0x77, 0x8a, 0x8c, 0x2c, 0x48, 0xbc, 0xe4, 0x52, 0x45, 0x6b, 0x05, 0xe5, + 0xc9, 0x54, 0x5f, 0x2c, 0x18, 0xa5, 0x2d, 0x2a, 0x58, 0xe3, 0x4a, 0x80, 0x6c, 0x01, 0xc8, 0x32, + 0x03, 0xeb, 0xdc, 0xea, 0xf5, 0x75, 0xae, 0x85, 0x6c, 0xe2, 0x53, 0x28, 0x48, 0xca, 0x78, 0x32, + 0x92, 0x1b, 0x58, 0x04, 0xa7, 0xc2, 0x91, 0x31, 0x3b, 0x9f, 0x30, 0x1f, 0x1d, 0x15, 0xb3, 0xf3, + 0x09, 0xf3, 0xf3, 0x9a, 0xa8, 0x2e, 0x8f, 0x23, 0xbe, 0xc9, 0xfb, 0xa0, 0x87, 0x11, 0xde, 0x4f, + 0x6d, 0x58, 0xbe, 0xd8, 0xe6, 0x61, 0x44, 0xf5, 0x30, 0x12, 0x5e, 0x20, 0x8b, 0xba, 0x8e, 0xa5, + 0x9c, 0x5b, 0x84, 0x07, 0x2c, 0x47, 0xa8, 0xa2, 0xd8, 0x77, 0x40, 0x3f, 0x8c, 0x48, 0x1d, 0x2a, + 0xc3, 0xfe, 0xa8, 0xbd, 0x22, 0x3e, 0x7a, 0xfd, 0xbd, 0xb6, 0x66, 0xbf, 0xd4, 0xc0, 0xda, 0x4f, + 0x13, 0x47, 0xf8, 0x14, 0xbf, 0xc9, 0xa8, 0x6f, 0x83, 0xc9, 0x13, 0x27, 0xc6, 0xbc, 0xa8, 0xcb, + 0x30, 0x81, 0xf0, 0x88, 0x93, 0x07, 0x50, 0x63, 0xee, 0x94, 0x65, 0xaf, 0xbd, 0xbd, 0x7c, 0x4e, + 0x2a, 0xc9, 0x64, 0x03, 0x0c, 0x3e, 0x39, 0x63, 0x33, 0xa7, 0x53, 0x2d, 0x18, 0x87, 0x88, 0x91, + 0x29, 0x8c, 0x2a, 0x3a, 0xd6, 0xe0, 0x71, 0x18, 0x61, 0x51, 0x5a, 0x53, 0x35, 0x78, 0x1c, 0x46, + 0xa2, 0x24, 0xdd, 0x82, 0x7f, 0xf2, 0xa6, 0x41, 0x18, 0xb3, 0xb1, 0x17, 0xb8, 0x6c, 0x3e, 0x9e, + 0x84, 0xc1, 0xa9, 0xef, 0x4d, 0x12, 0xd4, 0xa5, 0x49, 0xdf, 0x94, 0xc4, 0x81, 0xa0, 0xed, 0x28, + 0x92, 0xfd, 0x3e, 0x58, 0xcf, 0xd9, 0x25, 0x16, 0x84, 0x9c, 0xdc, 0x01, 0xfd, 0xfc, 0x42, 0xe5, + 0x3a, 0x43, 0x9c, 0xe0, 0xf9, 0x0b, 0xaa, 0x9f, 0x5f, 0xd8, 0x73, 0x30, 0x87, 0x2a, 0xd1, 0x93, + 0x47, 0x22, 0x24, 0x62, 0x68, 0x55, 0x0f, 0x0b, 0x2b, 0xef, 0x52, 0x8d, 0x41, 0x33, 0xba, 0xb0, + 0x25, 0x1e, 0x44, 0x29, 0x45, 0x02, 0xe5, 0x0a, 0xa7, 0x52, 0xae, 0x70, 0xb0, 0x58, 0x0b, 0x03, + 0xa6, 0x5c, 0x1c, 0xbf, 0xed, 0xff, 0xd3, 0xc1, 0xcc, 0x53, 0xd1, 0x07, 0x60, 0xcd, 0x32, 0x7b, + 0xa8, 0x27, 0x8b, 0xe5, 0x6c, 0x6e, 0x24, 0x5a, 0xd0, 0xd5, 0x5d, 0xaa, 0xcb, 0x77, 0x29, 0xde, + 0x7c, 0xed, 0xb5, 0x6f, 0xfe, 0x21, 0xdc, 0x9a, 0xf8, 0xcc, 0x09, 0xc6, 0xc5, 0x93, 0x95, 0x5e, + 0xb9, 0x8a, 0xe8, 0xa3, 0xfc, 0xdd, 0xaa, 0xb8, 0x55, 0x2f, 0xd2, 0xcb, 0x7d, 0xa8, 0xb9, 0xcc, + 0x4f, 0x9c, 0x72, 0x77, 0x72, 0x18, 0x3b, 0x13, 0x9f, 0xf5, 0x04, 0x9a, 0x4a, 0x2a, 0xd9, 0x00, + 0x33, 0xab, 0xa0, 0x54, 0x4f, 0x82, 0xc5, 0x6f, 0xa6, 0x6c, 0x9a, 0x53, 0xed, 0x8f, 0xa1, 0xf2, + 0xfc, 0xc5, 0xf0, 0x3a, 0x0b, 0xe5, 0xba, 0xd3, 0x4b, 0xba, 0xfb, 0x16, 0xf4, 0xe7, 0x2f, 0xca, + 0x31, 0xb5, 0x99, 0xa7, 0x3e, 0xd1, 0xa9, 0xea, 0x45, 0xa7, 0xda, 0x05, 0x33, 0xe5, 0x2c, 0xde, + 0x67, 0x89, 0xa3, 0x1e, 0x77, 0x0e, 0x8b, 0x14, 0x28, 0xda, 0x2e, 0x2f, 0x0c, 0x54, 0xda, 0xc9, + 0x40, 0xfb, 0x8f, 0x15, 0xa8, 0xab, 0x47, 0x2e, 0xd6, 0x4c, 0xf3, 0x92, 0x4f, 0x7c, 0x16, 0xd1, + 0x42, 0x2f, 0x47, 0x8b, 0x72, 0x4f, 0x5c, 0x79, 0x7d, 0x4f, 0x4c, 0xbe, 0x84, 0x66, 0x24, 0x69, + 0xe5, 0xf8, 0xf2, 0x56, 0x59, 0x46, 0xfd, 0xa2, 0x5c, 0x23, 0x2a, 0x00, 0xf1, 0x52, 0xb0, 0xb9, + 0x48, 0x9c, 0x29, 0x1a, 0xbb, 0x49, 0xeb, 0x02, 0x1e, 0x39, 0xd3, 0x6b, 0xa2, 0xcc, 0x8f, 0x08, + 0x16, 0xa2, 0xb4, 0x0d, 0xa3, 0x4e, 0x13, 0x03, 0x80, 0x08, 0x30, 0xe5, 0xb7, 0xdf, 0x5a, 0x7c, + 0xfb, 0xef, 0x80, 0x35, 0x09, 0x67, 0x33, 0x0f, 0x69, 0xab, 0x32, 0x29, 0x4b, 0xc4, 0x88, 0xdb, + 0xdf, 0x41, 0x5d, 0x5d, 0x96, 0x34, 0xa0, 0xde, 0xeb, 0xef, 0x6e, 0x1f, 0xef, 0x89, 0xe8, 0x03, + 0x60, 0x3c, 0x1d, 0x1c, 0x6c, 0xd3, 0xff, 0x68, 0x6b, 0x22, 0x12, 0x0d, 0x0e, 0x46, 0x6d, 0x9d, + 0x58, 0x50, 0xdb, 0xdd, 0x3b, 0xdc, 0x1e, 0xb5, 0x2b, 0xc4, 0x84, 0xea, 0xd3, 0xc3, 0xc3, 0xbd, + 0x76, 0x95, 0x34, 0xc1, 0xec, 0x6d, 0x8f, 0xfa, 0xa3, 0xc1, 0x7e, 0xbf, 0x5d, 0x13, 0xbc, 0xcf, + 0xfa, 0x87, 0x6d, 0x43, 0x7c, 0x1c, 0x0f, 0x7a, 0xed, 0xba, 0xa0, 0x1f, 0x6d, 0x0f, 0x87, 0x5f, + 0x1f, 0xd2, 0x5e, 0xdb, 0x14, 0xeb, 0x0e, 0x47, 0x74, 0x70, 0xf0, 0xac, 0x6d, 0xd9, 0x1f, 0x43, + 0xa3, 0xa4, 0x34, 0x21, 0x41, 0xfb, 0xbb, 0xed, 0x15, 0xb1, 0xcd, 0x8b, 0xed, 0xbd, 0xe3, 0x7e, + 0x5b, 0x23, 0xab, 0x00, 0xf8, 0x39, 0xde, 0xdb, 0x3e, 0x78, 0xd6, 0xd6, 0xed, 0xff, 0xc9, 0x45, + 0xb0, 0x47, 0x7d, 0x08, 0xa6, 0xd2, 0x74, 0x56, 0x1a, 0x37, 0x4a, 0x26, 0xa1, 0x39, 0x51, 0x78, + 0xd6, 0xe4, 0x8c, 0x4d, 0xce, 0x79, 0x3a, 0x53, 0x8e, 0x90, 0xc3, 0xb2, 0xdd, 0x14, 0xea, 0xc8, + 0xe2, 0x80, 0x84, 0xf2, 0x51, 0x4b, 0x15, 0xf9, 0xe5, 0xa8, 0xe5, 0x53, 0x80, 0xa2, 0xb9, 0xbf, + 0xa2, 0xb8, 0xbd, 0x0d, 0x35, 0xc7, 0xf7, 0x1c, 0xae, 0x12, 0x96, 0x04, 0xec, 0x03, 0x68, 0x94, + 0x46, 0x02, 0xc2, 0x56, 0x8e, 0xef, 0x8f, 0xcf, 0xd9, 0x25, 0x47, 0x59, 0x93, 0xd6, 0x1d, 0xdf, + 0x7f, 0xce, 0x2e, 0x39, 0xb9, 0x07, 0x35, 0x39, 0x4d, 0xd0, 0x97, 0x9a, 0x56, 0x14, 0xa5, 0x92, + 0x68, 0x7f, 0x08, 0x86, 0xec, 0x64, 0x4b, 0xae, 0xa2, 0x5d, 0x9b, 0x57, 0xbe, 0x50, 0x67, 0xc6, + 0xbe, 0x97, 0x7c, 0xa0, 0xa6, 0x16, 0x5c, 0xce, 0x48, 0xb4, 0xa2, 0xd6, 0x92, 0x4c, 0x6a, 0x60, + 0x81, 0xcc, 0x76, 0x0f, 0xcc, 0x1b, 0xe7, 0x40, 0x4a, 0x01, 0x7a, 0xa1, 0x80, 0x2b, 0x26, 0x43, + 0xf6, 0x7f, 0x01, 0x14, 0xd3, 0x0d, 0xe5, 0xb9, 0x72, 0x15, 0xe1, 0xb9, 0x8f, 0x85, 0x69, 0x3c, + 0xdf, 0x8d, 0x59, 0xb0, 0x70, 0xeb, 0x62, 0x1e, 0x92, 0xd3, 0xc9, 0x3a, 0x54, 0x71, 0x68, 0x53, + 0x29, 0x62, 0x54, 0x3e, 0xb1, 0x41, 0x8a, 0x7d, 0x02, 0x2d, 0x99, 0xae, 0x28, 0xfb, 0xef, 0x94, + 0xf1, 0x1b, 0x8b, 0xa0, 0x35, 0x80, 0x3c, 0xa2, 0x66, 0xe3, 0xa7, 0x12, 0x46, 0x38, 0xc6, 0xa9, + 0xc7, 0x7c, 0x37, 0xbb, 0x8d, 0x82, 0xec, 0xcf, 0xa0, 0x99, 0xed, 0xa1, 0x9a, 0xe0, 0x2c, 0x69, + 0x4a, 0x6d, 0xca, 0xda, 0x5f, 0xb2, 0x1c, 0x84, 0x6e, 0x9e, 0x33, 0xed, 0xdf, 0xe9, 0x99, 0xa4, + 0xea, 0x07, 0x17, 0xca, 0x30, 0x6d, 0xb9, 0x0c, 0x5b, 0x2c, 0x69, 0xf4, 0x1f, 0x55, 0xd2, 0x7c, + 0x0e, 0x96, 0x8b, 0x79, 0xdd, 0xbb, 0xc8, 0x22, 0x5b, 0x77, 0x39, 0x87, 0xab, 0xcc, 0xef, 0x5d, + 0x30, 0x5a, 0x30, 0x8b, 0xb3, 0x24, 0xe1, 0x39, 0x0b, 0xbc, 0xef, 0xb0, 0xe1, 0x15, 0x17, 0x2e, + 0x10, 0xc5, 0xf4, 0x40, 0xe6, 0x7a, 0x35, 0x3d, 0xc8, 0x06, 0x21, 0x46, 0x31, 0x08, 0x11, 0x5a, + 0x4b, 0x23, 0xce, 0xe2, 0x24, 0xab, 0xf9, 0x24, 0x94, 0xd7, 0x4e, 0x96, 0xe2, 0x75, 0x82, 0xa9, + 0xfd, 0x05, 0x58, 0xf9, 0x59, 0x44, 0x48, 0x39, 0x38, 0x3c, 0xe8, 0xcb, 0x00, 0x30, 0x38, 0xe8, + 0xf5, 0xff, 0xbd, 0xad, 0x89, 0xa0, 0x44, 0xfb, 0x2f, 0xfa, 0x74, 0xd8, 0x6f, 0xeb, 0x22, 0x78, + 0xf4, 0xfa, 0x7b, 0xfd, 0x51, 0xbf, 0x5d, 0xf9, 0xaa, 0x6a, 0xd6, 0xdb, 0x26, 0x35, 0xd9, 0x3c, + 0xf2, 0xbd, 0x89, 0x97, 0xd8, 0xc7, 0x60, 0xee, 0x3b, 0xd1, 0x2b, 0xf5, 0x7b, 0x91, 0x6b, 0x52, + 0xd5, 0xf4, 0xab, 0xbc, 0x70, 0x1f, 0xea, 0x2a, 0x3a, 0x28, 0x6f, 0x5a, 0x88, 0x1c, 0x19, 0xcd, + 0xfe, 0x85, 0x06, 0xb7, 0xf7, 0xc3, 0x0b, 0x96, 0x27, 0xd9, 0x23, 0xe7, 0xd2, 0x0f, 0x1d, 0xf7, + 0x35, 0xa6, 0x7b, 0x00, 0xb7, 0x78, 0x98, 0xc6, 0x13, 0x36, 0x5e, 0x1a, 0x38, 0xb4, 0x24, 0xfa, + 0x99, 0x72, 0x41, 0x1b, 0x5a, 0x2e, 0xe3, 0x49, 0xc1, 0x55, 0x41, 0xae, 0x86, 0x40, 0x66, 0x3c, + 0x79, 0xa5, 0x50, 0x7d, 0x5d, 0xa5, 0x60, 0xff, 0x56, 0x83, 0x56, 0x7f, 0x1e, 0x85, 0x71, 0x92, + 0x1d, 0xf3, 0x06, 0xf7, 0x7f, 0x02, 0x86, 0x90, 0x4a, 0xb9, 0x72, 0xad, 0x8e, 0x58, 0x78, 0x41, + 0x7a, 0x73, 0x88, 0x74, 0xaa, 0xf8, 0xae, 0x2f, 0x99, 0xde, 0x82, 0x7a, 0x1a, 0x78, 0xf3, 0x6c, + 0x20, 0x53, 0xa1, 0x86, 0x00, 0x47, 0xdc, 0xfe, 0x12, 0x0c, 0xb9, 0x46, 0xc9, 0xba, 0x0d, 0xa8, + 0x0f, 0x8f, 0x77, 0x76, 0xfa, 0xc3, 0x61, 0x5b, 0x23, 0x2d, 0xb0, 0x7a, 0xc7, 0x47, 0x7b, 0x83, + 0x9d, 0xed, 0x91, 0xb2, 0xf0, 0xee, 0xf6, 0x60, 0xaf, 0xdf, 0x6b, 0x57, 0xec, 0x1d, 0xb0, 0x46, + 0xf3, 0x40, 0x89, 0x97, 0xf3, 0x9b, 0x76, 0x43, 0x7e, 0xd3, 0x97, 0xf2, 0xdb, 0x10, 0x1a, 0xa5, + 0x7a, 0x87, 0xbc, 0x07, 0xd5, 0x64, 0x1e, 0x2c, 0x4e, 0x41, 0xb3, 0x3d, 0x28, 0x92, 0xc8, 0x7b, + 0xd0, 0x14, 0x1d, 0x96, 0xc3, 0xb9, 0x37, 0x0d, 0x98, 0xab, 0x56, 0x14, 0x5d, 0xd7, 0xb6, 0x42, + 0xd9, 0x77, 0xa1, 0x25, 0x5a, 0x5a, 0x6f, 0xc6, 0x78, 0xe2, 0xcc, 0x22, 0xcc, 0xc6, 0x2a, 0x04, + 0x57, 0xa9, 0x9e, 0x70, 0xfb, 0x01, 0x34, 0x8f, 0x18, 0x8b, 0x29, 0xe3, 0x51, 0x18, 0x70, 0x6c, + 0x6f, 0x94, 0xaa, 0x65, 0xbc, 0x57, 0x90, 0xfd, 0x2d, 0x58, 0xa2, 0x62, 0x7d, 0xea, 0x24, 0x93, + 0xb3, 0x9f, 0x52, 0xd1, 0x3e, 0x80, 0x7a, 0x24, 0x4d, 0xa4, 0xea, 0xcf, 0x26, 0x86, 0x1c, 0x65, + 0x36, 0x9a, 0x11, 0xed, 0x4f, 0xa1, 0x72, 0x90, 0xce, 0xca, 0xff, 0x09, 0x54, 0x65, 0xa5, 0xb5, + 0xd0, 0xcb, 0xe9, 0x8b, 0xbd, 0x9c, 0xfd, 0x0d, 0x34, 0xb2, 0xab, 0x0e, 0x5c, 0x1c, 0xec, 0xa3, + 0xaa, 0x07, 0xee, 0x82, 0xe6, 0x65, 0x93, 0xc4, 0x02, 0x77, 0x90, 0xe9, 0x48, 0x02, 0x8b, 0x6b, + 0xab, 0x21, 0x40, 0xbe, 0xf6, 0x2e, 0x34, 0xb3, 0xaa, 0x12, 0xcb, 0x3a, 0x61, 0x3c, 0xdf, 0x63, + 0x41, 0xc9, 0xb0, 0xa6, 0x44, 0x8c, 0xf8, 0x0d, 0xf3, 0x3a, 0x7b, 0x33, 0x77, 0x2c, 0x02, 0xd5, + 0x49, 0xe8, 0xca, 0x37, 0x58, 0xa3, 0xf8, 0x2d, 0x2e, 0x3c, 0xe3, 0xd3, 0x2c, 0x2f, 0xcd, 0xf8, + 0xd4, 0xfe, 0x4f, 0x68, 0x3d, 0x75, 0x26, 0xe7, 0x69, 0x94, 0xe5, 0x85, 0x92, 0x2f, 0x6b, 0x0b, + 0xbe, 0x7c, 0xc3, 0x90, 0xf0, 0x0e, 0x18, 0x89, 0x13, 0x4f, 0xd5, 0x7c, 0xc9, 0xa2, 0x0a, 0xda, + 0xfa, 0x95, 0x06, 0x55, 0x61, 0x27, 0x72, 0x0f, 0xaa, 0xfd, 0xc9, 0x59, 0x48, 0x16, 0xcc, 0xd1, + 0x5d, 0x80, 0xec, 0x15, 0xf2, 0xa1, 0x9c, 0x85, 0x66, 0x23, 0xde, 0x56, 0x66, 0x66, 0x74, 0x83, + 0x57, 0xb8, 0x37, 0xa1, 0xf1, 0x55, 0xe8, 0x05, 0x3b, 0x72, 0x3c, 0x48, 0x96, 0x9d, 0xe2, 0x15, + 0xfe, 0x8f, 0xc0, 0x18, 0x70, 0xe1, 0x7d, 0xaf, 0xb2, 0x62, 0x37, 0x57, 0x76, 0x4c, 0x7b, 0x65, + 0xeb, 0xcf, 0x3a, 0x54, 0xbf, 0x61, 0x71, 0x48, 0x3e, 0x84, 0xba, 0x9a, 0x5d, 0x90, 0xd2, 0x8c, + 0xa2, 0x8b, 0xe1, 0x66, 0x69, 0xa8, 0x81, 0xa7, 0x32, 0x54, 0x0e, 0x2b, 0x06, 0x2a, 0xdd, 0xab, + 0x42, 0x93, 0xbd, 0xb2, 0xa1, 0x3d, 0xd1, 0xc8, 0x07, 0x60, 0xc8, 0x77, 0xb8, 0xa4, 0x9b, 0xe5, + 0x8e, 0xc4, 0x5e, 0x79, 0xa2, 0x91, 0x87, 0xd0, 0x18, 0x9e, 0x85, 0xa9, 0xef, 0x0e, 0x59, 0x7c, + 0xc1, 0x48, 0x69, 0x8c, 0xd7, 0x2d, 0x7d, 0xdb, 0x2b, 0x64, 0x03, 0x40, 0x7a, 0xea, 0xb1, 0xe7, + 0x72, 0x52, 0x17, 0xb4, 0x83, 0x74, 0x26, 0x17, 0x2d, 0xb9, 0xb0, 0xe4, 0x2c, 0xbd, 0xd7, 0x9b, + 0x38, 0x3f, 0x81, 0xd6, 0x0e, 0x46, 0x8f, 0xc3, 0x78, 0xfb, 0x24, 0x8c, 0x13, 0xb2, 0x3c, 0xca, + 0xeb, 0x2e, 0x23, 0xec, 0x15, 0xf2, 0x04, 0xcc, 0x51, 0x7c, 0x29, 0xf9, 0xdf, 0x50, 0x51, 0xa5, + 0xd8, 0xef, 0x8a, 0x5b, 0x6e, 0xfd, 0x50, 0x01, 0xe3, 0xeb, 0x30, 0x3e, 0x67, 0x31, 0x79, 0x0c, + 0x06, 0xb6, 0x8e, 0xca, 0x15, 0xf2, 0x36, 0xf2, 0xaa, 0x8d, 0xee, 0x81, 0x85, 0x4a, 0x19, 0x39, + 0xfc, 0x5c, 0xaa, 0x1e, 0xff, 0x59, 0x93, 0x7a, 0x91, 0xf5, 0x08, 0xfa, 0xc0, 0xea, 0x30, 0x89, + 0x99, 0x33, 0xcb, 0xdb, 0xe5, 0x85, 0x7e, 0xae, 0x5b, 0x97, 0x2d, 0xdb, 0x50, 0x19, 0xe7, 0x11, + 0x54, 0x87, 0xf2, 0xa6, 0x82, 0xa9, 0xf8, 0xf7, 0xa1, 0xbb, 0x9a, 0x21, 0xf2, 0x95, 0xff, 0x05, + 0x0c, 0x59, 0x4a, 0xc8, 0x6b, 0x2e, 0xd4, 0x5a, 0xdd, 0x76, 0x19, 0xa5, 0x04, 0x6c, 0xa8, 0x1f, + 0xa5, 0xf1, 0x94, 0x8d, 0xf8, 0x92, 0xe5, 0x33, 0x1b, 0xd8, 0x2b, 0xe4, 0x11, 0x18, 0xf2, 0x71, + 0xca, 0x45, 0x17, 0x1e, 0xaa, 0xbc, 0x99, 0x7c, 0xeb, 0xa8, 0x68, 0x43, 0xa6, 0x28, 0xc9, 0xba, + 0x90, 0xae, 0xba, 0xaf, 0xa2, 0x50, 0x17, 0x6d, 0xca, 0x26, 0xcc, 0x2b, 0xe5, 0x70, 0x92, 0xdd, + 0x7f, 0xf9, 0xf1, 0x6c, 0x68, 0xe4, 0x0b, 0x68, 0x2d, 0xe4, 0x7b, 0x82, 0x69, 0xf1, 0xaa, 0x12, + 0x60, 0x59, 0xf8, 0x69, 0xfb, 0x37, 0x2f, 0xd7, 0xb4, 0x1f, 0x5e, 0xae, 0x69, 0xbf, 0x7f, 0xb9, + 0xa6, 0x7d, 0xff, 0x87, 0xb5, 0x95, 0x13, 0x03, 0xff, 0xbc, 0xfd, 0xe4, 0x6f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0x59, 0x16, 0x85, 0xb9, 0xd7, 0x1d, 0x00, 0x00, } diff --git a/worker/stream/doc.go b/stream/doc.go similarity index 100% rename from worker/stream/doc.go rename to stream/doc.go diff --git a/worker/stream/stream.go b/stream/stream.go similarity index 99% rename from worker/stream/stream.go rename to stream/stream.go index 1d2b33ecfc2..6fe6df8de5f 100644 --- a/worker/stream/stream.go +++ b/stream/stream.go @@ -30,7 +30,7 @@ import ( "golang.org/x/net/context" ) -const pageSize = 1 << 20 * 4 // 4MB +const pageSize = 4 << 20 // 4MB type kvStream interface { Send(*pb.KVS) error diff --git a/worker/stream/stream_test.go b/stream/stream_test.go similarity index 100% rename from worker/stream/stream_test.go rename to stream/stream_test.go diff --git a/worker/backup.go b/worker/backup.go index 49a948778ad..0b55a525254 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -28,79 +28,77 @@ import ( "golang.org/x/net/context" ) -func backupProcess(ctx context.Context, in *pb.BackupRequest) (*pb.BackupResponse, error) { - glog.Infof("Backup request: group %d at %d", in.GroupId, in.ReadTs) - resp := &pb.BackupResponse{Status: pb.BackupResponse_FAILED} +func backupProcess(ctx context.Context, req *pb.BackupRequest) error { + glog.Infof("Backup request: group %d at %d", req.GroupId, req.ReadTs) if err := ctx.Err(); err != nil { glog.Errorf("Context error during backup: %v\n", err) - resp.Message = err.Error() - return resp, err + return err } // sanity, make sure this is our group. - if groups().groupId() != in.GroupId { + if groups().groupId() != req.GroupId { err := x.Errorf("Backup request group mismatch. Mine: %d. Requested: %d\n", - groups().groupId(), in.GroupId) - resp.Message = err.Error() - return resp, err + groups().groupId(), req.GroupId) + return err } // wait for this node to catch-up. - if err := posting.Oracle().WaitForTs(ctx, in.ReadTs); err != nil { - resp.Message = err.Error() - return resp, err + if err := posting.Oracle().WaitForTs(ctx, req.ReadTs); err != nil { + return err } - // create backup worker and process this request - w := &backup.Worker{ - ReadTs: in.ReadTs, - GroupId: in.GroupId, - SeqTs: fmt.Sprint(time.Now().UTC().UnixNano()), - TargetURI: in.Target, + // create backup request and process it. + br := &backup.Request{ + ReadTs: req.ReadTs, + GroupId: req.GroupId, + UnixTs: fmt.Sprint(time.Now().UTC().UnixNano()), + TargetURI: req.Target, DB: pstore, } - if err := w.Process(ctx); err != nil { - resp.Message = err.Error() - return resp, err + if err := br.Process(ctx); err != nil { + return err } - resp.Status = pb.BackupResponse_SUCCESS - return resp, nil + return nil } // Backup handles a request coming from another node. -func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest, -) (*pb.BackupResponse, error) { - glog.Infof("Received backup request via Grpc: %+v", req) - return backupProcess(ctx, req) +func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.Status, error) { + var resp pb.Status + glog.V(3).Infof("Received backup request via Grpc: %+v", req) + if err := backupProcess(ctx, req); err != nil { + resp.Code = -1 + resp.Msg = err.Error() + return &resp, err + } + return &resp, nil } // TODO: add stop to all goroutines to cancel on failure. -func backupDispatch(ctx context.Context, readTs uint64, target string, gids []uint32, -) chan *pb.BackupResponse { - out := make(chan *pb.BackupResponse) +func backupDispatch(ctx context.Context, in *pb.BackupRequest, gids []uint32) chan error { + statusCh := make(chan error) go func() { glog.Infof("Dispatching backup requests...") for _, gid := range gids { - glog.V(3).Infof("Backup dispatched to group %d snapshot at %d", gid, readTs) - in := &pb.BackupRequest{ReadTs: readTs, GroupId: gid, Target: target} + glog.V(3).Infof("dispatching to group %d snapshot at %d", gid, in.ReadTs) + in := in + in.GroupId = gid // this node is part of the group, process backup. if groups().groupId() == gid { - resp, err := backupProcess(ctx, in) - if err != nil { - glog.Errorf("Error while running backup: %s", err) - } - out <- resp + statusCh <- backupProcess(ctx, in) continue } // send request to any node in the group. pl := groups().AnyServer(gid) - c := pb.NewWorkerClient(pl.Get()) - resp, err := c.Backup(ctx, in) + if pl == nil { + statusCh <- x.Errorf("Couldn't find a server in group %d", gid) + continue + } + _, err := pb.NewWorkerClient(pl.Get()).Backup(ctx, in) if err != nil { glog.Errorf("Backup error group %d: %s", gid, err) } - out <- resp + statusCh <- err } - close(out) + close(statusCh) }() - return out + return statusCh } // BackupOverNetwork handles a request coming from an HTTP client. @@ -113,7 +111,7 @@ func BackupOverNetwork(ctx context.Context, target string) error { // Get ReadTs from zero and wait for stream to catch up. ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) if err != nil { - glog.Errorf("Unable to retrieve readonly ts for backup: %s", err) + glog.Errorf("Unable to retrieve readonly timestamp for backup: %s", err) return err } readTs := ts.ReadOnly @@ -129,9 +127,11 @@ func BackupOverNetwork(ctx context.Context, target string) error { // This will dispatch the request to all groups and wait for their response. // If we receive any failures, we cancel the process. - for resp := range backupDispatch(ctx, readTs, target, gids) { - if resp.Status == pb.BackupResponse_FAILED { - return x.Errorf("Backup error: %s", resp.Message) + req := &pb.BackupRequest{ReadTs: readTs, Target: target} + for err := range backupDispatch(ctx, req, gids) { + if err != nil { + glog.Errorf("Error while running backup: %s", err) + return err } } glog.Infof("Backup done.") diff --git a/worker/draft.go b/worker/draft.go index 67cadb7635b..c5ee03624be 100644 --- a/worker/draft.go +++ b/worker/draft.go @@ -36,8 +36,8 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/raftwal" "github.com/dgraph-io/dgraph/schema" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/types" - "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" diff --git a/worker/export.go b/worker/export.go index 4453ef2875a..e61b0982e25 100644 --- a/worker/export.go +++ b/worker/export.go @@ -34,9 +34,9 @@ import ( "github.com/dgraph-io/badger" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/types" "github.com/dgraph-io/dgraph/types/facets" - "github.com/dgraph-io/dgraph/worker/stream" "github.com/dgraph-io/dgraph/x" ) diff --git a/worker/predicate.go b/worker/predicate.go index 5aae80014ff..6aea9261070 100644 --- a/worker/predicate.go +++ b/worker/predicate.go @@ -26,7 +26,7 @@ import ( "github.com/dgraph-io/dgraph/conn" "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" - ws "github.com/dgraph-io/dgraph/worker/stream" + ws "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/x" ) diff --git a/worker/predicate_move.go b/worker/predicate_move.go index ace31c9bf58..58c50f7f6da 100644 --- a/worker/predicate_move.go +++ b/worker/predicate_move.go @@ -32,7 +32,7 @@ import ( "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/schema" - "github.com/dgraph-io/dgraph/worker/stream" + "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/x" ) diff --git a/x/file.go b/x/file.go index ebea1e9fc4e..9f95061018b 100644 --- a/x/file.go +++ b/x/file.go @@ -17,6 +17,7 @@ package x import ( + "io" "os" ) @@ -37,3 +38,8 @@ func WriteFileSync(filename string, data []byte, perm os.FileMode) error { } return nil } + +// Writeq is a quiet write. Writes b to w and eats up the return. +func Writeq(w io.Writer, b []byte) { + _, _ = w.Write(b) +} From 2a317fbff7c604fba7e12c67aacd2cee475a29fc Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 31 Oct 2018 21:13:47 -0700 Subject: [PATCH 13/25] removed unused const. format fixes. --- ee/backup/backup.go | 1 + ee/backup/handler_file.go | 1 + ee/backup/handler_s3.go | 1 + ee/backup/writer.go | 2 +- worker/backup.go | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index 23093b7f630..f7ed71458ac 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -13,6 +13,7 @@ import ( "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/stream" "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" ) diff --git a/ee/backup/handler_file.go b/ee/backup/handler_file.go index b7d2eb79c6d..9481a802ecb 100644 --- a/ee/backup/handler_file.go +++ b/ee/backup/handler_file.go @@ -10,6 +10,7 @@ import ( "path/filepath" "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" ) diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index a5a691bc0ae..4216b1e8f48 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -13,6 +13,7 @@ import ( "strings" "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" minio "github.com/minio/minio-go" ) diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 716b12de245..43e56c94951 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -11,10 +11,10 @@ import ( "net/url" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/golang/glog" ) -const dgraphBackupTempPrefix = "dgraph-backup-*" const dgraphBackupSuffix = ".dgraph-backup" // writer handles the writes from stream.Orchestrate. It implements the kvStream interface. diff --git a/worker/backup.go b/worker/backup.go index 0b55a525254..cb21fb1665f 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -24,6 +24,7 @@ import ( "github.com/dgraph-io/dgraph/posting" "github.com/dgraph-io/dgraph/protos/pb" "github.com/dgraph-io/dgraph/x" + "github.com/golang/glog" "golang.org/x/net/context" ) From 2101284492137d40acc5455d1672872f480e4acf Mon Sep 17 00:00:00 2001 From: srfrog Date: Fri, 2 Nov 2018 17:23:48 -0700 Subject: [PATCH 14/25] saving state --- ee/backup/backup.go | 25 +- ee/backup/handler.go | 3 +- ee/backup/handler_file.go | 14 +- ee/backup/handler_s3.go | 99 +++---- ee/backup/session.go | 1 + ee/backup/writer.go | 34 ++- protos/pb.proto | 5 +- protos/pb/pb.pb.go | 549 +++++++++++++++++++++----------------- stream/stream.go | 7 +- worker/backup.go | 34 ++- x/file.go | 6 - 11 files changed, 424 insertions(+), 353 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index f7ed71458ac..f2ca6314ac2 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -19,24 +19,24 @@ import ( // Request has all the information needed to perform a backup. type Request struct { - ReadTs uint64 // Timestamp to read at. - GroupId uint32 // The group ID of this node. - UnixTs string // Sequence Ts to label the backup file(s) at the target. - TargetURI string // The intended location as URI. - DB *badger.DB // Badger pstore managed by this node. + DB *badger.DB // Badger pstore managed by this node. + Prefix string // target file name prefix + Sizex int64 // approximate upload size } // Process uses the request values to create a stream writer then hand off the data // retrieval to stream.Orchestrate. The writer will create all the fd's needed to // collect the data and later move to the target. // Returns errors on failure, nil on success. -func (r *Request) Process(ctx context.Context) error { - w, err := newWriter(r) +func (r *Request) Process(ctx context.Context, br *pb.BackupRequest) error { + w, err := newWriter(r, br.Target) if err != nil { return err } + sl := stream.Lists{Stream: w, DB: r.DB} - sl.ChooseKeyFunc = func(_ *badger.Item) bool { return true } + sl.ChooseKeyFunc = nil + // sl.ChooseKeyFunc = func(_ *badger.Item) bool { return true } sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() pk := x.Parse(key) @@ -60,15 +60,14 @@ func (r *Request) Process(ctx context.Context) error { return l.MarshalToKv() } - glog.V(3).Infof("Backup started ...") - if err = sl.Orchestrate(ctx, "Backup", r.ReadTs); err != nil { + glog.V(2).Infof("Backup started ...") + if err = sl.Orchestrate(ctx, "Backup", br.ReadTs); err != nil { return err } - glog.V(3).Infof("Backup finishing ...") - if err = w.close(); err != nil { + if err = w.cleanup(); err != nil { return err } - glog.Infof("Backup complete: group %d at %d", r.GroupId, r.ReadTs) + glog.Infof("Backup complete: group %d at %d", br.GroupId, br.ReadTs) return nil } diff --git a/ee/backup/handler.go b/ee/backup/handler.go index 3490ba905a0..777c0de2b41 100644 --- a/ee/backup/handler.go +++ b/ee/backup/handler.go @@ -19,6 +19,7 @@ type handler interface { // Session receives the host and path of the target. It should get all its configuration // from the environment. Open(*session) error + New() handler } // handlers map URI scheme to a handler. @@ -43,7 +44,7 @@ func getHandler(scheme string) (handler, error) { scheme = "file" } if h, ok := handlers.m[scheme]; ok { - return h, nil + return h.New(), nil } return nil, x.Errorf("Unsupported URI scheme %q", scheme) } diff --git a/ee/backup/handler_file.go b/ee/backup/handler_file.go index 9481a802ecb..3409a4e09b9 100644 --- a/ee/backup/handler_file.go +++ b/ee/backup/handler_file.go @@ -20,6 +20,11 @@ type fileHandler struct { fp *os.File } +// New creates a new instance of this handler. +func (h *fileHandler) New() handler { + return &fileHandler{} +} + // Open authenticates or prepares a handler session. // Returns error on failure, nil on success. func (h *fileHandler) Open(s *session) error { @@ -32,22 +37,17 @@ func (h *fileHandler) Open(s *session) error { if err != nil { return err } - glog.V(3).Infof("using file path: %q", path) + glog.V(2).Infof("using file path: %q", path) h.fp = fp h.session = s return nil } func (h *fileHandler) Close() error { - defer func() { - if err := h.fp.Close(); err != nil { - glog.Errorf("Failed to close file %q: %s", h.file, err) - } - }() if err := h.fp.Sync(); err != nil { return err } - return nil + return h.fp.Close() } func (h *fileHandler) Write(b []byte) (int, error) { diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index 4216b1e8f48..85696b9071e 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -9,8 +9,11 @@ import ( "bufio" "io" "os" + "path" "path/filepath" "strings" + "sync/atomic" + "time" "github.com/dgraph-io/dgraph/x" @@ -19,21 +22,26 @@ import ( ) const ( - bufSize = 1 << 20 - defaultS3Endpoint = "s3.amazonaws.com" + s3defaultEndpoint = "s3.amazonaws.com" + s3accelerateHost = "s3-accelerate" ) // s3Handler is used for 's3:' URI scheme. type s3Handler struct { - client *minio.Client - buf *bufio.Writer - pr io.ReadCloser - pw io.WriteCloser + w io.Writer + n uint64 } -func (h *s3Handler) Open(s *session) error { - var err error +// New creates a new instance of this handler. +func (h *s3Handler) New() handler { + return &s3Handler{} +} +// Open creates an AWS session and sends our data stream to an S3 blob. +// URI formats: +// s3:///bucket/folder1.../folderN?secure=true|false +// s3:///bucket/folder1.../folderN?secure=true|false (use default S3 endpoint) +func (h *s3Handler) Open(s *session) error { accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") if accessKeyID == "" || secretAccessKey == "" { @@ -42,17 +50,14 @@ func (h *s3Handler) Open(s *session) error { // s3:///bucket/folder if !strings.Contains(s.host, ".") { s.path = s.host - s.host = "" - } - // no host part, use default server - if s.host == "" { - s.host = defaultS3Endpoint + s.host = s3defaultEndpoint } - glog.V(3).Infof("using S3 host: %s", s.host) + glog.V(3).Infof("using S3 endpoint: %s", s.host) if len(s.path) < 1 { - return x.Errorf("The bucket name %q is invalid", s.path) + return x.Errorf("the S3 bucket %q is invalid", s.path) } + // split path into bucket and blob parts := strings.Split(s.path[1:], "/") s.path = parts[0] // bucket @@ -61,51 +66,55 @@ func (h *s3Handler) Open(s *session) error { // blob: folder1/...folderN/file1 s.file = filepath.Join(parts[1:]...) } - glog.V(3).Infof("sending to S3: bucket[%q] blob[%q]", s.path, s.file) + glog.V(3).Infof("sending to S3: %s", path.Join(s.host, s.path, s.file)) // secure by default secure := s.Getarg("secure") != "false" - h.client, err = minio.New(s.host, accessKeyID, secretAccessKey, secure) + c, err := minio.New(s.host, accessKeyID, secretAccessKey, secure) if err != nil { return err } + // S3 transfer acceleration support. + if strings.Contains(s.host, "s3-accelerate") { + c.SetS3TransferAccelerate(s.host) + } + c.TraceOn(os.Stderr) - h.pr, h.pw = io.Pipe() - h.buf = bufio.NewWriterSize(h.pw, bufSize) - - // block until done. - go func() { - for { - glog.V(3).Infof("--- blocking for pipe reader ...") - _, err := h.client.PutObject(s.path, s.file, h.pr, -1, - minio.PutObjectOptions{ContentType: "application/octet-stream"}) - if err != nil { - // TODO: need to send this back to caller - glog.Errorf("PutObject %s, %s: %v", s.path, s.file, err) - } - glog.V(3).Infof("--- done with pipe") - break - } - if err := h.pr.Close(); err != nil { - glog.V(3).Infof("failure closing pipe reader: %s", err) - } - }() + go h.send(c, s) return nil } -func (h *s3Handler) Write(b []byte) (int, error) { - return h.buf.Write(b) +func (h *s3Handler) send(c *minio.Client, s *session) { + glog.Infof("Backup streaming in background, est. %d bytes", s.size) + start := time.Now() + pr, pw := io.Pipe() + buf := bufio.NewWriterSize(pw, 5<<20) + h.w = buf + + // block until done or pipe closed. + for { + time.Sleep(10 * time.Millisecond) // wait for some buffered data + n, err := c.PutObject(s.path, s.file, pr, s.size, + minio.PutObjectOptions{}) + if err != nil { + glog.Errorf("Failure while uploading backup: %s", err) + } + glog.V(3).Infof("sent %d bytes, actual %d bytes, time elapsed %s", n, h.n, time.Since(start)) + break + } + pr.CloseWithError(nil) // EOF } func (h *s3Handler) Close() error { - defer func() { - if err := h.pw.Close(); err != nil { - glog.V(3).Infof("failure closing pipe writer: %s", err) - } - }() - return h.buf.Flush() + return nil +} + +func (h *s3Handler) Write(b []byte) (int, error) { + n, err := h.w.Write(b) + atomic.AddUint64(&h.n, uint64(n)) + return n, err } func init() { diff --git a/ee/backup/session.go b/ee/backup/session.go index ef22573fb9b..fe24b524def 100644 --- a/ee/backup/session.go +++ b/ee/backup/session.go @@ -9,6 +9,7 @@ package backup type session struct { host, path, file string args map[string][]string + size int64 } func (s *session) Getarg(key string) string { diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 43e56c94951..f76b90870c5 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -7,7 +7,6 @@ package backup import ( "encoding/binary" - "fmt" "net/url" "github.com/dgraph-io/dgraph/protos/pb" @@ -24,8 +23,10 @@ type writer struct { } // newWriter parses the requested target URI, finds a handler and then tries to create a session. -// Target URI format: +// Target URI formats: // [scheme]://[host]/[path]?[args] +// [scheme]:///[path]?[args] +// /[path]?[args] (only for local or NFS) // // Target URI parts: // scheme - service handler, one of: "s3", "gs", "az", "http", "file" @@ -33,14 +34,18 @@ type writer struct { // path - directory, bucket or container at target. ex: "/dgraph/backups/" // args - specific arguments that are ok to appear in logs. // +// Global args (might not be support by all handlers): +// secure - true|false turn on/off TLS. +// compress - true|false turn on/off data compression. +// // Examples: -// s3://dgraph.s3.amazonaws.com/dgraph/backups?useSSL=1 +// s3://dgraph.s3.amazonaws.com/dgraph/backups?secure=true // gs://dgraph/backups/ // as://dgraph-container/backups/ // http://backups.dgraph.io/upload -// file:///tmp/dgraph/backups or /tmp/dgraph/backups -func newWriter(r *Request) (*writer, error) { - u, err := url.Parse(r.TargetURI) +// file:///tmp/dgraph/backups or /tmp/dgraph/backups?compress=gzip +func newWriter(r *Request, uri string) (*writer, error) { + u, err := url.Parse(uri) if err != nil { return nil, err } @@ -49,19 +54,24 @@ func newWriter(r *Request) (*writer, error) { if err != nil { return nil, err } - f := fmt.Sprintf("%s-g%d-r%d%s", r.UnixTs, r.GroupId, r.ReadTs, dgraphBackupSuffix) - glog.V(3).Infof("target file: %q", f) // create session at - sess := &session{host: u.Host, path: u.Path, file: f, args: u.Query()} + sess := &session{ + host: u.Host, + path: u.Path, + file: r.Prefix + dgraphBackupSuffix, + args: u.Query(), + size: r.Sizex, + } if err := h.Open(sess); err != nil { return nil, err } - return &writer{h: h, file: f}, nil + return &writer{h: h, file: sess.file}, nil } -func (w *writer) close() error { +func (w *writer) cleanup() error { + glog.V(2).Infof("Backup cleanup ...") return w.h.Close() } @@ -80,7 +90,7 @@ func (w *writer) write(kv *pb.KV) error { } // Send implements the stream.kvStream interface. -// It writes the received KV the target as a delimited binary chain. +// It writes the received KV to the target as a delimited binary chain. // Returns error if the writing fails, nil on success. func (w *writer) Send(kvs *pb.KVS) error { var err error diff --git a/protos/pb.proto b/protos/pb.proto index 5d464c6d0d8..21dd6a999d9 100644 --- a/protos/pb.proto +++ b/protos/pb.proto @@ -452,9 +452,10 @@ message Status { } message BackupRequest { - uint64 read_ts = 1; + uint64 read_ts = 1; uint32 group_id = 2; - string target = 3; + string unix_ts = 3; + string target = 4; } // vim: noexpandtab sw=2 ts=2 diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 96cd6951c11..b391644e59a 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{17, 0} + return fileDescriptor_pb_1ecc3f7168766641, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{24, 0} + return fileDescriptor_pb_1ecc3f7168766641, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{24, 1} + return fileDescriptor_pb_1ecc3f7168766641, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{34, 0} + return fileDescriptor_pb_1ecc3f7168766641, []int{34, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{37, 0} + return fileDescriptor_pb_1ecc3f7168766641, []int{37, 0} } type List struct { @@ -193,7 +193,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{0} + return fileDescriptor_pb_1ecc3f7168766641, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +241,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{1} + return fileDescriptor_pb_1ecc3f7168766641, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +297,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{2} + return fileDescriptor_pb_1ecc3f7168766641, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +370,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{3} + return fileDescriptor_pb_1ecc3f7168766641, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +487,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{4} + return fileDescriptor_pb_1ecc3f7168766641, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +534,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{5} + return fileDescriptor_pb_1ecc3f7168766641, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +587,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{6} + return fileDescriptor_pb_1ecc3f7168766641, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{7} + return fileDescriptor_pb_1ecc3f7168766641, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +743,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{8} + return fileDescriptor_pb_1ecc3f7168766641, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +818,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{9} + return fileDescriptor_pb_1ecc3f7168766641, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +868,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{10} + return fileDescriptor_pb_1ecc3f7168766641, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +945,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{11} + return fileDescriptor_pb_1ecc3f7168766641, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1035,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{12} + return fileDescriptor_pb_1ecc3f7168766641, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1096,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{13} + return fileDescriptor_pb_1ecc3f7168766641, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1202,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{14} + return fileDescriptor_pb_1ecc3f7168766641, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1300,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{15} + return fileDescriptor_pb_1ecc3f7168766641, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1366,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{16} + return fileDescriptor_pb_1ecc3f7168766641, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1456,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{17} + return fileDescriptor_pb_1ecc3f7168766641, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1564,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{18} + return fileDescriptor_pb_1ecc3f7168766641, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1646,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{19} + return fileDescriptor_pb_1ecc3f7168766641, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1697,7 +1697,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{20} + return fileDescriptor_pb_1ecc3f7168766641, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1771,7 +1771,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{21} + return fileDescriptor_pb_1ecc3f7168766641, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,7 +1862,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{22} + return fileDescriptor_pb_1ecc3f7168766641, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1919,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{23} + return fileDescriptor_pb_1ecc3f7168766641, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1998,7 +1998,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{24} + return fileDescriptor_pb_1ecc3f7168766641, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2111,7 +2111,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{25} + return fileDescriptor_pb_1ecc3f7168766641, []int{25} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2180,7 +2180,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{26} + return fileDescriptor_pb_1ecc3f7168766641, []int{26} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2235,7 +2235,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{27} + return fileDescriptor_pb_1ecc3f7168766641, []int{27} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2289,7 +2289,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{28} + return fileDescriptor_pb_1ecc3f7168766641, []int{28} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2336,7 +2336,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{29} + return fileDescriptor_pb_1ecc3f7168766641, []int{29} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2385,7 +2385,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{30} + return fileDescriptor_pb_1ecc3f7168766641, []int{30} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2449,7 +2449,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{31} + return fileDescriptor_pb_1ecc3f7168766641, []int{31} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2514,7 +2514,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{32} + return fileDescriptor_pb_1ecc3f7168766641, []int{32} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2575,7 +2575,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{33} + return fileDescriptor_pb_1ecc3f7168766641, []int{33} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2629,7 +2629,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{34} + return fileDescriptor_pb_1ecc3f7168766641, []int{34} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2729,7 +2729,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{35} + return fileDescriptor_pb_1ecc3f7168766641, []int{35} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2793,7 +2793,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{36} + return fileDescriptor_pb_1ecc3f7168766641, []int{36} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2867,7 +2867,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{37} + return fileDescriptor_pb_1ecc3f7168766641, []int{37} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2936,7 +2936,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{38} + return fileDescriptor_pb_1ecc3f7168766641, []int{38} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2991,7 +2991,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{39} + return fileDescriptor_pb_1ecc3f7168766641, []int{39} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3045,7 +3045,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{40} + return fileDescriptor_pb_1ecc3f7168766641, []int{40} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3092,7 +3092,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{41} + return fileDescriptor_pb_1ecc3f7168766641, []int{41} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3140,7 +3140,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{42} + return fileDescriptor_pb_1ecc3f7168766641, []int{42} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3195,7 +3195,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{43} + return fileDescriptor_pb_1ecc3f7168766641, []int{43} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3252,7 +3252,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{44} + return fileDescriptor_pb_1ecc3f7168766641, []int{44} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3314,7 +3314,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{45} + return fileDescriptor_pb_1ecc3f7168766641, []int{45} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3371,7 @@ func (m *Status) Reset() { *m = Status{} } func (m *Status) String() string { return proto.CompactTextString(m) } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{46} + return fileDescriptor_pb_1ecc3f7168766641, []int{46} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3417,7 +3417,8 @@ func (m *Status) GetMsg() string { type BackupRequest struct { ReadTs uint64 `protobuf:"varint,1,opt,name=read_ts,json=readTs,proto3" json:"read_ts,omitempty"` GroupId uint32 `protobuf:"varint,2,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` + UnixTs string `protobuf:"bytes,3,opt,name=unix_ts,json=unixTs,proto3" json:"unix_ts,omitempty"` + Target string `protobuf:"bytes,4,opt,name=target,proto3" json:"target,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3427,7 +3428,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_038c2d1314fe6088, []int{47} + return fileDescriptor_pb_1ecc3f7168766641, []int{47} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3470,6 +3471,13 @@ func (m *BackupRequest) GetGroupId() uint32 { return 0 } +func (m *BackupRequest) GetUnixTs() string { + if m != nil { + return m.UnixTs + } + return "" +} + func (m *BackupRequest) GetTarget() string { if m != nil { return m.Target @@ -6978,9 +6986,15 @@ func (m *BackupRequest) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintPb(dAtA, i, uint64(m.GroupId)) } - if len(m.Target) > 0 { + if len(m.UnixTs) > 0 { dAtA[i] = 0x1a i++ + i = encodeVarintPb(dAtA, i, uint64(len(m.UnixTs))) + i += copy(dAtA[i:], m.UnixTs) + } + if len(m.Target) > 0 { + dAtA[i] = 0x22 + i++ i = encodeVarintPb(dAtA, i, uint64(len(m.Target))) i += copy(dAtA[i:], m.Target) } @@ -8284,6 +8298,10 @@ func (m *BackupRequest) Size() (n int) { if m.GroupId != 0 { n += 1 + sovPb(uint64(m.GroupId)) } + l = len(m.UnixTs) + if l > 0 { + n += 1 + l + sovPb(uint64(l)) + } l = len(m.Target) if l > 0 { n += 1 + l + sovPb(uint64(l)) @@ -15494,6 +15512,35 @@ func (m *BackupRequest) Unmarshal(dAtA []byte) error { } } case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UnixTs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPb + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthPb + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UnixTs = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) } @@ -15649,204 +15696,204 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_038c2d1314fe6088) } +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_1ecc3f7168766641) } -var fileDescriptor_pb_038c2d1314fe6088 = []byte{ - // 3130 bytes of a gzipped FileDescriptorProto +var fileDescriptor_pb_1ecc3f7168766641 = []byte{ + // 3135 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x72, 0xe3, 0xd6, 0x95, 0x02, 0x48, 0x82, 0xc0, 0x21, 0xa9, 0xa6, 0xaf, 0x7b, 0xda, 0x34, 0xed, 0x51, 0xcb, 0x70, 0x3f, 0xd4, 0x6d, 0x5b, 0xd3, 0x96, 0x3d, 0xe5, 0xc7, 0x4e, 0x2d, 0x52, 0x5d, 0x74, 0xeb, 0x35, - 0x97, 0x54, 0x7b, 0xc6, 0x53, 0x65, 0x16, 0x44, 0x5c, 0x51, 0x18, 0x81, 0x00, 0x06, 0x17, 0x50, - 0x51, 0x5e, 0x4c, 0xd5, 0x6c, 0xe6, 0x1b, 0xbc, 0x9a, 0x45, 0x96, 0xc9, 0x0f, 0x24, 0x1f, 0x90, - 0xaa, 0x54, 0x56, 0xde, 0x66, 0x97, 0xea, 0xac, 0xb2, 0x4e, 0xa5, 0xb2, 0xc8, 0x26, 0x75, 0xcf, - 0xbd, 0x78, 0x90, 0x2d, 0xa9, 0xed, 0x54, 0x65, 0x45, 0x9c, 0xd7, 0x7d, 0x9c, 0x73, 0xee, 0x79, - 0x11, 0xcc, 0xe8, 0x64, 0x33, 0x8a, 0xc3, 0x24, 0x24, 0x7a, 0x74, 0xd2, 0xb5, 0x9c, 0xc8, 0x93, - 0xa0, 0xdd, 0x85, 0xea, 0x9e, 0xc7, 0x13, 0x42, 0xa0, 0x9a, 0x7a, 0x2e, 0xef, 0x68, 0xeb, 0x95, - 0x0d, 0x83, 0xe2, 0xb7, 0xbd, 0x0f, 0xd6, 0xc8, 0xe1, 0xe7, 0x2f, 0x1c, 0x3f, 0x65, 0xa4, 0x0d, - 0x95, 0x0b, 0xc7, 0xef, 0x68, 0xeb, 0xda, 0x46, 0x93, 0x8a, 0x4f, 0xb2, 0x09, 0xe6, 0x85, 0xe3, - 0x8f, 0x93, 0xcb, 0x88, 0x75, 0xf4, 0x75, 0x6d, 0x63, 0x75, 0xeb, 0xcd, 0xcd, 0xe8, 0x64, 0xf3, - 0x28, 0xe4, 0x89, 0x17, 0x4c, 0x37, 0x5f, 0x38, 0xfe, 0xe8, 0x32, 0x62, 0xb4, 0x7e, 0x21, 0x3f, - 0xec, 0x43, 0x68, 0x0c, 0xe3, 0xc9, 0x6e, 0x1a, 0x4c, 0x12, 0x2f, 0x0c, 0xc4, 0x8e, 0x81, 0x33, - 0x63, 0xb8, 0xa2, 0x45, 0xf1, 0x5b, 0xe0, 0x9c, 0x78, 0xca, 0x3b, 0x95, 0xf5, 0x8a, 0xc0, 0x89, - 0x6f, 0xd2, 0x81, 0xba, 0xc7, 0x77, 0xc2, 0x34, 0x48, 0x3a, 0xd5, 0x75, 0x6d, 0xc3, 0xa4, 0x19, - 0x68, 0xff, 0x49, 0x87, 0xda, 0xbf, 0xa5, 0x2c, 0xbe, 0x44, 0xb9, 0x24, 0x89, 0xb3, 0xb5, 0xc4, - 0x37, 0xb9, 0x0d, 0x35, 0xdf, 0x09, 0xa6, 0xbc, 0xa3, 0xe3, 0x62, 0x12, 0x20, 0xef, 0x80, 0xe5, - 0x9c, 0x26, 0x2c, 0x1e, 0xa7, 0x9e, 0xdb, 0xa9, 0xac, 0x6b, 0x1b, 0x06, 0x35, 0x11, 0x71, 0xec, - 0xb9, 0xe4, 0x6d, 0x30, 0xdd, 0x70, 0x3c, 0x29, 0xef, 0xe5, 0x86, 0xb8, 0x17, 0x79, 0x1f, 0xcc, - 0xd4, 0x73, 0xc7, 0xbe, 0xc7, 0x93, 0x4e, 0x6d, 0x5d, 0xdb, 0x68, 0x6c, 0x99, 0xe2, 0xb2, 0x42, - 0x77, 0xb4, 0x9e, 0x7a, 0x2e, 0x2a, 0xf1, 0x31, 0x98, 0x3c, 0x9e, 0x8c, 0x4f, 0xd3, 0x60, 0xd2, - 0x31, 0x90, 0xe9, 0x96, 0x60, 0x2a, 0xdd, 0x9a, 0xd6, 0xb9, 0x04, 0xc4, 0xb5, 0x62, 0x76, 0xc1, - 0x62, 0xce, 0x3a, 0x75, 0xb9, 0x95, 0x02, 0xc9, 0x13, 0x68, 0x9c, 0x3a, 0x13, 0x96, 0x8c, 0x23, - 0x27, 0x76, 0x66, 0x1d, 0xb3, 0x58, 0x68, 0x57, 0xa0, 0x8f, 0x04, 0x96, 0x53, 0x38, 0xcd, 0x01, - 0xf2, 0x09, 0xb4, 0x10, 0xe2, 0xe3, 0x53, 0xcf, 0x4f, 0x58, 0xdc, 0xb1, 0x50, 0x66, 0x15, 0x65, - 0x10, 0x33, 0x8a, 0x19, 0xa3, 0x4d, 0xc9, 0x24, 0x31, 0xe4, 0x9f, 0x01, 0xd8, 0x3c, 0x72, 0x02, - 0x77, 0xec, 0xf8, 0x7e, 0x07, 0xf0, 0x0c, 0x96, 0xc4, 0x6c, 0xfb, 0x3e, 0x79, 0x4b, 0x9c, 0xcf, - 0x71, 0xc7, 0x09, 0xef, 0xb4, 0xd6, 0xb5, 0x8d, 0x2a, 0x35, 0x04, 0x38, 0xe2, 0xf6, 0x16, 0x58, - 0xe8, 0x11, 0x78, 0xe3, 0xfb, 0x60, 0x5c, 0x08, 0x40, 0x3a, 0x4e, 0x63, 0xab, 0x25, 0xb6, 0xcc, - 0x9d, 0x86, 0x2a, 0xa2, 0xbd, 0x06, 0xe6, 0x9e, 0x13, 0x4c, 0x33, 0x4f, 0x13, 0xa6, 0x40, 0x01, - 0x8b, 0xe2, 0xb7, 0xfd, 0xbd, 0x0e, 0x06, 0x65, 0x3c, 0xf5, 0x13, 0xf2, 0x10, 0x40, 0x28, 0x7a, - 0xe6, 0x24, 0xb1, 0x37, 0x57, 0xab, 0x16, 0xaa, 0xb6, 0x52, 0xcf, 0xdd, 0x47, 0x12, 0x79, 0x02, - 0x4d, 0x5c, 0x3d, 0x63, 0xd5, 0x8b, 0x03, 0xe4, 0xe7, 0xa3, 0x0d, 0x64, 0x51, 0x12, 0x77, 0xc0, - 0x40, 0xdb, 0x4a, 0xff, 0x6a, 0x51, 0x05, 0x91, 0xfb, 0xb0, 0xea, 0x05, 0x89, 0xd0, 0xfd, 0x24, - 0x19, 0xbb, 0x8c, 0x67, 0xc6, 0x6f, 0xe5, 0xd8, 0x1e, 0xe3, 0x09, 0xf9, 0x18, 0xa4, 0x02, 0xb3, - 0x0d, 0x6b, 0xb8, 0xe1, 0x6a, 0x6e, 0x18, 0x2e, 0x77, 0x44, 0x1e, 0xb5, 0xe3, 0x47, 0xd0, 0x10, - 0xf7, 0xcb, 0x24, 0x0c, 0x94, 0x68, 0xe2, 0x6d, 0x94, 0x3a, 0x28, 0x08, 0x06, 0xc5, 0x2e, 0x54, - 0x23, 0x1c, 0x4c, 0x3a, 0x04, 0x7e, 0xdb, 0x7d, 0xa8, 0x1d, 0xc6, 0x2e, 0x8b, 0xaf, 0xf4, 0x71, - 0x02, 0x55, 0x97, 0xf1, 0x09, 0x3e, 0x3f, 0x93, 0xe2, 0x77, 0xe1, 0xf7, 0x95, 0x92, 0xdf, 0xdb, - 0xff, 0xaf, 0x41, 0x63, 0x18, 0xc6, 0xc9, 0x3e, 0xe3, 0xdc, 0x99, 0x32, 0x72, 0x17, 0x6a, 0xa1, - 0x58, 0x56, 0x69, 0xd8, 0x12, 0x67, 0xc2, 0x7d, 0xa8, 0xc4, 0x2f, 0xd9, 0x41, 0xbf, 0xde, 0x0e, - 0xb7, 0xa1, 0x26, 0x5f, 0x8c, 0x78, 0x4d, 0x35, 0x2a, 0x01, 0xa1, 0xeb, 0xf0, 0xf4, 0x94, 0x33, - 0xa9, 0xcb, 0x1a, 0x55, 0xd0, 0xf5, 0x6e, 0xf5, 0xaf, 0x00, 0xe2, 0x7c, 0x3f, 0xd1, 0x0b, 0xec, - 0x33, 0x68, 0x50, 0xe7, 0x34, 0xd9, 0x09, 0x83, 0x84, 0xcd, 0x13, 0xb2, 0x0a, 0xba, 0xe7, 0xa2, - 0x8a, 0x0c, 0xaa, 0x7b, 0xae, 0x38, 0xdc, 0x34, 0x0e, 0xd3, 0x08, 0x35, 0xd4, 0xa2, 0x12, 0x40, - 0x55, 0xba, 0x6e, 0x8c, 0x27, 0x16, 0xaa, 0x74, 0xdd, 0x98, 0xdc, 0x85, 0x06, 0x0f, 0x9c, 0x88, - 0x9f, 0x85, 0x89, 0x38, 0x5c, 0x15, 0x0f, 0x07, 0x19, 0x6a, 0xc4, 0xed, 0x5f, 0x6b, 0x60, 0xec, - 0xb3, 0xd9, 0x09, 0x8b, 0x5f, 0xd9, 0xe5, 0x6d, 0x30, 0x71, 0xe1, 0xb1, 0xe7, 0xaa, 0x8d, 0xea, - 0x08, 0x0f, 0xdc, 0x2b, 0xb7, 0xba, 0x03, 0x86, 0xcf, 0x1c, 0xa1, 0x7c, 0xe9, 0x67, 0x0a, 0x12, - 0xba, 0x71, 0x66, 0x63, 0x97, 0x39, 0x2e, 0x86, 0x18, 0x93, 0x1a, 0xce, 0xac, 0xc7, 0x1c, 0x57, - 0x9c, 0xcd, 0x77, 0x78, 0x32, 0x4e, 0x23, 0xd7, 0x49, 0x18, 0x86, 0x96, 0xaa, 0x70, 0x1c, 0x9e, - 0x1c, 0x23, 0x86, 0x3c, 0x86, 0x37, 0x26, 0x7e, 0xca, 0x45, 0x5c, 0xf3, 0x82, 0xd3, 0x70, 0x1c, - 0x06, 0xfe, 0x25, 0xea, 0xd7, 0xa4, 0xb7, 0x14, 0x61, 0x10, 0x9c, 0x86, 0x87, 0x81, 0x7f, 0x69, - 0xff, 0x55, 0x83, 0xda, 0x33, 0x54, 0xc3, 0x13, 0xa8, 0xcf, 0xf0, 0x42, 0xd9, 0xeb, 0xbd, 0x23, - 0x34, 0x8c, 0xb4, 0x4d, 0x79, 0x53, 0xde, 0x0f, 0x92, 0xf8, 0x92, 0x66, 0x6c, 0x42, 0x22, 0x71, - 0x4e, 0x7c, 0x96, 0x70, 0xe5, 0x11, 0x25, 0x89, 0x91, 0x24, 0x28, 0x09, 0xc5, 0xd6, 0xdd, 0x85, - 0x66, 0x79, 0x29, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4a, 0xc5, 0x27, 0x59, 0x87, 0x1a, - 0x3e, 0x52, 0xd4, 0x5c, 0x63, 0x0b, 0xc4, 0x8a, 0x52, 0x84, 0x4a, 0xc2, 0x97, 0xfa, 0xe7, 0x9a, - 0x58, 0xa7, 0xbc, 0x41, 0x79, 0x1d, 0xeb, 0xfa, 0x75, 0xa4, 0x48, 0x69, 0x1d, 0xfb, 0x2f, 0x1a, - 0x34, 0xbf, 0x61, 0x71, 0x78, 0x14, 0x87, 0x51, 0xc8, 0x1d, 0x9f, 0xd8, 0x60, 0xc8, 0xdb, 0x5d, - 0xb1, 0xbf, 0xa2, 0x08, 0x1e, 0x79, 0x1f, 0x34, 0xe3, 0xe2, 0xda, 0x8a, 0x42, 0xd6, 0x00, 0x66, - 0xce, 0x7c, 0x8f, 0x39, 0x9c, 0x0d, 0xdc, 0xcc, 0x7d, 0x0a, 0x0c, 0xe9, 0x82, 0x39, 0x73, 0xe6, - 0xa3, 0x79, 0x30, 0xe2, 0x68, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x2e, 0x58, 0x33, 0x67, 0x2e, 0xfc, - 0x78, 0xe0, 0x2a, 0xeb, 0x16, 0x08, 0xf2, 0x1e, 0x54, 0x92, 0x79, 0x80, 0x41, 0x41, 0xe4, 0x01, - 0x91, 0xbb, 0x47, 0xf3, 0x40, 0x79, 0x3c, 0x15, 0xb4, 0x4c, 0x1b, 0x66, 0xa1, 0x8d, 0x36, 0x54, - 0x26, 0x9e, 0x8b, 0x89, 0xc0, 0xa2, 0xe2, 0xd3, 0xfe, 0x65, 0x05, 0x6e, 0x29, 0x53, 0x9c, 0x79, - 0xd1, 0x30, 0x11, 0x7e, 0xd3, 0x81, 0x3a, 0x3e, 0x57, 0x16, 0x2b, 0x8b, 0x64, 0x20, 0xf9, 0x0c, - 0x0c, 0x74, 0xe1, 0xcc, 0xd0, 0x77, 0x0b, 0xb5, 0xe4, 0xe2, 0xd2, 0xf0, 0xca, 0xe2, 0x8a, 0x9d, - 0x7c, 0x0a, 0xb5, 0xef, 0x58, 0x1c, 0xca, 0xf0, 0xd3, 0xd8, 0x5a, 0xbb, 0x4a, 0x4e, 0x18, 0x40, - 0x89, 0x49, 0xe6, 0x7f, 0xa0, 0xf6, 0xee, 0x89, 0x80, 0x33, 0x0b, 0x2f, 0x98, 0xdb, 0xa9, 0xe3, - 0x89, 0xca, 0x06, 0xce, 0x48, 0x99, 0xba, 0xcc, 0x5c, 0x5d, 0xdd, 0x1e, 0x34, 0x4a, 0xd7, 0x2b, - 0xfb, 0x5b, 0x4b, 0x6a, 0xf8, 0xee, 0xa2, 0xbf, 0x59, 0xf9, 0x4b, 0x28, 0xbb, 0x6d, 0x0f, 0xa0, - 0xb8, 0xec, 0xdf, 0xeb, 0xfc, 0xf6, 0xff, 0x6a, 0x70, 0x6b, 0x27, 0x0c, 0x02, 0x86, 0x35, 0x84, - 0x34, 0x5d, 0xe1, 0xb7, 0xda, 0xb5, 0x7e, 0xfb, 0x08, 0x6a, 0x5c, 0x30, 0xab, 0xd5, 0xdf, 0xbc, - 0xc2, 0x16, 0x54, 0x72, 0x88, 0x10, 0x33, 0x73, 0xe6, 0xe3, 0x88, 0x05, 0xae, 0x17, 0x4c, 0xd1, - 0xcf, 0xa5, 0x05, 0x8e, 0x24, 0xc6, 0xfe, 0x99, 0x06, 0x86, 0x74, 0xf9, 0x85, 0x70, 0xa7, 0x2d, - 0x86, 0xbb, 0x77, 0xc1, 0x8a, 0x62, 0xe6, 0x7a, 0x93, 0x6c, 0x57, 0x8b, 0x16, 0x08, 0x11, 0x8d, - 0x4f, 0xc3, 0x78, 0xc2, 0x70, 0x79, 0x93, 0x4a, 0x40, 0x94, 0x64, 0x98, 0x12, 0x30, 0x68, 0xc9, - 0x88, 0x68, 0x0a, 0x84, 0x88, 0x56, 0x42, 0x84, 0x47, 0xce, 0x44, 0x16, 0x49, 0x15, 0x2a, 0x01, - 0x11, 0x41, 0xa5, 0xe5, 0xd0, 0x62, 0x26, 0x55, 0x90, 0xfd, 0x73, 0x1d, 0x9a, 0x3d, 0x2f, 0x66, - 0x93, 0x84, 0xb9, 0x7d, 0x77, 0x8a, 0x8c, 0x2c, 0x48, 0xbc, 0xe4, 0x52, 0x45, 0x6b, 0x05, 0xe5, - 0xc9, 0x54, 0x5f, 0x2c, 0x18, 0xa5, 0x2d, 0x2a, 0x58, 0xe3, 0x4a, 0x80, 0x6c, 0x01, 0xc8, 0x32, - 0x03, 0xeb, 0xdc, 0xea, 0xf5, 0x75, 0xae, 0x85, 0x6c, 0xe2, 0x53, 0x28, 0x48, 0xca, 0x78, 0x32, - 0x92, 0x1b, 0x58, 0x04, 0xa7, 0xc2, 0x91, 0x31, 0x3b, 0x9f, 0x30, 0x1f, 0x1d, 0x15, 0xb3, 0xf3, - 0x09, 0xf3, 0xf3, 0x9a, 0xa8, 0x2e, 0x8f, 0x23, 0xbe, 0xc9, 0xfb, 0xa0, 0x87, 0x11, 0xde, 0x4f, - 0x6d, 0x58, 0xbe, 0xd8, 0xe6, 0x61, 0x44, 0xf5, 0x30, 0x12, 0x5e, 0x20, 0x8b, 0xba, 0x8e, 0xa5, - 0x9c, 0x5b, 0x84, 0x07, 0x2c, 0x47, 0xa8, 0xa2, 0xd8, 0x77, 0x40, 0x3f, 0x8c, 0x48, 0x1d, 0x2a, - 0xc3, 0xfe, 0xa8, 0xbd, 0x22, 0x3e, 0x7a, 0xfd, 0xbd, 0xb6, 0x66, 0xbf, 0xd4, 0xc0, 0xda, 0x4f, - 0x13, 0x47, 0xf8, 0x14, 0xbf, 0xc9, 0xa8, 0x6f, 0x83, 0xc9, 0x13, 0x27, 0xc6, 0xbc, 0xa8, 0xcb, - 0x30, 0x81, 0xf0, 0x88, 0x93, 0x07, 0x50, 0x63, 0xee, 0x94, 0x65, 0xaf, 0xbd, 0xbd, 0x7c, 0x4e, - 0x2a, 0xc9, 0x64, 0x03, 0x0c, 0x3e, 0x39, 0x63, 0x33, 0xa7, 0x53, 0x2d, 0x18, 0x87, 0x88, 0x91, - 0x29, 0x8c, 0x2a, 0x3a, 0xd6, 0xe0, 0x71, 0x18, 0x61, 0x51, 0x5a, 0x53, 0x35, 0x78, 0x1c, 0x46, - 0xa2, 0x24, 0xdd, 0x82, 0x7f, 0xf2, 0xa6, 0x41, 0x18, 0xb3, 0xb1, 0x17, 0xb8, 0x6c, 0x3e, 0x9e, - 0x84, 0xc1, 0xa9, 0xef, 0x4d, 0x12, 0xd4, 0xa5, 0x49, 0xdf, 0x94, 0xc4, 0x81, 0xa0, 0xed, 0x28, - 0x92, 0xfd, 0x3e, 0x58, 0xcf, 0xd9, 0x25, 0x16, 0x84, 0x9c, 0xdc, 0x01, 0xfd, 0xfc, 0x42, 0xe5, - 0x3a, 0x43, 0x9c, 0xe0, 0xf9, 0x0b, 0xaa, 0x9f, 0x5f, 0xd8, 0x73, 0x30, 0x87, 0x2a, 0xd1, 0x93, - 0x47, 0x22, 0x24, 0x62, 0x68, 0x55, 0x0f, 0x0b, 0x2b, 0xef, 0x52, 0x8d, 0x41, 0x33, 0xba, 0xb0, - 0x25, 0x1e, 0x44, 0x29, 0x45, 0x02, 0xe5, 0x0a, 0xa7, 0x52, 0xae, 0x70, 0xb0, 0x58, 0x0b, 0x03, - 0xa6, 0x5c, 0x1c, 0xbf, 0xed, 0xff, 0xd3, 0xc1, 0xcc, 0x53, 0xd1, 0x07, 0x60, 0xcd, 0x32, 0x7b, - 0xa8, 0x27, 0x8b, 0xe5, 0x6c, 0x6e, 0x24, 0x5a, 0xd0, 0xd5, 0x5d, 0xaa, 0xcb, 0x77, 0x29, 0xde, - 0x7c, 0xed, 0xb5, 0x6f, 0xfe, 0x21, 0xdc, 0x9a, 0xf8, 0xcc, 0x09, 0xc6, 0xc5, 0x93, 0x95, 0x5e, - 0xb9, 0x8a, 0xe8, 0xa3, 0xfc, 0xdd, 0xaa, 0xb8, 0x55, 0x2f, 0xd2, 0xcb, 0x7d, 0xa8, 0xb9, 0xcc, - 0x4f, 0x9c, 0x72, 0x77, 0x72, 0x18, 0x3b, 0x13, 0x9f, 0xf5, 0x04, 0x9a, 0x4a, 0x2a, 0xd9, 0x00, - 0x33, 0xab, 0xa0, 0x54, 0x4f, 0x82, 0xc5, 0x6f, 0xa6, 0x6c, 0x9a, 0x53, 0xed, 0x8f, 0xa1, 0xf2, - 0xfc, 0xc5, 0xf0, 0x3a, 0x0b, 0xe5, 0xba, 0xd3, 0x4b, 0xba, 0xfb, 0x16, 0xf4, 0xe7, 0x2f, 0xca, - 0x31, 0xb5, 0x99, 0xa7, 0x3e, 0xd1, 0xa9, 0xea, 0x45, 0xa7, 0xda, 0x05, 0x33, 0xe5, 0x2c, 0xde, - 0x67, 0x89, 0xa3, 0x1e, 0x77, 0x0e, 0x8b, 0x14, 0x28, 0xda, 0x2e, 0x2f, 0x0c, 0x54, 0xda, 0xc9, - 0x40, 0xfb, 0x8f, 0x15, 0xa8, 0xab, 0x47, 0x2e, 0xd6, 0x4c, 0xf3, 0x92, 0x4f, 0x7c, 0x16, 0xd1, - 0x42, 0x2f, 0x47, 0x8b, 0x72, 0x4f, 0x5c, 0x79, 0x7d, 0x4f, 0x4c, 0xbe, 0x84, 0x66, 0x24, 0x69, - 0xe5, 0xf8, 0xf2, 0x56, 0x59, 0x46, 0xfd, 0xa2, 0x5c, 0x23, 0x2a, 0x00, 0xf1, 0x52, 0xb0, 0xb9, - 0x48, 0x9c, 0x29, 0x1a, 0xbb, 0x49, 0xeb, 0x02, 0x1e, 0x39, 0xd3, 0x6b, 0xa2, 0xcc, 0x8f, 0x08, - 0x16, 0xa2, 0xb4, 0x0d, 0xa3, 0x4e, 0x13, 0x03, 0x80, 0x08, 0x30, 0xe5, 0xb7, 0xdf, 0x5a, 0x7c, - 0xfb, 0xef, 0x80, 0x35, 0x09, 0x67, 0x33, 0x0f, 0x69, 0xab, 0x32, 0x29, 0x4b, 0xc4, 0x88, 0xdb, - 0xdf, 0x41, 0x5d, 0x5d, 0x96, 0x34, 0xa0, 0xde, 0xeb, 0xef, 0x6e, 0x1f, 0xef, 0x89, 0xe8, 0x03, - 0x60, 0x3c, 0x1d, 0x1c, 0x6c, 0xd3, 0xff, 0x68, 0x6b, 0x22, 0x12, 0x0d, 0x0e, 0x46, 0x6d, 0x9d, - 0x58, 0x50, 0xdb, 0xdd, 0x3b, 0xdc, 0x1e, 0xb5, 0x2b, 0xc4, 0x84, 0xea, 0xd3, 0xc3, 0xc3, 0xbd, - 0x76, 0x95, 0x34, 0xc1, 0xec, 0x6d, 0x8f, 0xfa, 0xa3, 0xc1, 0x7e, 0xbf, 0x5d, 0x13, 0xbc, 0xcf, - 0xfa, 0x87, 0x6d, 0x43, 0x7c, 0x1c, 0x0f, 0x7a, 0xed, 0xba, 0xa0, 0x1f, 0x6d, 0x0f, 0x87, 0x5f, - 0x1f, 0xd2, 0x5e, 0xdb, 0x14, 0xeb, 0x0e, 0x47, 0x74, 0x70, 0xf0, 0xac, 0x6d, 0xd9, 0x1f, 0x43, - 0xa3, 0xa4, 0x34, 0x21, 0x41, 0xfb, 0xbb, 0xed, 0x15, 0xb1, 0xcd, 0x8b, 0xed, 0xbd, 0xe3, 0x7e, - 0x5b, 0x23, 0xab, 0x00, 0xf8, 0x39, 0xde, 0xdb, 0x3e, 0x78, 0xd6, 0xd6, 0xed, 0xff, 0xc9, 0x45, - 0xb0, 0x47, 0x7d, 0x08, 0xa6, 0xd2, 0x74, 0x56, 0x1a, 0x37, 0x4a, 0x26, 0xa1, 0x39, 0x51, 0x78, - 0xd6, 0xe4, 0x8c, 0x4d, 0xce, 0x79, 0x3a, 0x53, 0x8e, 0x90, 0xc3, 0xb2, 0xdd, 0x14, 0xea, 0xc8, - 0xe2, 0x80, 0x84, 0xf2, 0x51, 0x4b, 0x15, 0xf9, 0xe5, 0xa8, 0xe5, 0x53, 0x80, 0xa2, 0xb9, 0xbf, - 0xa2, 0xb8, 0xbd, 0x0d, 0x35, 0xc7, 0xf7, 0x1c, 0xae, 0x12, 0x96, 0x04, 0xec, 0x03, 0x68, 0x94, - 0x46, 0x02, 0xc2, 0x56, 0x8e, 0xef, 0x8f, 0xcf, 0xd9, 0x25, 0x47, 0x59, 0x93, 0xd6, 0x1d, 0xdf, - 0x7f, 0xce, 0x2e, 0x39, 0xb9, 0x07, 0x35, 0x39, 0x4d, 0xd0, 0x97, 0x9a, 0x56, 0x14, 0xa5, 0x92, - 0x68, 0x7f, 0x08, 0x86, 0xec, 0x64, 0x4b, 0xae, 0xa2, 0x5d, 0x9b, 0x57, 0xbe, 0x50, 0x67, 0xc6, - 0xbe, 0x97, 0x7c, 0xa0, 0xa6, 0x16, 0x5c, 0xce, 0x48, 0xb4, 0xa2, 0xd6, 0x92, 0x4c, 0x6a, 0x60, - 0x81, 0xcc, 0x76, 0x0f, 0xcc, 0x1b, 0xe7, 0x40, 0x4a, 0x01, 0x7a, 0xa1, 0x80, 0x2b, 0x26, 0x43, - 0xf6, 0x7f, 0x01, 0x14, 0xd3, 0x0d, 0xe5, 0xb9, 0x72, 0x15, 0xe1, 0xb9, 0x8f, 0x85, 0x69, 0x3c, - 0xdf, 0x8d, 0x59, 0xb0, 0x70, 0xeb, 0x62, 0x1e, 0x92, 0xd3, 0xc9, 0x3a, 0x54, 0x71, 0x68, 0x53, - 0x29, 0x62, 0x54, 0x3e, 0xb1, 0x41, 0x8a, 0x7d, 0x02, 0x2d, 0x99, 0xae, 0x28, 0xfb, 0xef, 0x94, - 0xf1, 0x1b, 0x8b, 0xa0, 0x35, 0x80, 0x3c, 0xa2, 0x66, 0xe3, 0xa7, 0x12, 0x46, 0x38, 0xc6, 0xa9, - 0xc7, 0x7c, 0x37, 0xbb, 0x8d, 0x82, 0xec, 0xcf, 0xa0, 0x99, 0xed, 0xa1, 0x9a, 0xe0, 0x2c, 0x69, - 0x4a, 0x6d, 0xca, 0xda, 0x5f, 0xb2, 0x1c, 0x84, 0x6e, 0x9e, 0x33, 0xed, 0xdf, 0xe9, 0x99, 0xa4, - 0xea, 0x07, 0x17, 0xca, 0x30, 0x6d, 0xb9, 0x0c, 0x5b, 0x2c, 0x69, 0xf4, 0x1f, 0x55, 0xd2, 0x7c, - 0x0e, 0x96, 0x8b, 0x79, 0xdd, 0xbb, 0xc8, 0x22, 0x5b, 0x77, 0x39, 0x87, 0xab, 0xcc, 0xef, 0x5d, - 0x30, 0x5a, 0x30, 0x8b, 0xb3, 0x24, 0xe1, 0x39, 0x0b, 0xbc, 0xef, 0xb0, 0xe1, 0x15, 0x17, 0x2e, - 0x10, 0xc5, 0xf4, 0x40, 0xe6, 0x7a, 0x35, 0x3d, 0xc8, 0x06, 0x21, 0x46, 0x31, 0x08, 0x11, 0x5a, - 0x4b, 0x23, 0xce, 0xe2, 0x24, 0xab, 0xf9, 0x24, 0x94, 0xd7, 0x4e, 0x96, 0xe2, 0x75, 0x82, 0xa9, - 0xfd, 0x05, 0x58, 0xf9, 0x59, 0x44, 0x48, 0x39, 0x38, 0x3c, 0xe8, 0xcb, 0x00, 0x30, 0x38, 0xe8, - 0xf5, 0xff, 0xbd, 0xad, 0x89, 0xa0, 0x44, 0xfb, 0x2f, 0xfa, 0x74, 0xd8, 0x6f, 0xeb, 0x22, 0x78, - 0xf4, 0xfa, 0x7b, 0xfd, 0x51, 0xbf, 0x5d, 0xf9, 0xaa, 0x6a, 0xd6, 0xdb, 0x26, 0x35, 0xd9, 0x3c, - 0xf2, 0xbd, 0x89, 0x97, 0xd8, 0xc7, 0x60, 0xee, 0x3b, 0xd1, 0x2b, 0xf5, 0x7b, 0x91, 0x6b, 0x52, - 0xd5, 0xf4, 0xab, 0xbc, 0x70, 0x1f, 0xea, 0x2a, 0x3a, 0x28, 0x6f, 0x5a, 0x88, 0x1c, 0x19, 0xcd, - 0xfe, 0x85, 0x06, 0xb7, 0xf7, 0xc3, 0x0b, 0x96, 0x27, 0xd9, 0x23, 0xe7, 0xd2, 0x0f, 0x1d, 0xf7, - 0x35, 0xa6, 0x7b, 0x00, 0xb7, 0x78, 0x98, 0xc6, 0x13, 0x36, 0x5e, 0x1a, 0x38, 0xb4, 0x24, 0xfa, - 0x99, 0x72, 0x41, 0x1b, 0x5a, 0x2e, 0xe3, 0x49, 0xc1, 0x55, 0x41, 0xae, 0x86, 0x40, 0x66, 0x3c, - 0x79, 0xa5, 0x50, 0x7d, 0x5d, 0xa5, 0x60, 0xff, 0x56, 0x83, 0x56, 0x7f, 0x1e, 0x85, 0x71, 0x92, - 0x1d, 0xf3, 0x06, 0xf7, 0x7f, 0x02, 0x86, 0x90, 0x4a, 0xb9, 0x72, 0xad, 0x8e, 0x58, 0x78, 0x41, - 0x7a, 0x73, 0x88, 0x74, 0xaa, 0xf8, 0xae, 0x2f, 0x99, 0xde, 0x82, 0x7a, 0x1a, 0x78, 0xf3, 0x6c, - 0x20, 0x53, 0xa1, 0x86, 0x00, 0x47, 0xdc, 0xfe, 0x12, 0x0c, 0xb9, 0x46, 0xc9, 0xba, 0x0d, 0xa8, - 0x0f, 0x8f, 0x77, 0x76, 0xfa, 0xc3, 0x61, 0x5b, 0x23, 0x2d, 0xb0, 0x7a, 0xc7, 0x47, 0x7b, 0x83, - 0x9d, 0xed, 0x91, 0xb2, 0xf0, 0xee, 0xf6, 0x60, 0xaf, 0xdf, 0x6b, 0x57, 0xec, 0x1d, 0xb0, 0x46, - 0xf3, 0x40, 0x89, 0x97, 0xf3, 0x9b, 0x76, 0x43, 0x7e, 0xd3, 0x97, 0xf2, 0xdb, 0x10, 0x1a, 0xa5, - 0x7a, 0x87, 0xbc, 0x07, 0xd5, 0x64, 0x1e, 0x2c, 0x4e, 0x41, 0xb3, 0x3d, 0x28, 0x92, 0xc8, 0x7b, - 0xd0, 0x14, 0x1d, 0x96, 0xc3, 0xb9, 0x37, 0x0d, 0x98, 0xab, 0x56, 0x14, 0x5d, 0xd7, 0xb6, 0x42, - 0xd9, 0x77, 0xa1, 0x25, 0x5a, 0x5a, 0x6f, 0xc6, 0x78, 0xe2, 0xcc, 0x22, 0xcc, 0xc6, 0x2a, 0x04, - 0x57, 0xa9, 0x9e, 0x70, 0xfb, 0x01, 0x34, 0x8f, 0x18, 0x8b, 0x29, 0xe3, 0x51, 0x18, 0x70, 0x6c, - 0x6f, 0x94, 0xaa, 0x65, 0xbc, 0x57, 0x90, 0xfd, 0x2d, 0x58, 0xa2, 0x62, 0x7d, 0xea, 0x24, 0x93, - 0xb3, 0x9f, 0x52, 0xd1, 0x3e, 0x80, 0x7a, 0x24, 0x4d, 0xa4, 0xea, 0xcf, 0x26, 0x86, 0x1c, 0x65, - 0x36, 0x9a, 0x11, 0xed, 0x4f, 0xa1, 0x72, 0x90, 0xce, 0xca, 0xff, 0x09, 0x54, 0x65, 0xa5, 0xb5, - 0xd0, 0xcb, 0xe9, 0x8b, 0xbd, 0x9c, 0xfd, 0x0d, 0x34, 0xb2, 0xab, 0x0e, 0x5c, 0x1c, 0xec, 0xa3, - 0xaa, 0x07, 0xee, 0x82, 0xe6, 0x65, 0x93, 0xc4, 0x02, 0x77, 0x90, 0xe9, 0x48, 0x02, 0x8b, 0x6b, - 0xab, 0x21, 0x40, 0xbe, 0xf6, 0x2e, 0x34, 0xb3, 0xaa, 0x12, 0xcb, 0x3a, 0x61, 0x3c, 0xdf, 0x63, - 0x41, 0xc9, 0xb0, 0xa6, 0x44, 0x8c, 0xf8, 0x0d, 0xf3, 0x3a, 0x7b, 0x33, 0x77, 0x2c, 0x02, 0xd5, - 0x49, 0xe8, 0xca, 0x37, 0x58, 0xa3, 0xf8, 0x2d, 0x2e, 0x3c, 0xe3, 0xd3, 0x2c, 0x2f, 0xcd, 0xf8, - 0xd4, 0xfe, 0x4f, 0x68, 0x3d, 0x75, 0x26, 0xe7, 0x69, 0x94, 0xe5, 0x85, 0x92, 0x2f, 0x6b, 0x0b, - 0xbe, 0x7c, 0xc3, 0x90, 0xf0, 0x0e, 0x18, 0x89, 0x13, 0x4f, 0xd5, 0x7c, 0xc9, 0xa2, 0x0a, 0xda, - 0xfa, 0x95, 0x06, 0x55, 0x61, 0x27, 0x72, 0x0f, 0xaa, 0xfd, 0xc9, 0x59, 0x48, 0x16, 0xcc, 0xd1, - 0x5d, 0x80, 0xec, 0x15, 0xf2, 0xa1, 0x9c, 0x85, 0x66, 0x23, 0xde, 0x56, 0x66, 0x66, 0x74, 0x83, - 0x57, 0xb8, 0x37, 0xa1, 0xf1, 0x55, 0xe8, 0x05, 0x3b, 0x72, 0x3c, 0x48, 0x96, 0x9d, 0xe2, 0x15, - 0xfe, 0x8f, 0xc0, 0x18, 0x70, 0xe1, 0x7d, 0xaf, 0xb2, 0x62, 0x37, 0x57, 0x76, 0x4c, 0x7b, 0x65, - 0xeb, 0xcf, 0x3a, 0x54, 0xbf, 0x61, 0x71, 0x48, 0x3e, 0x84, 0xba, 0x9a, 0x5d, 0x90, 0xd2, 0x8c, - 0xa2, 0x8b, 0xe1, 0x66, 0x69, 0xa8, 0x81, 0xa7, 0x32, 0x54, 0x0e, 0x2b, 0x06, 0x2a, 0xdd, 0xab, - 0x42, 0x93, 0xbd, 0xb2, 0xa1, 0x3d, 0xd1, 0xc8, 0x07, 0x60, 0xc8, 0x77, 0xb8, 0xa4, 0x9b, 0xe5, - 0x8e, 0xc4, 0x5e, 0x79, 0xa2, 0x91, 0x87, 0xd0, 0x18, 0x9e, 0x85, 0xa9, 0xef, 0x0e, 0x59, 0x7c, - 0xc1, 0x48, 0x69, 0x8c, 0xd7, 0x2d, 0x7d, 0xdb, 0x2b, 0x64, 0x03, 0x40, 0x7a, 0xea, 0xb1, 0xe7, - 0x72, 0x52, 0x17, 0xb4, 0x83, 0x74, 0x26, 0x17, 0x2d, 0xb9, 0xb0, 0xe4, 0x2c, 0xbd, 0xd7, 0x9b, - 0x38, 0x3f, 0x81, 0xd6, 0x0e, 0x46, 0x8f, 0xc3, 0x78, 0xfb, 0x24, 0x8c, 0x13, 0xb2, 0x3c, 0xca, - 0xeb, 0x2e, 0x23, 0xec, 0x15, 0xf2, 0x04, 0xcc, 0x51, 0x7c, 0x29, 0xf9, 0xdf, 0x50, 0x51, 0xa5, - 0xd8, 0xef, 0x8a, 0x5b, 0x6e, 0xfd, 0x50, 0x01, 0xe3, 0xeb, 0x30, 0x3e, 0x67, 0x31, 0x79, 0x0c, - 0x06, 0xb6, 0x8e, 0xca, 0x15, 0xf2, 0x36, 0xf2, 0xaa, 0x8d, 0xee, 0x81, 0x85, 0x4a, 0x19, 0x39, - 0xfc, 0x5c, 0xaa, 0x1e, 0xff, 0x59, 0x93, 0x7a, 0x91, 0xf5, 0x08, 0xfa, 0xc0, 0xea, 0x30, 0x89, - 0x99, 0x33, 0xcb, 0xdb, 0xe5, 0x85, 0x7e, 0xae, 0x5b, 0x97, 0x2d, 0xdb, 0x50, 0x19, 0xe7, 0x11, - 0x54, 0x87, 0xf2, 0xa6, 0x82, 0xa9, 0xf8, 0xf7, 0xa1, 0xbb, 0x9a, 0x21, 0xf2, 0x95, 0xff, 0x05, - 0x0c, 0x59, 0x4a, 0xc8, 0x6b, 0x2e, 0xd4, 0x5a, 0xdd, 0x76, 0x19, 0xa5, 0x04, 0x6c, 0xa8, 0x1f, - 0xa5, 0xf1, 0x94, 0x8d, 0xf8, 0x92, 0xe5, 0x33, 0x1b, 0xd8, 0x2b, 0xe4, 0x11, 0x18, 0xf2, 0x71, - 0xca, 0x45, 0x17, 0x1e, 0xaa, 0xbc, 0x99, 0x7c, 0xeb, 0xa8, 0x68, 0x43, 0xa6, 0x28, 0xc9, 0xba, - 0x90, 0xae, 0xba, 0xaf, 0xa2, 0x50, 0x17, 0x6d, 0xca, 0x26, 0xcc, 0x2b, 0xe5, 0x70, 0x92, 0xdd, - 0x7f, 0xf9, 0xf1, 0x6c, 0x68, 0xe4, 0x0b, 0x68, 0x2d, 0xe4, 0x7b, 0x82, 0x69, 0xf1, 0xaa, 0x12, - 0x60, 0x59, 0xf8, 0x69, 0xfb, 0x37, 0x2f, 0xd7, 0xb4, 0x1f, 0x5e, 0xae, 0x69, 0xbf, 0x7f, 0xb9, - 0xa6, 0x7d, 0xff, 0x87, 0xb5, 0x95, 0x13, 0x03, 0xff, 0xbc, 0xfd, 0xe4, 0x6f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x59, 0x16, 0x85, 0xb9, 0xd7, 0x1d, 0x00, 0x00, + 0x97, 0x54, 0x7b, 0xc6, 0x0b, 0xb3, 0x20, 0xe2, 0x8a, 0xc2, 0x08, 0x04, 0x30, 0xb8, 0x80, 0x8a, + 0xf2, 0x62, 0xaa, 0x66, 0x33, 0xdf, 0xe0, 0x55, 0x16, 0x59, 0x26, 0x3f, 0x90, 0x7c, 0x40, 0xaa, + 0x52, 0x59, 0x79, 0x9b, 0x5d, 0xaa, 0xb3, 0xca, 0x3a, 0x95, 0xca, 0x22, 0x9b, 0xd4, 0x3d, 0xf7, + 0xe2, 0x41, 0xb6, 0xa4, 0xb6, 0x53, 0x95, 0x15, 0x71, 0x5e, 0xf7, 0x71, 0xce, 0xb9, 0xe7, 0x45, + 0x30, 0xa3, 0x93, 0xcd, 0x28, 0x0e, 0x93, 0x90, 0xe8, 0xd1, 0x49, 0xd7, 0x72, 0x22, 0x4f, 0x82, + 0x76, 0x17, 0xaa, 0x7b, 0x1e, 0x4f, 0x08, 0x81, 0x6a, 0xea, 0xb9, 0xbc, 0xa3, 0xad, 0x57, 0x36, + 0x0c, 0x8a, 0xdf, 0xf6, 0x3e, 0x58, 0x23, 0x87, 0x9f, 0xbf, 0x70, 0xfc, 0x94, 0x91, 0x36, 0x54, + 0x2e, 0x1c, 0xbf, 0xa3, 0xad, 0x6b, 0x1b, 0x4d, 0x2a, 0x3e, 0xc9, 0x26, 0x98, 0x17, 0x8e, 0x3f, + 0x4e, 0x2e, 0x23, 0xd6, 0xd1, 0xd7, 0xb5, 0x8d, 0xd5, 0xad, 0x37, 0x37, 0xa3, 0x93, 0xcd, 0xa3, + 0x90, 0x27, 0x5e, 0x30, 0xdd, 0x7c, 0xe1, 0xf8, 0xa3, 0xcb, 0x88, 0xd1, 0xfa, 0x85, 0xfc, 0xb0, + 0x0f, 0xa1, 0x31, 0x8c, 0x27, 0xbb, 0x69, 0x30, 0x49, 0xbc, 0x30, 0x10, 0x3b, 0x06, 0xce, 0x8c, + 0xe1, 0x8a, 0x16, 0xc5, 0x6f, 0x81, 0x73, 0xe2, 0x29, 0xef, 0x54, 0xd6, 0x2b, 0x02, 0x27, 0xbe, + 0x49, 0x07, 0xea, 0x1e, 0xdf, 0x09, 0xd3, 0x20, 0xe9, 0x54, 0xd7, 0xb5, 0x0d, 0x93, 0x66, 0xa0, + 0xfd, 0x67, 0x1d, 0x6a, 0xff, 0x91, 0xb2, 0xf8, 0x12, 0xe5, 0x92, 0x24, 0xce, 0xd6, 0x12, 0xdf, + 0xe4, 0x36, 0xd4, 0x7c, 0x27, 0x98, 0xf2, 0x8e, 0x8e, 0x8b, 0x49, 0x80, 0xbc, 0x03, 0x96, 0x73, + 0x9a, 0xb0, 0x78, 0x9c, 0x7a, 0x6e, 0xa7, 0xb2, 0xae, 0x6d, 0x18, 0xd4, 0x44, 0xc4, 0xb1, 0xe7, + 0x92, 0xb7, 0xc1, 0x74, 0xc3, 0xf1, 0xa4, 0xbc, 0x97, 0x1b, 0xe2, 0x5e, 0xe4, 0x7d, 0x30, 0x53, + 0xcf, 0x1d, 0xfb, 0x1e, 0x4f, 0x3a, 0xb5, 0x75, 0x6d, 0xa3, 0xb1, 0x65, 0x8a, 0xcb, 0x0a, 0xdd, + 0xd1, 0x7a, 0xea, 0xb9, 0xa8, 0xc4, 0xc7, 0x60, 0xf2, 0x78, 0x32, 0x3e, 0x4d, 0x83, 0x49, 0xc7, + 0x40, 0xa6, 0x5b, 0x82, 0xa9, 0x74, 0x6b, 0x5a, 0xe7, 0x12, 0x10, 0xd7, 0x8a, 0xd9, 0x05, 0x8b, + 0x39, 0xeb, 0xd4, 0xe5, 0x56, 0x0a, 0x24, 0x4f, 0xa0, 0x71, 0xea, 0x4c, 0x58, 0x32, 0x8e, 0x9c, + 0xd8, 0x99, 0x75, 0xcc, 0x62, 0xa1, 0x5d, 0x81, 0x3e, 0x12, 0x58, 0x4e, 0xe1, 0x34, 0x07, 0xc8, + 0x27, 0xd0, 0x42, 0x88, 0x8f, 0x4f, 0x3d, 0x3f, 0x61, 0x71, 0xc7, 0x42, 0x99, 0x55, 0x94, 0x41, + 0xcc, 0x28, 0x66, 0x8c, 0x36, 0x25, 0x93, 0xc4, 0x90, 0x7f, 0x05, 0x60, 0xf3, 0xc8, 0x09, 0xdc, + 0xb1, 0xe3, 0xfb, 0x1d, 0xc0, 0x33, 0x58, 0x12, 0xb3, 0xed, 0xfb, 0xe4, 0x2d, 0x71, 0x3e, 0xc7, + 0x1d, 0x27, 0xbc, 0xd3, 0x5a, 0xd7, 0x36, 0xaa, 0xd4, 0x10, 0xe0, 0x88, 0xdb, 0x5b, 0x60, 0xa1, + 0x47, 0xe0, 0x8d, 0xef, 0x83, 0x71, 0x21, 0x00, 0xe9, 0x38, 0x8d, 0xad, 0x96, 0xd8, 0x32, 0x77, + 0x1a, 0xaa, 0x88, 0xf6, 0x1a, 0x98, 0x7b, 0x4e, 0x30, 0xcd, 0x3c, 0x4d, 0x98, 0x02, 0x05, 0x2c, + 0x8a, 0xdf, 0xf6, 0xf7, 0x3a, 0x18, 0x94, 0xf1, 0xd4, 0x4f, 0xc8, 0x43, 0x00, 0xa1, 0xe8, 0x99, + 0x93, 0xc4, 0xde, 0x5c, 0xad, 0x5a, 0xa8, 0xda, 0x4a, 0x3d, 0x77, 0x1f, 0x49, 0xe4, 0x09, 0x34, + 0x71, 0xf5, 0x8c, 0x55, 0x2f, 0x0e, 0x90, 0x9f, 0x8f, 0x36, 0x90, 0x45, 0x49, 0xdc, 0x01, 0x03, + 0x6d, 0x2b, 0xfd, 0xab, 0x45, 0x15, 0x44, 0xee, 0xc3, 0xaa, 0x17, 0x24, 0x42, 0xf7, 0x93, 0x64, + 0xec, 0x32, 0x9e, 0x19, 0xbf, 0x95, 0x63, 0x7b, 0x8c, 0x27, 0xe4, 0x63, 0x90, 0x0a, 0xcc, 0x36, + 0xac, 0xe1, 0x86, 0xab, 0xb9, 0x61, 0xb8, 0xdc, 0x11, 0x79, 0xd4, 0x8e, 0x1f, 0x41, 0x43, 0xdc, + 0x2f, 0x93, 0x30, 0x50, 0xa2, 0x89, 0xb7, 0x51, 0xea, 0xa0, 0x20, 0x18, 0x14, 0xbb, 0x50, 0x8d, + 0x70, 0x30, 0xe9, 0x10, 0xf8, 0x6d, 0xf7, 0xa1, 0x76, 0x18, 0xbb, 0x2c, 0xbe, 0xd2, 0xc7, 0x09, + 0x54, 0x5d, 0xc6, 0x27, 0xf8, 0xfc, 0x4c, 0x8a, 0xdf, 0x85, 0xdf, 0x57, 0x4a, 0x7e, 0x6f, 0xff, + 0x4c, 0x83, 0xc6, 0x30, 0x8c, 0x93, 0x7d, 0xc6, 0xb9, 0x33, 0x65, 0xe4, 0x2e, 0xd4, 0x42, 0xb1, + 0xac, 0xd2, 0xb0, 0x25, 0xce, 0x84, 0xfb, 0x50, 0x89, 0x5f, 0xb2, 0x83, 0x7e, 0xbd, 0x1d, 0x6e, + 0x43, 0x4d, 0xbe, 0x18, 0xf1, 0x9a, 0x6a, 0x54, 0x02, 0x42, 0xd7, 0xe1, 0xe9, 0x29, 0x67, 0x52, + 0x97, 0x35, 0xaa, 0xa0, 0xeb, 0xdd, 0xea, 0xdf, 0x01, 0xc4, 0xf9, 0x7e, 0xa2, 0x17, 0xd8, 0x67, + 0xd0, 0xa0, 0xce, 0x69, 0xb2, 0x13, 0x06, 0x09, 0x9b, 0x27, 0x64, 0x15, 0x74, 0xcf, 0x45, 0x15, + 0x19, 0x54, 0xf7, 0x5c, 0x71, 0xb8, 0x69, 0x1c, 0xa6, 0x11, 0x6a, 0xa8, 0x45, 0x25, 0x80, 0xaa, + 0x74, 0xdd, 0x18, 0x4f, 0x2c, 0x54, 0xe9, 0xba, 0x31, 0xb9, 0x0b, 0x0d, 0x1e, 0x38, 0x11, 0x3f, + 0x0b, 0x13, 0x71, 0xb8, 0x2a, 0x1e, 0x0e, 0x32, 0xd4, 0x88, 0xdb, 0xbf, 0xd1, 0xc0, 0xd8, 0x67, + 0xb3, 0x13, 0x16, 0xbf, 0xb2, 0xcb, 0xdb, 0x60, 0xe2, 0xc2, 0x63, 0xcf, 0x55, 0x1b, 0xd5, 0x11, + 0x1e, 0xb8, 0x57, 0x6e, 0x75, 0x07, 0x0c, 0x9f, 0x39, 0x42, 0xf9, 0xd2, 0xcf, 0x14, 0x24, 0x74, + 0xe3, 0xcc, 0xc6, 0x2e, 0x73, 0x5c, 0x0c, 0x31, 0x26, 0x35, 0x9c, 0x59, 0x8f, 0x39, 0xae, 0x38, + 0x9b, 0xef, 0xf0, 0x64, 0x9c, 0x46, 0xae, 0x93, 0x30, 0x0c, 0x2d, 0x55, 0xe1, 0x38, 0x3c, 0x39, + 0x46, 0x0c, 0x79, 0x0c, 0x6f, 0x4c, 0xfc, 0x94, 0x8b, 0xb8, 0xe6, 0x05, 0xa7, 0xe1, 0x38, 0x0c, + 0xfc, 0x4b, 0xd4, 0xaf, 0x49, 0x6f, 0x29, 0xc2, 0x20, 0x38, 0x0d, 0x0f, 0x03, 0xff, 0xd2, 0xfe, + 0x9b, 0x06, 0xb5, 0x67, 0xa8, 0x86, 0x27, 0x50, 0x9f, 0xe1, 0x85, 0xb2, 0xd7, 0x7b, 0x47, 0x68, + 0x18, 0x69, 0x9b, 0xf2, 0xa6, 0xbc, 0x1f, 0x24, 0xf1, 0x25, 0xcd, 0xd8, 0x84, 0x44, 0xe2, 0x9c, + 0xf8, 0x2c, 0xe1, 0xca, 0x23, 0x4a, 0x12, 0x23, 0x49, 0x50, 0x12, 0x8a, 0xad, 0xbb, 0x0b, 0xcd, + 0xf2, 0x52, 0x22, 0x8d, 0x9c, 0xb3, 0x4b, 0xd4, 0x5d, 0x95, 0x8a, 0x4f, 0xb2, 0x0e, 0x35, 0x7c, + 0xa4, 0xa8, 0xb9, 0xc6, 0x16, 0x88, 0x15, 0xa5, 0x08, 0x95, 0x84, 0x2f, 0xf5, 0xcf, 0x35, 0xb1, + 0x4e, 0x79, 0x83, 0xf2, 0x3a, 0xd6, 0xf5, 0xeb, 0x48, 0x91, 0xd2, 0x3a, 0xf6, 0x5f, 0x35, 0x68, + 0x7e, 0xc3, 0xe2, 0xf0, 0x28, 0x0e, 0xa3, 0x90, 0x3b, 0x3e, 0xb1, 0xc1, 0x90, 0xb7, 0xbb, 0x62, + 0x7f, 0x45, 0x11, 0x3c, 0xf2, 0x3e, 0x68, 0xc6, 0xc5, 0xb5, 0x15, 0x85, 0xac, 0x01, 0xcc, 0x9c, + 0xf9, 0x1e, 0x73, 0x38, 0x1b, 0xb8, 0x99, 0xfb, 0x14, 0x18, 0xd2, 0x05, 0x73, 0xe6, 0xcc, 0x47, + 0xf3, 0x60, 0xc4, 0xd1, 0xba, 0x55, 0x9a, 0xc3, 0xe4, 0x5d, 0xb0, 0x66, 0xce, 0x5c, 0xf8, 0xf1, + 0xc0, 0x55, 0xd6, 0x2d, 0x10, 0xe4, 0x3d, 0xa8, 0x24, 0xf3, 0x00, 0x83, 0x82, 0xc8, 0x03, 0x22, + 0x77, 0x8f, 0xe6, 0x81, 0xf2, 0x78, 0x2a, 0x68, 0x99, 0x36, 0xcc, 0x42, 0x1b, 0x6d, 0xa8, 0x4c, + 0x3c, 0x17, 0x13, 0x81, 0x45, 0xc5, 0xa7, 0xfd, 0xab, 0x0a, 0xdc, 0x52, 0xa6, 0x38, 0xf3, 0xa2, + 0x61, 0x22, 0xfc, 0xa6, 0x03, 0x75, 0x7c, 0xae, 0x2c, 0x56, 0x16, 0xc9, 0x40, 0xf2, 0x19, 0x18, + 0xe8, 0xc2, 0x99, 0xa1, 0xef, 0x16, 0x6a, 0xc9, 0xc5, 0xa5, 0xe1, 0x95, 0xc5, 0x15, 0x3b, 0xf9, + 0x14, 0x6a, 0xdf, 0xb1, 0x38, 0x94, 0xe1, 0xa7, 0xb1, 0xb5, 0x76, 0x95, 0x9c, 0x30, 0x80, 0x12, + 0x93, 0xcc, 0xff, 0x44, 0xed, 0xdd, 0x13, 0x01, 0x67, 0x16, 0x5e, 0x30, 0xb7, 0x53, 0xc7, 0x13, + 0x95, 0x0d, 0x9c, 0x91, 0x32, 0x75, 0x99, 0xb9, 0xba, 0xba, 0x3d, 0x68, 0x94, 0xae, 0x57, 0xf6, + 0xb7, 0x96, 0xd4, 0xf0, 0xdd, 0x45, 0x7f, 0xb3, 0xf2, 0x97, 0x50, 0x76, 0xdb, 0x1e, 0x40, 0x71, + 0xd9, 0x7f, 0xd4, 0xf9, 0xed, 0xff, 0xd3, 0xe0, 0xd6, 0x4e, 0x18, 0x04, 0x0c, 0x6b, 0x08, 0x69, + 0xba, 0xc2, 0x6f, 0xb5, 0x6b, 0xfd, 0xf6, 0x11, 0xd4, 0xb8, 0x60, 0x56, 0xab, 0xbf, 0x79, 0x85, + 0x2d, 0xa8, 0xe4, 0x10, 0x21, 0x66, 0xe6, 0xcc, 0xc7, 0x11, 0x0b, 0x5c, 0x2f, 0x98, 0xa2, 0x9f, + 0x4b, 0x0b, 0x1c, 0x49, 0x8c, 0xfd, 0x73, 0x0d, 0x0c, 0xe9, 0xf2, 0x0b, 0xe1, 0x4e, 0x5b, 0x0c, + 0x77, 0xef, 0x82, 0x15, 0xc5, 0xcc, 0xf5, 0x26, 0xd9, 0xae, 0x16, 0x2d, 0x10, 0x22, 0x1a, 0x9f, + 0x86, 0xf1, 0x84, 0xe1, 0xf2, 0x26, 0x95, 0x80, 0x28, 0xc9, 0x30, 0x25, 0x60, 0xd0, 0x92, 0x11, + 0xd1, 0x14, 0x08, 0x11, 0xad, 0x84, 0x08, 0x8f, 0x9c, 0x89, 0x2c, 0x92, 0x2a, 0x54, 0x02, 0x22, + 0x82, 0x4a, 0xcb, 0xa1, 0xc5, 0x4c, 0xaa, 0x20, 0xfb, 0x17, 0x3a, 0x34, 0x7b, 0x5e, 0xcc, 0x26, + 0x09, 0x73, 0xfb, 0xee, 0x14, 0x19, 0x59, 0x90, 0x78, 0xc9, 0xa5, 0x8a, 0xd6, 0x0a, 0xca, 0x93, + 0xa9, 0xbe, 0x58, 0x30, 0x4a, 0x5b, 0x54, 0xb0, 0xc6, 0x95, 0x00, 0xd9, 0x02, 0x90, 0x65, 0x06, + 0xd6, 0xb9, 0xd5, 0xeb, 0xeb, 0x5c, 0x0b, 0xd9, 0xc4, 0xa7, 0x50, 0x90, 0x94, 0xf1, 0x64, 0x24, + 0x37, 0xb0, 0x08, 0x4e, 0x85, 0x23, 0x63, 0x76, 0x3e, 0x61, 0x3e, 0x3a, 0x2a, 0x66, 0xe7, 0x13, + 0xe6, 0xe7, 0x35, 0x51, 0x5d, 0x1e, 0x47, 0x7c, 0x93, 0xf7, 0x41, 0x0f, 0x23, 0xbc, 0x9f, 0xda, + 0xb0, 0x7c, 0xb1, 0xcd, 0xc3, 0x88, 0xea, 0x61, 0x24, 0xbc, 0x40, 0x16, 0x75, 0x1d, 0x4b, 0x39, + 0xb7, 0x08, 0x0f, 0x58, 0x8e, 0x50, 0x45, 0xb1, 0xef, 0x80, 0x7e, 0x18, 0x91, 0x3a, 0x54, 0x86, + 0xfd, 0x51, 0x7b, 0x45, 0x7c, 0xf4, 0xfa, 0x7b, 0x6d, 0xcd, 0x7e, 0xa9, 0x81, 0xb5, 0x9f, 0x26, + 0x8e, 0xf0, 0x29, 0x7e, 0x93, 0x51, 0xdf, 0x06, 0x93, 0x27, 0x4e, 0x8c, 0x79, 0x51, 0x97, 0x61, + 0x02, 0xe1, 0x11, 0x27, 0x0f, 0xa0, 0xc6, 0xdc, 0x29, 0xcb, 0x5e, 0x7b, 0x7b, 0xf9, 0x9c, 0x54, + 0x92, 0xc9, 0x06, 0x18, 0x7c, 0x72, 0xc6, 0x66, 0x4e, 0xa7, 0x5a, 0x30, 0x0e, 0x11, 0x23, 0x53, + 0x18, 0x55, 0x74, 0xac, 0xc1, 0xe3, 0x30, 0xc2, 0xa2, 0xb4, 0xa6, 0x6a, 0xf0, 0x38, 0x8c, 0x44, + 0x49, 0xba, 0x05, 0xff, 0xe2, 0x4d, 0x83, 0x30, 0x66, 0x63, 0x2f, 0x70, 0xd9, 0x7c, 0x3c, 0x09, + 0x83, 0x53, 0xdf, 0x9b, 0x24, 0xa8, 0x4b, 0x93, 0xbe, 0x29, 0x89, 0x03, 0x41, 0xdb, 0x51, 0x24, + 0xfb, 0x7d, 0xb0, 0x9e, 0xb3, 0x4b, 0x2c, 0x08, 0x39, 0xb9, 0x03, 0xfa, 0xf9, 0x85, 0xca, 0x75, + 0x86, 0x38, 0xc1, 0xf3, 0x17, 0x54, 0x3f, 0xbf, 0xb0, 0xe7, 0x60, 0x0e, 0x55, 0xa2, 0x27, 0x8f, + 0x44, 0x48, 0xc4, 0xd0, 0xaa, 0x1e, 0x16, 0x56, 0xde, 0xa5, 0x1a, 0x83, 0x66, 0x74, 0x61, 0x4b, + 0x3c, 0x88, 0x52, 0x8a, 0x04, 0xca, 0x15, 0x4e, 0xa5, 0x5c, 0xe1, 0x60, 0xb1, 0x16, 0x06, 0x4c, + 0xb9, 0x38, 0x7e, 0xdb, 0xff, 0xaf, 0x83, 0x99, 0xa7, 0xa2, 0x0f, 0xc0, 0x9a, 0x65, 0xf6, 0x50, + 0x4f, 0x16, 0xcb, 0xd9, 0xdc, 0x48, 0xb4, 0xa0, 0xab, 0xbb, 0x54, 0x97, 0xef, 0x52, 0xbc, 0xf9, + 0xda, 0x6b, 0xdf, 0xfc, 0x43, 0xb8, 0x35, 0xf1, 0x99, 0x13, 0x8c, 0x8b, 0x27, 0x2b, 0xbd, 0x72, + 0x15, 0xd1, 0x47, 0xf9, 0xbb, 0x55, 0x71, 0xab, 0x5e, 0xa4, 0x97, 0xfb, 0x50, 0x73, 0x99, 0x9f, + 0x38, 0xe5, 0xee, 0xe4, 0x30, 0x76, 0x26, 0x3e, 0xeb, 0x09, 0x34, 0x95, 0x54, 0xb2, 0x01, 0x66, + 0x56, 0x41, 0xa9, 0x9e, 0x04, 0x8b, 0xdf, 0x4c, 0xd9, 0x34, 0xa7, 0xda, 0x1f, 0x43, 0xe5, 0xf9, + 0x8b, 0xe1, 0x75, 0x16, 0xca, 0x75, 0xa7, 0x97, 0x74, 0xf7, 0x2d, 0xe8, 0xcf, 0x5f, 0x94, 0x63, + 0x6a, 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0x66, 0xca, 0x59, 0xbc, 0xcf, + 0x12, 0x47, 0x3d, 0xee, 0x1c, 0x16, 0x29, 0x50, 0xb4, 0x5d, 0x5e, 0x18, 0xa8, 0xb4, 0x93, 0x81, + 0xf6, 0x9f, 0x2a, 0x50, 0x57, 0x8f, 0x5c, 0xac, 0x99, 0xe6, 0x25, 0x9f, 0xf8, 0x2c, 0xa2, 0x85, + 0x5e, 0x8e, 0x16, 0xe5, 0x9e, 0xb8, 0xf2, 0xfa, 0x9e, 0x98, 0x7c, 0x09, 0xcd, 0x48, 0xd2, 0xca, + 0xf1, 0xe5, 0xad, 0xb2, 0x8c, 0xfa, 0x45, 0xb9, 0x46, 0x54, 0x00, 0xe2, 0xa5, 0x60, 0x73, 0x91, + 0x38, 0x53, 0x34, 0x76, 0x93, 0xd6, 0x05, 0x3c, 0x72, 0xa6, 0xd7, 0x44, 0x99, 0x1f, 0x11, 0x2c, + 0x44, 0x69, 0x1b, 0x46, 0x9d, 0x26, 0x06, 0x00, 0x11, 0x60, 0xca, 0x6f, 0xbf, 0xb5, 0xf8, 0xf6, + 0xdf, 0x01, 0x6b, 0x12, 0xce, 0x66, 0x1e, 0xd2, 0x56, 0x65, 0x52, 0x96, 0x88, 0x11, 0xb7, 0xbf, + 0x83, 0xba, 0xba, 0x2c, 0x69, 0x40, 0xbd, 0xd7, 0xdf, 0xdd, 0x3e, 0xde, 0x13, 0xd1, 0x07, 0xc0, + 0x78, 0x3a, 0x38, 0xd8, 0xa6, 0xff, 0xd5, 0xd6, 0x44, 0x24, 0x1a, 0x1c, 0x8c, 0xda, 0x3a, 0xb1, + 0xa0, 0xb6, 0xbb, 0x77, 0xb8, 0x3d, 0x6a, 0x57, 0x88, 0x09, 0xd5, 0xa7, 0x87, 0x87, 0x7b, 0xed, + 0x2a, 0x69, 0x82, 0xd9, 0xdb, 0x1e, 0xf5, 0x47, 0x83, 0xfd, 0x7e, 0xbb, 0x26, 0x78, 0x9f, 0xf5, + 0x0f, 0xdb, 0x86, 0xf8, 0x38, 0x1e, 0xf4, 0xda, 0x75, 0x41, 0x3f, 0xda, 0x1e, 0x0e, 0xbf, 0x3e, + 0xa4, 0xbd, 0xb6, 0x29, 0xd6, 0x1d, 0x8e, 0xe8, 0xe0, 0xe0, 0x59, 0xdb, 0xb2, 0x3f, 0x86, 0x46, + 0x49, 0x69, 0x42, 0x82, 0xf6, 0x77, 0xdb, 0x2b, 0x62, 0x9b, 0x17, 0xdb, 0x7b, 0xc7, 0xfd, 0xb6, + 0x46, 0x56, 0x01, 0xf0, 0x73, 0xbc, 0xb7, 0x7d, 0xf0, 0xac, 0xad, 0xdb, 0xff, 0x9b, 0x8b, 0x60, + 0x8f, 0xfa, 0x10, 0x4c, 0xa5, 0xe9, 0xac, 0x34, 0x6e, 0x94, 0x4c, 0x42, 0x73, 0xa2, 0xf0, 0xac, + 0xc9, 0x19, 0x9b, 0x9c, 0xf3, 0x74, 0xa6, 0x1c, 0x21, 0x87, 0x65, 0xbb, 0x29, 0xd4, 0x91, 0xc5, + 0x01, 0x09, 0xe5, 0xa3, 0x96, 0x2a, 0xf2, 0xcb, 0x51, 0xcb, 0xa7, 0x00, 0x45, 0x73, 0x7f, 0x45, + 0x71, 0x7b, 0x1b, 0x6a, 0x8e, 0xef, 0x39, 0x5c, 0x25, 0x2c, 0x09, 0xd8, 0x07, 0xd0, 0x28, 0x8d, + 0x04, 0x84, 0xad, 0x1c, 0xdf, 0x1f, 0x9f, 0xb3, 0x4b, 0x8e, 0xb2, 0x26, 0xad, 0x3b, 0xbe, 0xff, + 0x9c, 0x5d, 0x72, 0x72, 0x0f, 0x6a, 0x72, 0x9a, 0xa0, 0x2f, 0x35, 0xad, 0x28, 0x4a, 0x25, 0xd1, + 0xfe, 0x10, 0x0c, 0xd9, 0xc9, 0x96, 0x5c, 0x45, 0xbb, 0x36, 0xaf, 0x7c, 0xa1, 0xce, 0x8c, 0x7d, + 0x2f, 0xf9, 0x40, 0x4d, 0x2d, 0xb8, 0x9c, 0x91, 0x68, 0x45, 0xad, 0x25, 0x99, 0xd4, 0xc0, 0x02, + 0x99, 0xed, 0x1e, 0x98, 0x37, 0xce, 0x81, 0x94, 0x02, 0xf4, 0x42, 0x01, 0x57, 0x4c, 0x86, 0xec, + 0xff, 0x06, 0x28, 0xa6, 0x1b, 0xca, 0x73, 0xe5, 0x2a, 0xc2, 0x73, 0x1f, 0x0b, 0xd3, 0x78, 0xbe, + 0x1b, 0xb3, 0x60, 0xe1, 0xd6, 0xc5, 0x3c, 0x24, 0xa7, 0x93, 0x75, 0xa8, 0xe2, 0xd0, 0xa6, 0x52, + 0xc4, 0xa8, 0x7c, 0x62, 0x83, 0x14, 0xfb, 0x04, 0x5a, 0x32, 0x5d, 0x51, 0xf6, 0x3f, 0x29, 0xe3, + 0x37, 0x16, 0x41, 0x6b, 0x00, 0x79, 0x44, 0xcd, 0xc6, 0x4f, 0x25, 0x8c, 0x70, 0x8c, 0x53, 0x8f, + 0xf9, 0x6e, 0x76, 0x1b, 0x05, 0xd9, 0x9f, 0x41, 0x33, 0xdb, 0x43, 0x35, 0xc1, 0x59, 0xd2, 0x94, + 0xda, 0x94, 0xb5, 0xbf, 0x64, 0x39, 0x08, 0xdd, 0x3c, 0x67, 0xda, 0xbf, 0xd7, 0x33, 0x49, 0xd5, + 0x0f, 0x2e, 0x94, 0x61, 0xda, 0x72, 0x19, 0xb6, 0x58, 0xd2, 0xe8, 0x3f, 0xaa, 0xa4, 0xf9, 0x1c, + 0x2c, 0x17, 0xf3, 0xba, 0x77, 0x91, 0x45, 0xb6, 0xee, 0x72, 0x0e, 0x57, 0x99, 0xdf, 0xbb, 0x60, + 0xb4, 0x60, 0x16, 0x67, 0x49, 0xc2, 0x73, 0x16, 0x78, 0xdf, 0x61, 0xc3, 0x2b, 0x2e, 0x5c, 0x20, + 0x8a, 0xe9, 0x81, 0xcc, 0xf5, 0x6a, 0x7a, 0x90, 0x0d, 0x42, 0x8c, 0x62, 0x10, 0x22, 0xb4, 0x96, + 0x46, 0x9c, 0xc5, 0x49, 0x56, 0xf3, 0x49, 0x28, 0xaf, 0x9d, 0x2c, 0xc5, 0xeb, 0x04, 0x53, 0xfb, + 0x0b, 0xb0, 0xf2, 0xb3, 0x88, 0x90, 0x72, 0x70, 0x78, 0xd0, 0x97, 0x01, 0x60, 0x70, 0xd0, 0xeb, + 0xff, 0x67, 0x5b, 0x13, 0x41, 0x89, 0xf6, 0x5f, 0xf4, 0xe9, 0xb0, 0xdf, 0xd6, 0x45, 0xf0, 0xe8, + 0xf5, 0xf7, 0xfa, 0xa3, 0x7e, 0xbb, 0xf2, 0x55, 0xd5, 0xac, 0xb7, 0x4d, 0x6a, 0xb2, 0x79, 0xe4, + 0x7b, 0x13, 0x2f, 0xb1, 0x8f, 0xc1, 0xdc, 0x77, 0xa2, 0x57, 0xea, 0xf7, 0x22, 0xd7, 0xa4, 0xaa, + 0xe9, 0x57, 0x79, 0xe1, 0x3e, 0xd4, 0x55, 0x74, 0x50, 0xde, 0xb4, 0x10, 0x39, 0x32, 0x9a, 0xfd, + 0x4b, 0x0d, 0x6e, 0xef, 0x87, 0x17, 0x2c, 0x4f, 0xb2, 0x47, 0xce, 0xa5, 0x1f, 0x3a, 0xee, 0x6b, + 0x4c, 0xf7, 0x00, 0x6e, 0xf1, 0x30, 0x8d, 0x27, 0x6c, 0xbc, 0x34, 0x70, 0x68, 0x49, 0xf4, 0x33, + 0xe5, 0x82, 0x36, 0xb4, 0x5c, 0xc6, 0x93, 0x82, 0xab, 0x82, 0x5c, 0x0d, 0x81, 0xcc, 0x78, 0xf2, + 0x4a, 0xa1, 0xfa, 0xba, 0x4a, 0xc1, 0xfe, 0x9d, 0x06, 0xad, 0xfe, 0x3c, 0x0a, 0xe3, 0x24, 0x3b, + 0xe6, 0x0d, 0xee, 0xff, 0x04, 0x0c, 0x21, 0x95, 0x72, 0xe5, 0x5a, 0x1d, 0xb1, 0xf0, 0x82, 0xf4, + 0xe6, 0x10, 0xe9, 0x54, 0xf1, 0x5d, 0x5f, 0x32, 0xbd, 0x05, 0xf5, 0x34, 0xf0, 0xe6, 0xd9, 0x40, + 0xa6, 0x42, 0x0d, 0x01, 0x8e, 0xb8, 0xfd, 0x25, 0x18, 0x72, 0x8d, 0x92, 0x75, 0x1b, 0x50, 0x1f, + 0x1e, 0xef, 0xec, 0xf4, 0x87, 0xc3, 0xb6, 0x46, 0x5a, 0x60, 0xf5, 0x8e, 0x8f, 0xf6, 0x06, 0x3b, + 0xdb, 0x23, 0x65, 0xe1, 0xdd, 0xed, 0xc1, 0x5e, 0xbf, 0xd7, 0xae, 0xd8, 0x3b, 0x60, 0x8d, 0xe6, + 0x81, 0x12, 0x2f, 0xe7, 0x37, 0xed, 0x86, 0xfc, 0xa6, 0x2f, 0xe5, 0xb7, 0x21, 0x34, 0x4a, 0xf5, + 0x0e, 0x79, 0x0f, 0xaa, 0xc9, 0x3c, 0x58, 0x9c, 0x82, 0x66, 0x7b, 0x50, 0x24, 0x91, 0xf7, 0xa0, + 0x29, 0x3a, 0x2c, 0x87, 0x73, 0x6f, 0x1a, 0x30, 0x57, 0xad, 0x28, 0xba, 0xae, 0x6d, 0x85, 0xb2, + 0xef, 0x42, 0x4b, 0xb4, 0xb4, 0xde, 0x8c, 0xf1, 0xc4, 0x99, 0x45, 0x98, 0x8d, 0x55, 0x08, 0xae, + 0x52, 0x3d, 0xe1, 0xf6, 0x03, 0x68, 0x1e, 0x31, 0x16, 0x53, 0xc6, 0xa3, 0x30, 0xe0, 0xd8, 0xde, + 0x28, 0x55, 0xcb, 0x78, 0xaf, 0x20, 0xfb, 0x5b, 0xb0, 0x44, 0xc5, 0xfa, 0xd4, 0x49, 0x26, 0x67, + 0x3f, 0xa5, 0xa2, 0x7d, 0x00, 0xf5, 0x48, 0x9a, 0x48, 0xd5, 0x9f, 0x4d, 0x0c, 0x39, 0xca, 0x6c, + 0x34, 0x23, 0xda, 0x9f, 0x42, 0xe5, 0x20, 0x9d, 0x95, 0xff, 0x13, 0xa8, 0xca, 0x4a, 0x6b, 0xa1, + 0x97, 0xd3, 0x17, 0x7b, 0x39, 0xfb, 0x1b, 0x68, 0x64, 0x57, 0x1d, 0xb8, 0x38, 0xd8, 0x47, 0x55, + 0x0f, 0xdc, 0x05, 0xcd, 0xcb, 0x26, 0x89, 0x05, 0xee, 0x20, 0xd3, 0x91, 0x04, 0x16, 0xd7, 0x56, + 0x43, 0x80, 0x7c, 0xed, 0x5d, 0x68, 0x66, 0x55, 0x25, 0x96, 0x75, 0xc2, 0x78, 0xbe, 0xc7, 0x82, + 0x92, 0x61, 0x4d, 0x89, 0x18, 0xf1, 0x1b, 0xe6, 0x75, 0xf6, 0x66, 0xee, 0x58, 0x04, 0xaa, 0x93, + 0xd0, 0x95, 0x6f, 0xb0, 0x46, 0xf1, 0x5b, 0x5c, 0x78, 0xc6, 0xa7, 0x59, 0x5e, 0x9a, 0xf1, 0xa9, + 0x9d, 0x40, 0xeb, 0xa9, 0x33, 0x39, 0x4f, 0xa3, 0x2c, 0x2f, 0x94, 0x7c, 0x59, 0x5b, 0xf0, 0xe5, + 0x1b, 0x86, 0x84, 0x25, 0x37, 0x97, 0x73, 0x42, 0xe5, 0xe6, 0xc2, 0xbe, 0x89, 0x13, 0x4f, 0xd5, + 0x14, 0xd5, 0xa2, 0x0a, 0xda, 0xfa, 0xb5, 0x06, 0x55, 0x61, 0x40, 0x72, 0x0f, 0xaa, 0xfd, 0xc9, + 0x59, 0x48, 0x16, 0xec, 0xd4, 0x5d, 0x80, 0xec, 0x15, 0xf2, 0xa1, 0x1c, 0x92, 0x66, 0xb3, 0xdf, + 0x56, 0x66, 0x7f, 0xf4, 0x8f, 0x57, 0xb8, 0x37, 0xa1, 0xf1, 0x55, 0xe8, 0x05, 0x3b, 0x72, 0x6e, + 0x48, 0x96, 0xbd, 0xe5, 0x15, 0xfe, 0x8f, 0xc0, 0x18, 0x70, 0xe1, 0x96, 0xaf, 0xb2, 0x62, 0x9b, + 0x57, 0xf6, 0x58, 0x7b, 0x65, 0xeb, 0x2f, 0x3a, 0x54, 0xbf, 0x61, 0x71, 0x48, 0x3e, 0x84, 0xba, + 0x1a, 0x6a, 0x90, 0xd2, 0xf0, 0xa2, 0x8b, 0x71, 0x68, 0x69, 0xda, 0x81, 0xa7, 0x32, 0x54, 0x72, + 0x2b, 0x26, 0x2d, 0xdd, 0xab, 0x62, 0x96, 0xbd, 0xb2, 0xa1, 0x3d, 0xd1, 0xc8, 0x07, 0x60, 0xc8, + 0x07, 0xba, 0xa4, 0x9b, 0xe5, 0x56, 0xc5, 0x5e, 0x79, 0xa2, 0x91, 0x87, 0xd0, 0x18, 0x9e, 0x85, + 0xa9, 0xef, 0x0e, 0x59, 0x7c, 0xc1, 0x48, 0x69, 0xbe, 0xd7, 0x2d, 0x7d, 0xdb, 0x2b, 0x64, 0x03, + 0x40, 0xba, 0xf0, 0xb1, 0xe7, 0x72, 0x52, 0x17, 0xb4, 0x83, 0x74, 0x26, 0x17, 0x2d, 0xf9, 0xb6, + 0xe4, 0x2c, 0x3d, 0xe4, 0x9b, 0x38, 0x3f, 0x81, 0xd6, 0x0e, 0x86, 0x95, 0xc3, 0x78, 0xfb, 0x24, + 0x8c, 0x13, 0xb2, 0x3c, 0xe3, 0xeb, 0x2e, 0x23, 0xec, 0x15, 0xf2, 0x04, 0xcc, 0x51, 0x7c, 0x29, + 0xf9, 0xdf, 0x50, 0xe1, 0xa6, 0xd8, 0xef, 0x8a, 0x5b, 0x6e, 0xfd, 0x50, 0x01, 0xe3, 0xeb, 0x30, + 0x3e, 0x67, 0x31, 0x79, 0x0c, 0x06, 0xf6, 0x94, 0xca, 0x15, 0xf2, 0xfe, 0xf2, 0xaa, 0x8d, 0xee, + 0x81, 0x85, 0x4a, 0x19, 0x39, 0xfc, 0x5c, 0xaa, 0x1e, 0xff, 0x72, 0x93, 0x7a, 0x91, 0x85, 0x0a, + 0xfa, 0xc0, 0xea, 0x30, 0x89, 0x99, 0x33, 0xcb, 0xfb, 0xe8, 0x85, 0x46, 0xaf, 0x5b, 0x97, 0xbd, + 0xdc, 0x50, 0x19, 0xe7, 0x11, 0x54, 0x87, 0xf2, 0xa6, 0x82, 0xa9, 0xf8, 0x5b, 0xa2, 0xbb, 0x9a, + 0x21, 0xf2, 0x95, 0xff, 0x0d, 0x0c, 0x59, 0x63, 0xc8, 0x6b, 0x2e, 0x14, 0x61, 0xdd, 0x76, 0x19, + 0xa5, 0x04, 0x6c, 0xa8, 0x1f, 0xa5, 0xf1, 0x94, 0x8d, 0xf8, 0x92, 0xe5, 0x33, 0x1b, 0xd8, 0x2b, + 0xe4, 0x11, 0x18, 0xf2, 0xd5, 0xca, 0x45, 0x17, 0x5e, 0xb0, 0xbc, 0x99, 0x0c, 0x02, 0xa8, 0x68, + 0x43, 0xe6, 0x2e, 0xc9, 0xba, 0x90, 0xc7, 0xba, 0xaf, 0xa2, 0x50, 0x17, 0x6d, 0xca, 0x26, 0xcc, + 0x2b, 0x25, 0x77, 0x92, 0xdd, 0x7f, 0xf9, 0xf1, 0x6c, 0x68, 0xe4, 0x0b, 0x68, 0x2d, 0x14, 0x02, + 0x04, 0xf3, 0xe5, 0x55, 0xb5, 0xc1, 0xb2, 0xf0, 0xd3, 0xf6, 0x6f, 0x5f, 0xae, 0x69, 0x3f, 0xbc, + 0x5c, 0xd3, 0xfe, 0xf0, 0x72, 0x4d, 0xfb, 0xfe, 0x8f, 0x6b, 0x2b, 0x27, 0x06, 0xfe, 0xab, 0xfb, + 0xc9, 0xdf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x6e, 0x01, 0x18, 0xf0, 0x1d, 0x00, 0x00, } diff --git a/stream/stream.go b/stream/stream.go index 6fe6df8de5f..f51e9b0f7b3 100644 --- a/stream/stream.go +++ b/stream/stream.go @@ -195,8 +195,7 @@ func (sl *Lists) produceKVs(ctx context.Context, ts uint64, } } -func (sl *Lists) streamKVs(ctx context.Context, prefix string, - kvChan chan *pb.KVS) error { +func (sl *Lists) streamKVs(ctx context.Context, prefix string, kvChan chan *pb.KVS) error { var count int var bytesSent uint64 t := time.NewTicker(time.Second) @@ -224,7 +223,7 @@ func (sl *Lists) streamKVs(ctx context.Context, prefix string, if err := sl.Stream.Send(batch); err != nil { return err } - glog.V(2).Infof("%s Created batch of size: %s in %v.\n", + glog.V(2).Infof("%s Created batch of size: %s in %s.\n", prefix, humanize.Bytes(sz), time.Since(t)) return nil } @@ -243,7 +242,7 @@ outer: continue } speed := bytesSent / durSec - glog.Infof("%s Time elapsed: %v, bytes sent: %s, speed: %v/sec\n", + glog.Infof("%s Time elapsed: %s, bytes sent: %s, speed: %s/sec\n", prefix, x.FixedDuration(dur), humanize.Bytes(bytesSent), humanize.Bytes(speed)) case kvs, ok := <-kvChan: diff --git a/worker/backup.go b/worker/backup.go index cb21fb1665f..ebb6d305686 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -37,23 +37,27 @@ func backupProcess(ctx context.Context, req *pb.BackupRequest) error { } // sanity, make sure this is our group. if groups().groupId() != req.GroupId { - err := x.Errorf("Backup request group mismatch. Mine: %d. Requested: %d\n", + return x.Errorf("Backup request group mismatch. Mine: %d. Requested: %d\n", groups().groupId(), req.GroupId) - return err } // wait for this node to catch-up. if err := posting.Oracle().WaitForTs(ctx, req.ReadTs); err != nil { return err } + // calculate upload size + var sz int64 + for _, t := range groups().tablets { + if t.GroupId == req.GroupId { + sz += t.Space + } + } // create backup request and process it. br := &backup.Request{ - ReadTs: req.ReadTs, - GroupId: req.GroupId, - UnixTs: fmt.Sprint(time.Now().UTC().UnixNano()), - TargetURI: req.Target, - DB: pstore, + DB: pstore, + Prefix: fmt.Sprintf("%s-g%d-r%d", req.UnixTs, req.GroupId, req.ReadTs), + Sizex: int64(float64(sz) * 1.18), } - if err := br.Process(ctx); err != nil { + if err := br.Process(ctx, req); err != nil { return err } return nil @@ -71,13 +75,12 @@ func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.Sta return &resp, nil } -// TODO: add stop to all goroutines to cancel on failure. func backupDispatch(ctx context.Context, in *pb.BackupRequest, gids []uint32) chan error { statusCh := make(chan error) go func() { glog.Infof("Dispatching backup requests...") for _, gid := range gids { - glog.V(3).Infof("dispatching to group %d snapshot at %d", gid, in.ReadTs) + glog.V(3).Infof("sent to group %d snapshot at %d", gid, in.ReadTs) in := in in.GroupId = gid // this node is part of the group, process backup. @@ -103,7 +106,10 @@ func backupDispatch(ctx context.Context, in *pb.BackupRequest, gids []uint32) ch } // BackupOverNetwork handles a request coming from an HTTP client. -func BackupOverNetwork(ctx context.Context, target string) error { +func BackupOverNetwork(pctx context.Context, target string) error { + ctx, cancel := context.WithCancel(pctx) + defer cancel() + // Check that this node can accept requests. if err := x.HealthCheck(); err != nil { glog.Errorf("Backup canceled, not ready to accept requests: %s", err) @@ -128,7 +134,11 @@ func BackupOverNetwork(ctx context.Context, target string) error { // This will dispatch the request to all groups and wait for their response. // If we receive any failures, we cancel the process. - req := &pb.BackupRequest{ReadTs: readTs, Target: target} + req := &pb.BackupRequest{ + ReadTs: readTs, + Target: target, + UnixTs: fmt.Sprint(time.Now().UTC().UnixNano()), + } for err := range backupDispatch(ctx, req, gids) { if err != nil { glog.Errorf("Error while running backup: %s", err) diff --git a/x/file.go b/x/file.go index 9f95061018b..ebea1e9fc4e 100644 --- a/x/file.go +++ b/x/file.go @@ -17,7 +17,6 @@ package x import ( - "io" "os" ) @@ -38,8 +37,3 @@ func WriteFileSync(filename string, data []byte, perm os.FileMode) error { } return nil } - -// Writeq is a quiet write. Writes b to w and eats up the return. -func Writeq(w io.Writer, b []byte) { - _, _ = w.Write(b) -} From 255f8f4e0feb3eab6d59eedc2b7936dcb5a00ab4 Mon Sep 17 00:00:00 2001 From: Manish R Jain Date: Fri, 2 Nov 2018 20:02:57 -0700 Subject: [PATCH 15/25] Initial pass at simplifying things. --- ee/backup/backup.go | 7 ++- ee/backup/handler.go | 63 -------------------- ee/backup/handler_file.go | 33 +++++------ ee/backup/handler_s3.go | 121 +++++++++++++++++++++----------------- ee/backup/session.go | 20 ------- ee/backup/writer.go | 50 ++++++++++------ worker/backup.go | 98 +++++++++++++++--------------- 7 files changed, 165 insertions(+), 227 deletions(-) delete mode 100644 ee/backup/handler.go delete mode 100644 ee/backup/session.go diff --git a/ee/backup/backup.go b/ee/backup/backup.go index f2ca6314ac2..dc7a31896d8 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -20,16 +20,16 @@ import ( // Request has all the information needed to perform a backup. type Request struct { DB *badger.DB // Badger pstore managed by this node. - Prefix string // target file name prefix Sizex int64 // approximate upload size + Backup *pb.BackupRequest } // Process uses the request values to create a stream writer then hand off the data // retrieval to stream.Orchestrate. The writer will create all the fd's needed to // collect the data and later move to the target. // Returns errors on failure, nil on success. -func (r *Request) Process(ctx context.Context, br *pb.BackupRequest) error { - w, err := newWriter(r, br.Target) +func (r *Request) Process(ctx context.Context) error { + w, err := r.newWriter() if err != nil { return err } @@ -60,6 +60,7 @@ func (r *Request) Process(ctx context.Context, br *pb.BackupRequest) error { return l.MarshalToKv() } + br := r.Backup glog.V(2).Infof("Backup started ...") if err = sl.Orchestrate(ctx, "Backup", br.ReadTs); err != nil { return err diff --git a/ee/backup/handler.go b/ee/backup/handler.go deleted file mode 100644 index 777c0de2b41..00000000000 --- a/ee/backup/handler.go +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package backup - -import ( - "io" - "sync" - - "github.com/dgraph-io/dgraph/x" -) - -// handler interface is implemented by URI scheme handlers. -type handler interface { - // Handlers know how to Write and Close to their target. - io.WriteCloser - // Session receives the host and path of the target. It should get all its configuration - // from the environment. - Open(*session) error - New() handler -} - -// handlers map URI scheme to a handler. -// List of possible handlers: -// file - local file or NFS mounted (default if no scheme detected) -// http - multipart HTTP upload -// gs - Google Cloud Storage -// s3 - Amazon S3 -// as - Azure Storage -var handlers struct { - sync.Mutex - m map[string]handler -} - -// getHandler takes an URI scheme and finds a handler for it. -// Returns the handler on success, error otherwise. -func getHandler(scheme string) (handler, error) { - handlers.Lock() - defer handlers.Unlock() - // target might be just a dir like '/tmp/backup', then default to local file handler. - if scheme == "" { - scheme = "file" - } - if h, ok := handlers.m[scheme]; ok { - return h.New(), nil - } - return nil, x.Errorf("Unsupported URI scheme %q", scheme) -} - -// addHandler registers a new scheme handler. If the handler is already registered -// we just ignore the request. -func addHandler(scheme string, h handler) { - handlers.Lock() - defer handlers.Unlock() - if handlers.m == nil { - handlers.m = make(map[string]handler) - } - if _, ok := handlers.m[scheme]; !ok { - handlers.m[scheme] = h - } -} diff --git a/ee/backup/handler_file.go b/ee/backup/handler_file.go index 3409a4e09b9..2fe56976222 100644 --- a/ee/backup/handler_file.go +++ b/ee/backup/handler_file.go @@ -6,6 +6,8 @@ package backup import ( + "fmt" + "net/url" "os" "path/filepath" @@ -16,30 +18,30 @@ import ( // fileHandler is used for 'file:' URI scheme. type fileHandler struct { - *session fp *os.File } -// New creates a new instance of this handler. -func (h *fileHandler) New() handler { - return &fileHandler{} -} - // Open authenticates or prepares a handler session. // Returns error on failure, nil on success. -func (h *fileHandler) Open(s *session) error { +func (h *fileHandler) Open(uri *url.URL, req *Request) error { // check that this path exists and we can access it. - if !h.Exists(s.path) { - return x.Errorf("The path %q does not exist or it is inaccessible.", s.path) + if !h.exists(uri.Path) { + return x.Errorf("The path %q does not exist or it is inaccessible.", uri.Path) + } + + dir := filepath.Join(uri.Path, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs)) + if err := os.Mkdir(dir, 0700); err != nil { + return err } - path := filepath.Join(s.path, s.file) + + path := filepath.Join(dir, + fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) fp, err := os.Create(path) if err != nil { return err } - glog.V(2).Infof("using file path: %q", path) + glog.V(2).Infof("Using file path: %q", path) h.fp = fp - h.session = s return nil } @@ -56,15 +58,10 @@ func (h *fileHandler) Write(b []byte) (int, error) { // Exists checks if a path (file or dir) is found at target. // Returns true if found, false otherwise. -func (h *fileHandler) Exists(path string) bool { +func (h *fileHandler) exists(path string) bool { _, err := os.Stat(path) if err == nil { return true } return !os.IsNotExist(err) && !os.IsPermission(err) } - -// Register this handler -func init() { - addHandler("file", &fileHandler{}) -} diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index 85696b9071e..e1a5a883e55 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -6,14 +6,13 @@ package backup import ( - "bufio" + "fmt" "io" + "net/url" "os" - "path" "path/filepath" "strings" "sync/atomic" - "time" "github.com/dgraph-io/dgraph/x" @@ -28,84 +27,100 @@ const ( // s3Handler is used for 's3:' URI scheme. type s3Handler struct { - w io.Writer - n uint64 -} - -// New creates a new instance of this handler. -func (h *s3Handler) New() handler { - return &s3Handler{} + bucket string + path string + w io.Writer + n uint64 } // Open creates an AWS session and sends our data stream to an S3 blob. // URI formats: // s3:///bucket/folder1.../folderN?secure=true|false // s3:///bucket/folder1.../folderN?secure=true|false (use default S3 endpoint) -func (h *s3Handler) Open(s *session) error { +func (h *s3Handler) Open(uri *url.URL, req *Request) error { accessKeyID := os.Getenv("AWS_ACCESS_KEY_ID") secretAccessKey := os.Getenv("AWS_SECRET_ACCESS_KEY") if accessKeyID == "" || secretAccessKey == "" { return x.Errorf("Env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not set.") } + + glog.V(2).Infof("S3Handler got uri: %+v\n", uri) + var host, path string // s3:///bucket/folder - if !strings.Contains(s.host, ".") { - s.path = s.host - s.host = s3defaultEndpoint + if !strings.Contains(uri.Host, ".") { + path, host = uri.Host, s3defaultEndpoint } - glog.V(3).Infof("using S3 endpoint: %s", s.host) + glog.V(2).Infof("Backup using S3 host: %s, path: %s", host, path) - if len(s.path) < 1 { - return x.Errorf("the S3 bucket %q is invalid", s.path) + if len(path) < 1 { + return x.Errorf("The S3 bucket %q is invalid", path) } + parts := strings.Split(path[1:], "/") + h.bucket = parts[0] // bucket + // split path into bucket and blob - parts := strings.Split(s.path[1:], "/") - s.path = parts[0] // bucket - if len(parts) > 1 { - parts = append(parts, s.file) - // blob: folder1/...folderN/file1 - s.file = filepath.Join(parts[1:]...) - } - glog.V(3).Infof("sending to S3: %s", path.Join(s.host, s.path, s.file)) + h.path = filepath.Join(parts[1:]...) + h.path = filepath.Join(h.path, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs), + fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) + + // if len(parts) > 1 { + // parts = append(parts, s.file) + // // blob: folder1/...folderN/file1 + // s.file = filepath.Join(parts[1:]...) + // } + glog.V(3).Infof("Sending to S3. Path=%s", h.path) // secure by default - secure := s.Getarg("secure") != "false" + // uri.Query() + // TODO: Do the arg query here. + // secure := s.Getarg("secure") != "false" + secure := true - c, err := minio.New(s.host, accessKeyID, secretAccessKey, secure) + mc, err := minio.New(host, accessKeyID, secretAccessKey, secure) + if err != nil { + return err + } + loc, err := mc.GetBucketLocation(h.bucket) if err != nil { return err } + if err := mc.MakeBucket(path, loc); err != nil { + return err + } + // S3 transfer acceleration support. - if strings.Contains(s.host, "s3-accelerate") { - c.SetS3TransferAccelerate(s.host) + if strings.Contains(host, "s3-accelerate") { + mc.SetS3TransferAccelerate(host) } - c.TraceOn(os.Stderr) + mc.TraceOn(os.Stderr) - go h.send(c, s) + // TODO: Fix this up. + // go h.send(c, s) return nil } -func (h *s3Handler) send(c *minio.Client, s *session) { - glog.Infof("Backup streaming in background, est. %d bytes", s.size) - start := time.Now() - pr, pw := io.Pipe() - buf := bufio.NewWriterSize(pw, 5<<20) - h.w = buf - - // block until done or pipe closed. - for { - time.Sleep(10 * time.Millisecond) // wait for some buffered data - n, err := c.PutObject(s.path, s.file, pr, s.size, - minio.PutObjectOptions{}) - if err != nil { - glog.Errorf("Failure while uploading backup: %s", err) - } - glog.V(3).Infof("sent %d bytes, actual %d bytes, time elapsed %s", n, h.n, time.Since(start)) - break - } - pr.CloseWithError(nil) // EOF -} +// func (h *s3Handler) send(c *minio.Client, s *session) { +// glog.Infof("Backup streaming in background, est. %d bytes", s.size) +// start := time.Now() +// pr, pw := io.Pipe() +// buf := bufio.NewWriterSize(pw, 5<<20) +// h.w = buf + +// // block until done or pipe closed. +// for { +// time.Sleep(10 * time.Millisecond) // wait for some buffered data +// n, err := c.PutObject(s.path, s.file, pr, s.size, +// minio.PutObjectOptions{}) +// if err != nil { +// glog.Errorf("Failure while uploading backup: %s", err) +// } +// glog.V(3).Infof("sent %d bytes, actual %d bytes, time elapsed %s", n, h.n, time.Since(start)) +// break +// } +// pr.CloseWithError(nil) // EOF +// } func (h *s3Handler) Close() error { return nil @@ -116,7 +131,3 @@ func (h *s3Handler) Write(b []byte) (int, error) { atomic.AddUint64(&h.n, uint64(n)) return n, err } - -func init() { - addHandler("s3", &s3Handler{}) -} diff --git a/ee/backup/session.go b/ee/backup/session.go deleted file mode 100644 index fe24b524def..00000000000 --- a/ee/backup/session.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2018 Dgraph Labs, Inc. All rights reserved. - * - */ - -package backup - -// session holds the session config for a handler. -type session struct { - host, path, file string - args map[string][]string - size int64 -} - -func (s *session) Getarg(key string) string { - if v, ok := s.args[key]; ok && len(v) > 0 { - return v[0] - } - return "" -} diff --git a/ee/backup/writer.go b/ee/backup/writer.go index f76b90870c5..9c252ff40f7 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -7,6 +7,7 @@ package backup import ( "encoding/binary" + "io" "net/url" "github.com/dgraph-io/dgraph/protos/pb" @@ -16,10 +17,18 @@ import ( const dgraphBackupSuffix = ".dgraph-backup" +// handler interface is implemented by URI scheme handlers. +type handler interface { + // Handlers know how to Write and Close to their target. + io.WriteCloser + // Session receives the host and path of the target. It should get all its configuration + // from the environment. + Open(*url.URL, *Request) error +} + // writer handles the writes from stream.Orchestrate. It implements the kvStream interface. type writer struct { - h handler - file string + h handler } // newWriter parses the requested target URI, finds a handler and then tries to create a session. @@ -44,30 +53,37 @@ type writer struct { // as://dgraph-container/backups/ // http://backups.dgraph.io/upload // file:///tmp/dgraph/backups or /tmp/dgraph/backups?compress=gzip -func newWriter(r *Request, uri string) (*writer, error) { - u, err := url.Parse(uri) +func (r *Request) newWriter() (*writer, error) { + uri, err := url.Parse(r.Backup.Target) if err != nil { return nil, err } + // find handler for this URI scheme - h, err := getHandler(u.Scheme) - if err != nil { - return nil, err + var h handler + switch uri.Scheme { + case "file": + h = &fileHandler{} + case "s3": + h = &s3Handler{} + default: + h = &fileHandler{} } - // create session at - sess := &session{ - host: u.Host, - path: u.Path, - file: r.Prefix + dgraphBackupSuffix, - args: u.Query(), - size: r.Sizex, - } - if err := h.Open(sess); err != nil { + // // create session at + // sess := &session{ + // ui: ui, + // // host: u.Host, + // // path: u.Path, + // // file: r.Prefix + dgraphBackupSuffix, + // // args: u.Query(), + // size: r.Sizex, + // } + if err := h.Open(uri, r); err != nil { return nil, err } - return &writer{h: h, file: sess.file}, nil + return &writer{h: h}, nil } func (w *writer) cleanup() error { diff --git a/worker/backup.go b/worker/backup.go index ebb6d305686..5602574f7eb 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -17,7 +17,6 @@ package worker import ( - "fmt" "time" "github.com/dgraph-io/dgraph/ee/backup" @@ -54,19 +53,16 @@ func backupProcess(ctx context.Context, req *pb.BackupRequest) error { // create backup request and process it. br := &backup.Request{ DB: pstore, - Prefix: fmt.Sprintf("%s-g%d-r%d", req.UnixTs, req.GroupId, req.ReadTs), - Sizex: int64(float64(sz) * 1.18), + Backup: req, + Sizex: int64(float64(sz) * 1.20), // Some extra buffer for headers. } - if err := br.Process(ctx, req); err != nil { - return err - } - return nil + return br.Process(ctx) } // Backup handles a request coming from another node. func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.Status, error) { var resp pb.Status - glog.V(3).Infof("Received backup request via Grpc: %+v", req) + glog.V(2).Infof("Received backup request via Grpc: %+v", req) if err := backupProcess(ctx, req); err != nil { resp.Code = -1 resp.Msg = err.Error() @@ -75,34 +71,30 @@ func (w *grpcWorker) Backup(ctx context.Context, req *pb.BackupRequest) (*pb.Sta return &resp, nil } -func backupDispatch(ctx context.Context, in *pb.BackupRequest, gids []uint32) chan error { - statusCh := make(chan error) - go func() { - glog.Infof("Dispatching backup requests...") - for _, gid := range gids { - glog.V(3).Infof("sent to group %d snapshot at %d", gid, in.ReadTs) - in := in - in.GroupId = gid - // this node is part of the group, process backup. - if groups().groupId() == gid { - statusCh <- backupProcess(ctx, in) - continue - } - // send request to any node in the group. - pl := groups().AnyServer(gid) - if pl == nil { - statusCh <- x.Errorf("Couldn't find a server in group %d", gid) - continue - } - _, err := pb.NewWorkerClient(pl.Get()).Backup(ctx, in) - if err != nil { - glog.Errorf("Backup error group %d: %s", gid, err) - } - statusCh <- err - } - close(statusCh) - }() - return statusCh +func backupGroup(ctx context.Context, in pb.BackupRequest) error { + glog.V(2).Infof("Sending backup request: %+v\n", in) + // this node is part of the group, process backup. + if groups().groupId() == in.GroupId { + return backupProcess(ctx, &in) + } + + // send request to any node in the group. + pl := groups().AnyServer(in.GroupId) + if pl == nil { + return x.Errorf("Couldn't find a server in group %d", in.GroupId) + } + status, err := pb.NewWorkerClient(pl.Get()).Backup(ctx, &in) + if err != nil { + glog.Errorf("Backup error group %d: %s", in.GroupId, err) + return err + } + if status.Code != 0 { + err := x.Errorf("Backup error group %d: %s", in.GroupId, status.Msg) + glog.Errorln(err) + return err + } + glog.V(2).Infof("Backup request to gid=%d. OK\n", in.GroupId) + return nil } // BackupOverNetwork handles a request coming from an HTTP client. @@ -115,36 +107,40 @@ func BackupOverNetwork(pctx context.Context, target string) error { glog.Errorf("Backup canceled, not ready to accept requests: %s", err) return err } + // Get ReadTs from zero and wait for stream to catch up. ts, err := Timestamps(ctx, &pb.Num{ReadOnly: true}) if err != nil { glog.Errorf("Unable to retrieve readonly timestamp for backup: %s", err) return err } - readTs := ts.ReadOnly - glog.Infof("Got readonly ts from Zero: %d", readTs) - if err := posting.Oracle().WaitForTs(ctx, readTs); err != nil { - glog.Errorf("Error while waiting for ts: %s", err) - return err - } - // Let's first collect all groups. gids := groups().KnownGroups() - glog.Infof("Requesting backup for groups: %v", gids) + req := pb.BackupRequest{ + ReadTs: ts.ReadOnly, + Target: target, + UnixTs: time.Now().UTC().Format("20060102.1504"), + } + glog.Infof("Created backup request: %+v. Groups=%v\n", req, gids) // This will dispatch the request to all groups and wait for their response. // If we receive any failures, we cancel the process. - req := &pb.BackupRequest{ - ReadTs: readTs, - Target: target, - UnixTs: fmt.Sprint(time.Now().UTC().UnixNano()), + errCh := make(chan error, 1) + for _, gid := range gids { + req.GroupId = gid + go func() { + errCh <- backupGroup(ctx, req) + }() } - for err := range backupDispatch(ctx, req, gids) { + + for i := 0; i < len(gids); i++ { + err := <-errCh if err != nil { - glog.Errorf("Error while running backup: %s", err) + glog.Errorf("Error received during backup: %v", err) return err } } - glog.Infof("Backup done.") + req.GroupId = 0 + glog.Infof("Backup for req: %+v. OK.\n", req) return nil } From 90a394a4c2eaa8290b7e6e376ba343aefb3fc553 Mon Sep 17 00:00:00 2001 From: srfrog Date: Mon, 5 Nov 2018 21:36:37 -0700 Subject: [PATCH 16/25] cleaned up redundant code. renamed s3handler.send to s3handler.upload and removed all buffering. s3handler tests that bucket exists before working, we cant assume a region. s3handler.Close blocks until the upload is complete. --- ee/backup/backup.go | 8 +-- ee/backup/handler_s3.go | 137 ++++++++++++++++++++++------------------ ee/backup/writer.go | 11 ---- worker/backup.go | 13 ++-- 4 files changed, 83 insertions(+), 86 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index dc7a31896d8..ab9115d5105 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -20,7 +20,7 @@ import ( // Request has all the information needed to perform a backup. type Request struct { DB *badger.DB // Badger pstore managed by this node. - Sizex int64 // approximate upload size + Sizex uint64 // approximate upload size Backup *pb.BackupRequest } @@ -36,7 +36,6 @@ func (r *Request) Process(ctx context.Context) error { sl := stream.Lists{Stream: w, DB: r.DB} sl.ChooseKeyFunc = nil - // sl.ChooseKeyFunc = func(_ *badger.Item) bool { return true } sl.ItemToKVFunc = func(key []byte, itr *badger.Iterator) (*pb.KV, error) { item := itr.Item() pk := x.Parse(key) @@ -60,15 +59,14 @@ func (r *Request) Process(ctx context.Context) error { return l.MarshalToKv() } - br := r.Backup glog.V(2).Infof("Backup started ...") - if err = sl.Orchestrate(ctx, "Backup", br.ReadTs); err != nil { + if err = sl.Orchestrate(ctx, "Backup", r.Backup.ReadTs); err != nil { return err } if err = w.cleanup(); err != nil { return err } - glog.Infof("Backup complete: group %d at %d", br.GroupId, br.ReadTs) + glog.Infof("Backup complete: group %d at %d", r.Backup.GroupId, r.Backup.ReadTs) return nil } diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index e1a5a883e55..dc5e71711e5 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -13,24 +13,28 @@ import ( "path/filepath" "strings" "sync/atomic" + "time" "github.com/dgraph-io/dgraph/x" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" minio "github.com/minio/minio-go" ) const ( - s3defaultEndpoint = "s3.amazonaws.com" - s3accelerateHost = "s3-accelerate" + s3DefaultEndpoint = "s3.amazonaws.com" + s3AccelerateHost = "s3-accelerate" + s3MinioChunkSize = 64 << 20 // 64MiB, minimum upload size for single file. ) // s3Handler is used for 's3:' URI scheme. type s3Handler struct { bucket string - path string - w io.Writer - n uint64 + object string + pw *io.PipeWriter + pr *io.PipeReader + cerr chan error } // Open creates an AWS session and sends our data stream to an S3 blob. @@ -45,89 +49,100 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { } glog.V(2).Infof("S3Handler got uri: %+v\n", uri) - var host, path string // s3:///bucket/folder if !strings.Contains(uri.Host, ".") { - path, host = uri.Host, s3defaultEndpoint + uri.Path, uri.Host = uri.Host, s3DefaultEndpoint } - glog.V(2).Infof("Backup using S3 host: %s, path: %s", host, path) + glog.V(2).Infof("Backup using S3 host: %s, path: %s", uri.Host, uri.Path) - if len(path) < 1 { - return x.Errorf("The S3 bucket %q is invalid", path) + if len(uri.Path) < 1 { + return x.Errorf("The S3 bucket %q is invalid", uri.Path) } - parts := strings.Split(path[1:], "/") - h.bucket = parts[0] // bucket - // split path into bucket and blob - h.path = filepath.Join(parts[1:]...) - h.path = filepath.Join(h.path, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs), - fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) - - // if len(parts) > 1 { - // parts = append(parts, s.file) - // // blob: folder1/...folderN/file1 - // s.file = filepath.Join(parts[1:]...) - // } - glog.V(3).Infof("Sending to S3. Path=%s", h.path) + parts := strings.Split(uri.Path[1:], "/") + h.bucket = parts[0] // bucket + // The location is: /bucket/folder1...folderN/dgraph.20181106.0113/r110001-g1.backup + parts = append(parts, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs)) + parts = append(parts, fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) + h.object = filepath.Join(parts[1:]...) + glog.V(3).Infof("Sending data to S3 blob %q ...", h.object) // secure by default - // uri.Query() - // TODO: Do the arg query here. - // secure := s.Getarg("secure") != "false" - secure := true + secure := uri.Query().Get("secure") != "false" - mc, err := minio.New(host, accessKeyID, secretAccessKey, secure) + mc, err := minio.New(uri.Host, accessKeyID, secretAccessKey, secure) if err != nil { return err } - loc, err := mc.GetBucketLocation(h.bucket) + // S3 transfer acceleration support. + if strings.Contains(uri.Host, "s3-accelerate") { + mc.SetS3TransferAccelerate(uri.Host) + } + // mc.TraceOn(os.Stderr) + + found, err := mc.BucketExists(h.bucket) if err != nil { return err } - if err := mc.MakeBucket(path, loc); err != nil { - return err + if !found { + return x.Errorf("S3 bucket %q not found. Use host with specific region.", + h.bucket) } - // S3 transfer acceleration support. - if strings.Contains(host, "s3-accelerate") { - mc.SetS3TransferAccelerate(host) - } - mc.TraceOn(os.Stderr) + h.cerr = make(chan error, 1) + go h.upload(mc) - // TODO: Fix this up. - // go h.send(c, s) + glog.Infof("Uploading data, estimated size %s", humanize.Bytes(req.Sizex)) return nil } -// func (h *s3Handler) send(c *minio.Client, s *session) { -// glog.Infof("Backup streaming in background, est. %d bytes", s.size) -// start := time.Now() -// pr, pw := io.Pipe() -// buf := bufio.NewWriterSize(pw, 5<<20) -// h.w = buf - -// // block until done or pipe closed. -// for { -// time.Sleep(10 * time.Millisecond) // wait for some buffered data -// n, err := c.PutObject(s.path, s.file, pr, s.size, -// minio.PutObjectOptions{}) -// if err != nil { -// glog.Errorf("Failure while uploading backup: %s", err) -// } -// glog.V(3).Infof("sent %d bytes, actual %d bytes, time elapsed %s", n, h.n, time.Since(start)) -// break -// } -// pr.CloseWithError(nil) // EOF -// } +// progress allows us to monitor the progress of an upload. +// TODO: I used this during testing, maybe keep it turned on for -v 5 ? +type progress struct{ n uint64 } + +func (p *progress) Read(b []byte) (int, error) { + n := atomic.AddUint64(&p.n, uint64(len(b))) + if n%s3MinioChunkSize == 0 { // every 64MiB + glog.V(5).Infof("--- progress: %d", n) + } + return int(n), nil +} + +// upload will block until it's done or an error occurs. +func (h *s3Handler) upload(mc *minio.Client) { + start := time.Now() + h.pr, h.pw = io.Pipe() + n, err := mc.PutObject(h.bucket, h.object, h.pr, -1, minio.PutObjectOptions{}) + if err != nil { + glog.Errorf("Failure while uploading backup: %s", err) + h.pw.Close() + h.pr.Close() + } else { + glog.V(3).Infof("--- sent %d bytes, time elapsed %s", n, time.Since(start)) + } + h.cerr <- err +} func (h *s3Handler) Close() error { + defer close(h.cerr) + + // we are done buffering, send EOF. + if err := h.pw.CloseWithError(nil); err != nil && err != io.EOF { + glog.Errorf("Unexpected error while uploading: %s", err) + } + + glog.V(3).Infof("--- waiting for upload to complete ...") + select { + case err := <-h.cerr: + if err != nil { + return err + } + } return nil } func (h *s3Handler) Write(b []byte) (int, error) { - n, err := h.w.Write(b) - atomic.AddUint64(&h.n, uint64(n)) - return n, err + return h.pw.Write(b) } diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 9c252ff40f7..35015afb2ae 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -15,8 +15,6 @@ import ( "github.com/golang/glog" ) -const dgraphBackupSuffix = ".dgraph-backup" - // handler interface is implemented by URI scheme handlers. type handler interface { // Handlers know how to Write and Close to their target. @@ -70,15 +68,6 @@ func (r *Request) newWriter() (*writer, error) { h = &fileHandler{} } - // // create session at - // sess := &session{ - // ui: ui, - // // host: u.Host, - // // path: u.Path, - // // file: r.Prefix + dgraphBackupSuffix, - // // args: u.Query(), - // size: r.Sizex, - // } if err := h.Open(uri, r); err != nil { return nil, err } diff --git a/worker/backup.go b/worker/backup.go index 5602574f7eb..e6345710338 100644 --- a/worker/backup.go +++ b/worker/backup.go @@ -43,19 +43,14 @@ func backupProcess(ctx context.Context, req *pb.BackupRequest) error { if err := posting.Oracle().WaitForTs(ctx, req.ReadTs); err != nil { return err } - // calculate upload size - var sz int64 + // create backup request and process it. + br := &backup.Request{DB: pstore, Backup: req} + // calculate estimated upload size for _, t := range groups().tablets { if t.GroupId == req.GroupId { - sz += t.Space + br.Sizex += uint64(float64(t.Space) * 1.2) } } - // create backup request and process it. - br := &backup.Request{ - DB: pstore, - Backup: req, - Sizex: int64(float64(sz) * 1.20), // Some extra buffer for headers. - } return br.Process(ctx) } From 1963b7c2b085013524688ac99aa72330a1480bbd Mon Sep 17 00:00:00 2001 From: srfrog Date: Mon, 5 Nov 2018 21:44:28 -0700 Subject: [PATCH 17/25] unused const --- ee/backup/handler_s3.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index dc5e71711e5..0f7d1b65b76 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -76,7 +76,7 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { return err } // S3 transfer acceleration support. - if strings.Contains(uri.Host, "s3-accelerate") { + if strings.Contains(uri.Host, s3AccelerateHost) { mc.SetS3TransferAccelerate(uri.Host) } // mc.TraceOn(os.Stderr) From b38ea24c5d6f23f49ab28b29fbbff312509367db Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 6 Nov 2018 11:51:22 -0700 Subject: [PATCH 18/25] missing space --- ee/backup/handler_s3.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index 0f7d1b65b76..ce63fe0d2cd 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -16,6 +16,7 @@ import ( "time" "github.com/dgraph-io/dgraph/x" + humanize "github.com/dustin/go-humanize" "github.com/golang/glog" From 03ae950d26748c3eb0a6b0b40826f8a3a39979d8 Mon Sep 17 00:00:00 2001 From: srfrog Date: Tue, 6 Nov 2018 12:22:57 -0700 Subject: [PATCH 19/25] added progress monitoring. fixed issues found by CI --- dgraph/cmd/alpha/admin.go | 6 +++--- ee/backup/handler_s3.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dgraph/cmd/alpha/admin.go b/dgraph/cmd/alpha/admin.go index 7104649966f..2329629aabd 100644 --- a/dgraph/cmd/alpha/admin.go +++ b/dgraph/cmd/alpha/admin.go @@ -53,7 +53,7 @@ func shutDownHandler(w http.ResponseWriter, r *http.Request) { close(shutdownCh) w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"code": "Success", "message": "Server is shutting down"}`)) + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Server is shutting down"}`))) } func exportHandler(w http.ResponseWriter, r *http.Request) { @@ -66,7 +66,7 @@ func exportHandler(w http.ResponseWriter, r *http.Request) { return } w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"code": "Success", "message": "Export completed."}`)) + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Export completed."}`))) } func backupHandler(w http.ResponseWriter, r *http.Request) { @@ -84,7 +84,7 @@ func backupHandler(w http.ResponseWriter, r *http.Request) { return } w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"code": "Success", "message": "Backup completed."}`)) + x.Check2(w.Write([]byte(`{"code": "Success", "message": "Backup completed."}`))) } diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index ce63fe0d2cd..9a502c21e12 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -100,13 +100,12 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { } // progress allows us to monitor the progress of an upload. -// TODO: I used this during testing, maybe keep it turned on for -v 5 ? type progress struct{ n uint64 } func (p *progress) Read(b []byte) (int, error) { n := atomic.AddUint64(&p.n, uint64(len(b))) if n%s3MinioChunkSize == 0 { // every 64MiB - glog.V(5).Infof("--- progress: %d", n) + glog.V(5).Infof("--- upload progress: %d", n) } return int(n), nil } @@ -115,7 +114,8 @@ func (p *progress) Read(b []byte) (int, error) { func (h *s3Handler) upload(mc *minio.Client) { start := time.Now() h.pr, h.pw = io.Pipe() - n, err := mc.PutObject(h.bucket, h.object, h.pr, -1, minio.PutObjectOptions{}) + n, err := mc.PutObject(h.bucket, h.object, h.pr, -1, + minio.PutObjectOptions{Progress: &progress{}}) if err != nil { glog.Errorf("Failure while uploading backup: %s", err) h.pw.Close() From 3606eaa7d87c013415990619f1f8ff6044574937 Mon Sep 17 00:00:00 2001 From: Manish R Jain Date: Wed, 7 Nov 2018 12:05:31 -0800 Subject: [PATCH 20/25] Small fixes here and there. --- ee/backup/backup.go | 2 +- ee/backup/handler_file.go | 2 ++ ee/backup/handler_s3.go | 71 ++++++++++++++++++--------------------- ee/backup/writer.go | 4 +-- 4 files changed, 38 insertions(+), 41 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index ab9115d5105..f87fd9733be 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -63,7 +63,7 @@ func (r *Request) Process(ctx context.Context) error { if err = sl.Orchestrate(ctx, "Backup", r.Backup.ReadTs); err != nil { return err } - if err = w.cleanup(); err != nil { + if err = w.close(); err != nil { return err } glog.Infof("Backup complete: group %d at %d", r.Backup.GroupId, r.Backup.ReadTs) diff --git a/ee/backup/handler_file.go b/ee/backup/handler_file.go index 2fe56976222..34c0d9f2eb7 100644 --- a/ee/backup/handler_file.go +++ b/ee/backup/handler_file.go @@ -47,6 +47,8 @@ func (h *fileHandler) Open(uri *url.URL, req *Request) error { func (h *fileHandler) Close() error { if err := h.fp.Sync(); err != nil { + glog.Errorf("While closing file: %s. Error: %v", h.fp.Name(), err) + x.Ignore(h.fp.Close()) return err } return h.fp.Close() diff --git a/ee/backup/handler_s3.go b/ee/backup/handler_s3.go index 9a502c21e12..e19333959f4 100644 --- a/ee/backup/handler_s3.go +++ b/ee/backup/handler_s3.go @@ -12,7 +12,6 @@ import ( "os" "path/filepath" "strings" - "sync/atomic" "time" "github.com/dgraph-io/dgraph/x" @@ -26,16 +25,15 @@ import ( const ( s3DefaultEndpoint = "s3.amazonaws.com" s3AccelerateHost = "s3-accelerate" - s3MinioChunkSize = 64 << 20 // 64MiB, minimum upload size for single file. ) // s3Handler is used for 's3:' URI scheme. type s3Handler struct { - bucket string - object string - pw *io.PipeWriter - pr *io.PipeReader - cerr chan error + bucket string + object string + pwriter *io.PipeWriter + preader *io.PipeReader + cerr chan error } // Open creates an AWS session and sends our data stream to an S3 blob. @@ -87,63 +85,60 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { return err } if !found { - return x.Errorf("S3 bucket %q not found. Use host with specific region.", - h.bucket) + return x.Errorf("S3 bucket %q not found. Use host with specific region.", h.bucket) } h.cerr = make(chan error, 1) - go h.upload(mc) + go func() { + h.cerr <- h.upload(mc) + }() glog.Infof("Uploading data, estimated size %s", humanize.Bytes(req.Sizex)) - return nil } // progress allows us to monitor the progress of an upload. -type progress struct{ n uint64 } +type progress struct{ bytes, count int } func (p *progress) Read(b []byte) (int, error) { - n := atomic.AddUint64(&p.n, uint64(len(b))) - if n%s3MinioChunkSize == 0 { // every 64MiB - glog.V(5).Infof("--- upload progress: %d", n) + p.count++ + p.bytes += len(b) + if p.count%10 == 0 { + glog.V(2).Infof("Backup Progress: Uploaded %s.\n", humanize.Bytes(uint64(p.bytes))) } - return int(n), nil + return len(b), nil } // upload will block until it's done or an error occurs. -func (h *s3Handler) upload(mc *minio.Client) { +func (h *s3Handler) upload(mc *minio.Client) error { start := time.Now() - h.pr, h.pw = io.Pipe() - n, err := mc.PutObject(h.bucket, h.object, h.pr, -1, + h.preader, h.pwriter = io.Pipe() + n, err := mc.PutObject(h.bucket, h.object, h.preader, -1, minio.PutObjectOptions{Progress: &progress{}}) + glog.V(2).Infof("Backup sent %d bytes. Time elapsed: %s", + n, time.Since(start).Round(time.Second)) + if err != nil { - glog.Errorf("Failure while uploading backup: %s", err) - h.pw.Close() - h.pr.Close() - } else { - glog.V(3).Infof("--- sent %d bytes, time elapsed %s", n, time.Since(start)) + // This should cause Write to fail as well. + glog.Errorf("Backup: Closing RW pipe due to error: %v", err) + h.pwriter.Close() + h.preader.Close() } - h.cerr <- err + return err } func (h *s3Handler) Close() error { - defer close(h.cerr) - // we are done buffering, send EOF. - if err := h.pw.CloseWithError(nil); err != nil && err != io.EOF { - glog.Errorf("Unexpected error while uploading: %s", err) + if err := h.pwriter.CloseWithError(nil); err != nil && err != io.EOF { + glog.Errorf("Unexpected error while uploading: %v", err) } - - glog.V(3).Infof("--- waiting for upload to complete ...") - select { - case err := <-h.cerr: - if err != nil { - return err - } + if err := h.preader.Close(); err != nil { + glog.Errorf("Error while closing pipe reader: %v", err) } - return nil + glog.V(2).Infof("Backup waiting for upload to complete.") + return <-h.cerr } func (h *s3Handler) Write(b []byte) (int, error) { - return h.pw.Write(b) + return h.pwriter.Write(b) } diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 35015afb2ae..0e88768e127 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -75,8 +75,8 @@ func (r *Request) newWriter() (*writer, error) { return &writer{h: h}, nil } -func (w *writer) cleanup() error { - glog.V(2).Infof("Backup cleanup ...") +func (w *writer) close() error { + glog.V(2).Infof("Backup: Closing handler.") return w.h.Close() } From 7688e76e1b31d730bca37d5fcaf35cdc1ebbe5b2 Mon Sep 17 00:00:00 2001 From: Manish R Jain Date: Wed, 7 Nov 2018 12:06:53 -0800 Subject: [PATCH 21/25] Rename handler files. --- ee/backup/{handler_file.go => file_handler.go} | 0 ee/backup/{handler_s3.go => s3_handler.go} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename ee/backup/{handler_file.go => file_handler.go} (100%) rename ee/backup/{handler_s3.go => s3_handler.go} (100%) diff --git a/ee/backup/handler_file.go b/ee/backup/file_handler.go similarity index 100% rename from ee/backup/handler_file.go rename to ee/backup/file_handler.go diff --git a/ee/backup/handler_s3.go b/ee/backup/s3_handler.go similarity index 100% rename from ee/backup/handler_s3.go rename to ee/backup/s3_handler.go From a2af931170cfa8a58ea4ecae470940bbe2750e13 Mon Sep 17 00:00:00 2001 From: Manish R Jain Date: Wed, 7 Nov 2018 16:51:55 -0800 Subject: [PATCH 22/25] Both S3 uploads and file writes are tested to work. --- ee/backup/backup.go | 4 ++-- ee/backup/s3_handler.go | 35 +++++++++++++---------------------- ee/backup/writer.go | 18 ++++++++++++++---- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index f87fd9733be..7fb178888c2 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -60,10 +60,10 @@ func (r *Request) Process(ctx context.Context) error { } glog.V(2).Infof("Backup started ...") - if err = sl.Orchestrate(ctx, "Backup", r.Backup.ReadTs); err != nil { + if err = sl.Orchestrate(ctx, "Backup:", r.Backup.ReadTs); err != nil { return err } - if err = w.close(); err != nil { + if err = w.flush(); err != nil { return err } glog.Infof("Backup complete: group %d at %d", r.Backup.GroupId, r.Backup.ReadTs) diff --git a/ee/backup/s3_handler.go b/ee/backup/s3_handler.go index e19333959f4..ccea3baf362 100644 --- a/ee/backup/s3_handler.go +++ b/ee/backup/s3_handler.go @@ -47,10 +47,10 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { return x.Errorf("Env vars AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY not set.") } - glog.V(2).Infof("S3Handler got uri: %+v\n", uri) + glog.V(2).Infof("S3Handler got uri: %+v. Host: %s. Path: %s\n", uri, uri.Host, uri.Path) // s3:///bucket/folder if !strings.Contains(uri.Host, ".") { - uri.Path, uri.Host = uri.Host, s3DefaultEndpoint + uri.Host = s3DefaultEndpoint } glog.V(2).Infof("Backup using S3 host: %s, path: %s", uri.Host, uri.Path) @@ -63,9 +63,9 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { h.bucket = parts[0] // bucket // The location is: /bucket/folder1...folderN/dgraph.20181106.0113/r110001-g1.backup parts = append(parts, fmt.Sprintf("dgraph.%s", req.Backup.UnixTs)) - parts = append(parts, fmt.Sprintf("r%d-g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) + parts = append(parts, fmt.Sprintf("r%d.g%d.backup", req.Backup.ReadTs, req.Backup.GroupId)) h.object = filepath.Join(parts[1:]...) - glog.V(3).Infof("Sending data to S3 blob %q ...", h.object) + glog.V(2).Infof("Sending data to S3 blob %q ...", h.object) // secure by default secure := uri.Query().Get("secure") != "false" @@ -82,10 +82,12 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { found, err := mc.BucketExists(h.bucket) if err != nil { + return x.Errorf("Error while looking for bucket: %s at host: %s. Error: %v", + h.bucket, uri.Host, err) return err } if !found { - return x.Errorf("S3 bucket %q not found. Use host with specific region.", h.bucket) + return x.Errorf("S3 bucket %s not found.", h.bucket) } h.cerr = make(chan error, 1) @@ -97,24 +99,16 @@ func (h *s3Handler) Open(uri *url.URL, req *Request) error { return nil } -// progress allows us to monitor the progress of an upload. -type progress struct{ bytes, count int } - -func (p *progress) Read(b []byte) (int, error) { - p.count++ - p.bytes += len(b) - if p.count%10 == 0 { - glog.V(2).Infof("Backup Progress: Uploaded %s.\n", humanize.Bytes(uint64(p.bytes))) - } - return len(b), nil -} - // upload will block until it's done or an error occurs. func (h *s3Handler) upload(mc *minio.Client) error { start := time.Now() h.preader, h.pwriter = io.Pipe() - n, err := mc.PutObject(h.bucket, h.object, h.preader, -1, - minio.PutObjectOptions{Progress: &progress{}}) + + // We don't need to have a progress object, because we're using a Pipe. A write to Pipe would + // block until it can be fully read. So, the rate of the writes here would be equal to the rate + // of upload. We're already tracking progress of the writes in stream.Lists, so no need to track + // the progress of read. By definition, it must be the same. + n, err := mc.PutObject(h.bucket, h.object, h.preader, -1, minio.PutObjectOptions{}) glog.V(2).Infof("Backup sent %d bytes. Time elapsed: %s", n, time.Since(start).Round(time.Second)) @@ -132,9 +126,6 @@ func (h *s3Handler) Close() error { if err := h.pwriter.CloseWithError(nil); err != nil && err != io.EOF { glog.Errorf("Unexpected error while uploading: %v", err) } - if err := h.preader.Close(); err != nil { - glog.Errorf("Error while closing pipe reader: %v", err) - } glog.V(2).Infof("Backup waiting for upload to complete.") return <-h.cerr } diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 0e88768e127..e837f2afdf6 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -9,8 +9,10 @@ import ( "encoding/binary" "io" "net/url" + "strings" "github.com/dgraph-io/dgraph/protos/pb" + "github.com/dgraph-io/dgraph/x" "github.com/golang/glog" ) @@ -64,8 +66,16 @@ func (r *Request) newWriter() (*writer, error) { h = &fileHandler{} case "s3": h = &s3Handler{} - default: - h = &fileHandler{} + case "http": + fallthrough + case "https": + if strings.HasPrefix(uri.Host, "s3") && + strings.HasSuffix(uri.Host, ".amazonaws.com") { + h = &s3Handler{} + } + } + if h == nil { + return nil, x.Errorf("Unable to handle url: %v", uri) } if err := h.Open(uri, r); err != nil { @@ -75,8 +85,8 @@ func (r *Request) newWriter() (*writer, error) { return &writer{h: h}, nil } -func (w *writer) close() error { - glog.V(2).Infof("Backup: Closing handler.") +func (w *writer) flush() error { + glog.V(2).Infof("Backup closing handler.") return w.h.Close() } From f8dc11172a35c7b9c13e404ec2462b0397e34e90 Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 7 Nov 2018 22:21:31 -0700 Subject: [PATCH 23/25] renamed writer.cleapup to writer.close --- ee/backup/backup.go | 2 +- ee/backup/writer.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ee/backup/backup.go b/ee/backup/backup.go index ab9115d5105..f87fd9733be 100644 --- a/ee/backup/backup.go +++ b/ee/backup/backup.go @@ -63,7 +63,7 @@ func (r *Request) Process(ctx context.Context) error { if err = sl.Orchestrate(ctx, "Backup", r.Backup.ReadTs); err != nil { return err } - if err = w.cleanup(); err != nil { + if err = w.close(); err != nil { return err } glog.Infof("Backup complete: group %d at %d", r.Backup.GroupId, r.Backup.ReadTs) diff --git a/ee/backup/writer.go b/ee/backup/writer.go index 35015afb2ae..53d25f95b46 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -75,7 +75,7 @@ func (r *Request) newWriter() (*writer, error) { return &writer{h: h}, nil } -func (w *writer) cleanup() error { +func (w *writer) close() error { glog.V(2).Infof("Backup cleanup ...") return w.h.Close() } From 4116b46dc04726e7a80317b4f927b26f002b8ae1 Mon Sep 17 00:00:00 2001 From: srfrog Date: Wed, 7 Nov 2018 22:28:46 -0700 Subject: [PATCH 24/25] regenerated protos --- protos/pb/pb.pb.go | 513 +++++++++++++++++++++++---------------------- 1 file changed, 259 insertions(+), 254 deletions(-) diff --git a/protos/pb/pb.pb.go b/protos/pb/pb.pb.go index 3a5d81e152b..43ced2c8d3b 100644 --- a/protos/pb/pb.pb.go +++ b/protos/pb/pb.pb.go @@ -48,7 +48,7 @@ func (x DirectedEdge_Op) String() string { return proto.EnumName(DirectedEdge_Op_name, int32(x)) } func (DirectedEdge_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{17, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{17, 0} } type Posting_ValType int32 @@ -95,7 +95,7 @@ func (x Posting_ValType) String() string { return proto.EnumName(Posting_ValType_name, int32(x)) } func (Posting_ValType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 0} } type Posting_PostingType int32 @@ -121,7 +121,7 @@ func (x Posting_PostingType) String() string { return proto.EnumName(Posting_PostingType_name, int32(x)) } func (Posting_PostingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24, 1} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24, 1} } type SchemaUpdate_Directive int32 @@ -150,7 +150,7 @@ func (x SchemaUpdate_Directive) String() string { return proto.EnumName(SchemaUpdate_Directive_name, int32(x)) } func (SchemaUpdate_Directive) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{36, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{36, 0} } type ExportPayload_Status int32 @@ -179,7 +179,7 @@ func (x ExportPayload_Status) String() string { return proto.EnumName(ExportPayload_Status_name, int32(x)) } func (ExportPayload_Status) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{39, 0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{39, 0} } type List struct { @@ -193,7 +193,7 @@ func (m *List) Reset() { *m = List{} } func (m *List) String() string { return proto.CompactTextString(m) } func (*List) ProtoMessage() {} func (*List) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{0} + return fileDescriptor_pb_d366d8792d76fc2b, []int{0} } func (m *List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -241,7 +241,7 @@ func (m *TaskValue) Reset() { *m = TaskValue{} } func (m *TaskValue) String() string { return proto.CompactTextString(m) } func (*TaskValue) ProtoMessage() {} func (*TaskValue) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{1} + return fileDescriptor_pb_d366d8792d76fc2b, []int{1} } func (m *TaskValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -297,7 +297,7 @@ func (m *SrcFunction) Reset() { *m = SrcFunction{} } func (m *SrcFunction) String() string { return proto.CompactTextString(m) } func (*SrcFunction) ProtoMessage() {} func (*SrcFunction) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{2} + return fileDescriptor_pb_d366d8792d76fc2b, []int{2} } func (m *SrcFunction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -370,7 +370,7 @@ func (m *Query) Reset() { *m = Query{} } func (m *Query) String() string { return proto.CompactTextString(m) } func (*Query) ProtoMessage() {} func (*Query) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{3} + return fileDescriptor_pb_d366d8792d76fc2b, []int{3} } func (m *Query) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +487,7 @@ func (m *ValueList) Reset() { *m = ValueList{} } func (m *ValueList) String() string { return proto.CompactTextString(m) } func (*ValueList) ProtoMessage() {} func (*ValueList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{4} + return fileDescriptor_pb_d366d8792d76fc2b, []int{4} } func (m *ValueList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -534,7 +534,7 @@ func (m *LangList) Reset() { *m = LangList{} } func (m *LangList) String() string { return proto.CompactTextString(m) } func (*LangList) ProtoMessage() {} func (*LangList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{5} + return fileDescriptor_pb_d366d8792d76fc2b, []int{5} } func (m *LangList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -587,7 +587,7 @@ func (m *Result) Reset() { *m = Result{} } func (m *Result) String() string { return proto.CompactTextString(m) } func (*Result) ProtoMessage() {} func (*Result) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{6} + return fileDescriptor_pb_d366d8792d76fc2b, []int{6} } func (m *Result) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -678,7 +678,7 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{7} + return fileDescriptor_pb_d366d8792d76fc2b, []int{7} } func (m *Order) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -743,7 +743,7 @@ func (m *SortMessage) Reset() { *m = SortMessage{} } func (m *SortMessage) String() string { return proto.CompactTextString(m) } func (*SortMessage) ProtoMessage() {} func (*SortMessage) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{8} + return fileDescriptor_pb_d366d8792d76fc2b, []int{8} } func (m *SortMessage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -818,7 +818,7 @@ func (m *SortResult) Reset() { *m = SortResult{} } func (m *SortResult) String() string { return proto.CompactTextString(m) } func (*SortResult) ProtoMessage() {} func (*SortResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{9} + return fileDescriptor_pb_d366d8792d76fc2b, []int{9} } func (m *SortResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +868,7 @@ func (m *RaftContext) Reset() { *m = RaftContext{} } func (m *RaftContext) String() string { return proto.CompactTextString(m) } func (*RaftContext) ProtoMessage() {} func (*RaftContext) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{10} + return fileDescriptor_pb_d366d8792d76fc2b, []int{10} } func (m *RaftContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -945,7 +945,7 @@ func (m *Member) Reset() { *m = Member{} } func (m *Member) String() string { return proto.CompactTextString(m) } func (*Member) ProtoMessage() {} func (*Member) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{11} + return fileDescriptor_pb_d366d8792d76fc2b, []int{11} } func (m *Member) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1035,7 +1035,7 @@ func (m *Group) Reset() { *m = Group{} } func (m *Group) String() string { return proto.CompactTextString(m) } func (*Group) ProtoMessage() {} func (*Group) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{12} + return fileDescriptor_pb_d366d8792d76fc2b, []int{12} } func (m *Group) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1096,7 +1096,7 @@ func (m *ZeroProposal) Reset() { *m = ZeroProposal{} } func (m *ZeroProposal) String() string { return proto.CompactTextString(m) } func (*ZeroProposal) ProtoMessage() {} func (*ZeroProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{13} + return fileDescriptor_pb_d366d8792d76fc2b, []int{13} } func (m *ZeroProposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1202,7 @@ func (m *MembershipState) Reset() { *m = MembershipState{} } func (m *MembershipState) String() string { return proto.CompactTextString(m) } func (*MembershipState) ProtoMessage() {} func (*MembershipState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{14} + return fileDescriptor_pb_d366d8792d76fc2b, []int{14} } func (m *MembershipState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1300,7 +1300,7 @@ func (m *ConnectionState) Reset() { *m = ConnectionState{} } func (m *ConnectionState) String() string { return proto.CompactTextString(m) } func (*ConnectionState) ProtoMessage() {} func (*ConnectionState) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{15} + return fileDescriptor_pb_d366d8792d76fc2b, []int{15} } func (m *ConnectionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1366,7 +1366,7 @@ func (m *Tablet) Reset() { *m = Tablet{} } func (m *Tablet) String() string { return proto.CompactTextString(m) } func (*Tablet) ProtoMessage() {} func (*Tablet) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{16} + return fileDescriptor_pb_d366d8792d76fc2b, []int{16} } func (m *Tablet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1456,7 +1456,7 @@ func (m *DirectedEdge) Reset() { *m = DirectedEdge{} } func (m *DirectedEdge) String() string { return proto.CompactTextString(m) } func (*DirectedEdge) ProtoMessage() {} func (*DirectedEdge) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{17} + return fileDescriptor_pb_d366d8792d76fc2b, []int{17} } func (m *DirectedEdge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1564,7 +1564,7 @@ func (m *Mutations) Reset() { *m = Mutations{} } func (m *Mutations) String() string { return proto.CompactTextString(m) } func (*Mutations) ProtoMessage() {} func (*Mutations) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{18} + return fileDescriptor_pb_d366d8792d76fc2b, []int{18} } func (m *Mutations) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1646,7 +1646,7 @@ func (m *KeyValues) Reset() { *m = KeyValues{} } func (m *KeyValues) String() string { return proto.CompactTextString(m) } func (*KeyValues) ProtoMessage() {} func (*KeyValues) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{19} + return fileDescriptor_pb_d366d8792d76fc2b, []int{19} } func (m *KeyValues) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1697,7 +1697,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} } func (m *Snapshot) String() string { return proto.CompactTextString(m) } func (*Snapshot) ProtoMessage() {} func (*Snapshot) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{20} + return fileDescriptor_pb_d366d8792d76fc2b, []int{20} } func (m *Snapshot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1771,7 +1771,7 @@ func (m *Proposal) Reset() { *m = Proposal{} } func (m *Proposal) String() string { return proto.CompactTextString(m) } func (*Proposal) ProtoMessage() {} func (*Proposal) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{21} + return fileDescriptor_pb_d366d8792d76fc2b, []int{21} } func (m *Proposal) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,7 +1862,7 @@ func (m *KVS) Reset() { *m = KVS{} } func (m *KVS) String() string { return proto.CompactTextString(m) } func (*KVS) ProtoMessage() {} func (*KVS) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{22} + return fileDescriptor_pb_d366d8792d76fc2b, []int{22} } func (m *KVS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1919,7 +1919,7 @@ func (m *KV) Reset() { *m = KV{} } func (m *KV) String() string { return proto.CompactTextString(m) } func (*KV) ProtoMessage() {} func (*KV) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{23} + return fileDescriptor_pb_d366d8792d76fc2b, []int{23} } func (m *KV) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1998,7 +1998,7 @@ func (m *Posting) Reset() { *m = Posting{} } func (m *Posting) String() string { return proto.CompactTextString(m) } func (*Posting) ProtoMessage() {} func (*Posting) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{24} + return fileDescriptor_pb_d366d8792d76fc2b, []int{24} } func (m *Posting) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2112,7 +2112,7 @@ func (m *UidBlock) Reset() { *m = UidBlock{} } func (m *UidBlock) String() string { return proto.CompactTextString(m) } func (*UidBlock) ProtoMessage() {} func (*UidBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{25} + return fileDescriptor_pb_d366d8792d76fc2b, []int{25} } func (m *UidBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2167,7 +2167,7 @@ func (m *UidPack) Reset() { *m = UidPack{} } func (m *UidPack) String() string { return proto.CompactTextString(m) } func (*UidPack) ProtoMessage() {} func (*UidPack) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{26} + return fileDescriptor_pb_d366d8792d76fc2b, []int{26} } func (m *UidPack) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2223,7 +2223,7 @@ func (m *PostingList) Reset() { *m = PostingList{} } func (m *PostingList) String() string { return proto.CompactTextString(m) } func (*PostingList) ProtoMessage() {} func (*PostingList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{27} + return fileDescriptor_pb_d366d8792d76fc2b, []int{27} } func (m *PostingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2285,7 +2285,7 @@ func (m *FacetParam) Reset() { *m = FacetParam{} } func (m *FacetParam) String() string { return proto.CompactTextString(m) } func (*FacetParam) ProtoMessage() {} func (*FacetParam) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{28} + return fileDescriptor_pb_d366d8792d76fc2b, []int{28} } func (m *FacetParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2340,7 @@ func (m *FacetParams) Reset() { *m = FacetParams{} } func (m *FacetParams) String() string { return proto.CompactTextString(m) } func (*FacetParams) ProtoMessage() {} func (*FacetParams) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{29} + return fileDescriptor_pb_d366d8792d76fc2b, []int{29} } func (m *FacetParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2394,7 +2394,7 @@ func (m *Facets) Reset() { *m = Facets{} } func (m *Facets) String() string { return proto.CompactTextString(m) } func (*Facets) ProtoMessage() {} func (*Facets) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{30} + return fileDescriptor_pb_d366d8792d76fc2b, []int{30} } func (m *Facets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2441,7 +2441,7 @@ func (m *FacetsList) Reset() { *m = FacetsList{} } func (m *FacetsList) String() string { return proto.CompactTextString(m) } func (*FacetsList) ProtoMessage() {} func (*FacetsList) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{31} + return fileDescriptor_pb_d366d8792d76fc2b, []int{31} } func (m *FacetsList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2490,7 +2490,7 @@ func (m *Function) Reset() { *m = Function{} } func (m *Function) String() string { return proto.CompactTextString(m) } func (*Function) ProtoMessage() {} func (*Function) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{32} + return fileDescriptor_pb_d366d8792d76fc2b, []int{32} } func (m *Function) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2554,7 +2554,7 @@ func (m *FilterTree) Reset() { *m = FilterTree{} } func (m *FilterTree) String() string { return proto.CompactTextString(m) } func (*FilterTree) ProtoMessage() {} func (*FilterTree) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{33} + return fileDescriptor_pb_d366d8792d76fc2b, []int{33} } func (m *FilterTree) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2619,7 +2619,7 @@ func (m *SchemaRequest) Reset() { *m = SchemaRequest{} } func (m *SchemaRequest) String() string { return proto.CompactTextString(m) } func (*SchemaRequest) ProtoMessage() {} func (*SchemaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{34} + return fileDescriptor_pb_d366d8792d76fc2b, []int{34} } func (m *SchemaRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2680,7 +2680,7 @@ func (m *SchemaResult) Reset() { *m = SchemaResult{} } func (m *SchemaResult) String() string { return proto.CompactTextString(m) } func (*SchemaResult) ProtoMessage() {} func (*SchemaResult) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{35} + return fileDescriptor_pb_d366d8792d76fc2b, []int{35} } func (m *SchemaResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2734,7 +2734,7 @@ func (m *SchemaUpdate) Reset() { *m = SchemaUpdate{} } func (m *SchemaUpdate) String() string { return proto.CompactTextString(m) } func (*SchemaUpdate) ProtoMessage() {} func (*SchemaUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{36} + return fileDescriptor_pb_d366d8792d76fc2b, []int{36} } func (m *SchemaUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2834,7 +2834,7 @@ func (m *MapEntry) Reset() { *m = MapEntry{} } func (m *MapEntry) String() string { return proto.CompactTextString(m) } func (*MapEntry) ProtoMessage() {} func (*MapEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{37} + return fileDescriptor_pb_d366d8792d76fc2b, []int{37} } func (m *MapEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2898,7 +2898,7 @@ func (m *MovePredicatePayload) Reset() { *m = MovePredicatePayload{} } func (m *MovePredicatePayload) String() string { return proto.CompactTextString(m) } func (*MovePredicatePayload) ProtoMessage() {} func (*MovePredicatePayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{38} + return fileDescriptor_pb_d366d8792d76fc2b, []int{38} } func (m *MovePredicatePayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2972,7 +2972,7 @@ func (m *ExportPayload) Reset() { *m = ExportPayload{} } func (m *ExportPayload) String() string { return proto.CompactTextString(m) } func (*ExportPayload) ProtoMessage() {} func (*ExportPayload) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{39} + return fileDescriptor_pb_d366d8792d76fc2b, []int{39} } func (m *ExportPayload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3041,7 +3041,7 @@ func (m *TxnStatus) Reset() { *m = TxnStatus{} } func (m *TxnStatus) String() string { return proto.CompactTextString(m) } func (*TxnStatus) ProtoMessage() {} func (*TxnStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{40} + return fileDescriptor_pb_d366d8792d76fc2b, []int{40} } func (m *TxnStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3096,7 +3096,7 @@ func (m *OracleDelta) Reset() { *m = OracleDelta{} } func (m *OracleDelta) String() string { return proto.CompactTextString(m) } func (*OracleDelta) ProtoMessage() {} func (*OracleDelta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{41} + return fileDescriptor_pb_d366d8792d76fc2b, []int{41} } func (m *OracleDelta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3150,7 +3150,7 @@ func (m *TxnTimestamps) Reset() { *m = TxnTimestamps{} } func (m *TxnTimestamps) String() string { return proto.CompactTextString(m) } func (*TxnTimestamps) ProtoMessage() {} func (*TxnTimestamps) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{42} + return fileDescriptor_pb_d366d8792d76fc2b, []int{42} } func (m *TxnTimestamps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3197,7 +3197,7 @@ func (m *PeerResponse) Reset() { *m = PeerResponse{} } func (m *PeerResponse) String() string { return proto.CompactTextString(m) } func (*PeerResponse) ProtoMessage() {} func (*PeerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{43} + return fileDescriptor_pb_d366d8792d76fc2b, []int{43} } func (m *PeerResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3245,7 +3245,7 @@ func (m *RaftBatch) Reset() { *m = RaftBatch{} } func (m *RaftBatch) String() string { return proto.CompactTextString(m) } func (*RaftBatch) ProtoMessage() {} func (*RaftBatch) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{44} + return fileDescriptor_pb_d366d8792d76fc2b, []int{44} } func (m *RaftBatch) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3300,7 +3300,7 @@ func (m *Num) Reset() { *m = Num{} } func (m *Num) String() string { return proto.CompactTextString(m) } func (*Num) ProtoMessage() {} func (*Num) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{45} + return fileDescriptor_pb_d366d8792d76fc2b, []int{45} } func (m *Num) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3357,7 +3357,7 @@ func (m *AssignedIds) Reset() { *m = AssignedIds{} } func (m *AssignedIds) String() string { return proto.CompactTextString(m) } func (*AssignedIds) ProtoMessage() {} func (*AssignedIds) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{46} + return fileDescriptor_pb_d366d8792d76fc2b, []int{46} } func (m *AssignedIds) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3419,7 +3419,7 @@ func (m *SnapshotMeta) Reset() { *m = SnapshotMeta{} } func (m *SnapshotMeta) String() string { return proto.CompactTextString(m) } func (*SnapshotMeta) ProtoMessage() {} func (*SnapshotMeta) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_e185fe8dfa5a123b, []int{47} + return fileDescriptor_pb_d366d8792d76fc2b, []int{47} } func (m *SnapshotMeta) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3476,7 +3476,7 @@ func (m *Status) Reset() { *m = Status{} } func (m *Status) String() string { return proto.CompactTextString(m) } func (*Status) ProtoMessage() {} func (*Status) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_1ecc3f7168766641, []int{46} + return fileDescriptor_pb_d366d8792d76fc2b, []int{48} } func (m *Status) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3533,7 +3533,7 @@ func (m *BackupRequest) Reset() { *m = BackupRequest{} } func (m *BackupRequest) String() string { return proto.CompactTextString(m) } func (*BackupRequest) ProtoMessage() {} func (*BackupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_pb_1ecc3f7168766641, []int{47} + return fileDescriptor_pb_d366d8792d76fc2b, []int{49} } func (m *BackupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16080,203 +16080,208 @@ var ( ErrIntOverflowPb = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_e185fe8dfa5a123b) } - -var fileDescriptor_pb_e185fe8dfa5a123b = []byte{ - // 3120 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xc9, 0x72, 0x23, 0x47, - 0x76, 0xac, 0x02, 0x50, 0xa8, 0x7a, 0x00, 0xd8, 0x50, 0xaa, 0xdd, 0x82, 0x20, 0x99, 0x4d, 0x95, - 0x7a, 0xa1, 0x5a, 0x12, 0xdd, 0xa2, 0x64, 0x6b, 0xb9, 0xb1, 0x09, 0xb0, 0x03, 0x6a, 0x6e, 0x4e, - 0x80, 0x2d, 0x5b, 0x07, 0x21, 0x92, 0xa8, 0x24, 0x59, 0x66, 0xa1, 0xaa, 0x5c, 0x59, 0x60, 0x80, - 0x7d, 0xf3, 0xc5, 0xdf, 0xa0, 0x93, 0x0f, 0x8e, 0xf0, 0xc5, 0xfe, 0x01, 0xfb, 0x03, 0x1c, 0x31, - 0x31, 0xa7, 0xb9, 0xce, 0x6d, 0xa2, 0xe7, 0x34, 0xe7, 0x89, 0x89, 0x39, 0xcc, 0x65, 0x22, 0x5f, - 0x66, 0x2d, 0x40, 0x93, 0xdd, 0xd2, 0x44, 0xcc, 0x09, 0xf5, 0xb6, 0x5c, 0xde, 0x7b, 0xf9, 0x36, - 0x80, 0x1d, 0x9f, 0x6c, 0xc6, 0x49, 0x94, 0x46, 0xc4, 0x8c, 0x4f, 0xba, 0x0e, 0x8b, 0x7d, 0x05, - 0xba, 0x5d, 0xa8, 0xee, 0xf9, 0x22, 0x25, 0x04, 0xaa, 0x33, 0xdf, 0x13, 0x1d, 0x63, 0xbd, 0xb2, - 0x61, 0x51, 0xfc, 0x76, 0xf7, 0xc1, 0x19, 0x31, 0x71, 0xf1, 0x9c, 0x05, 0x33, 0x4e, 0xda, 0x50, - 0xb9, 0x64, 0x41, 0xc7, 0x58, 0x37, 0x36, 0x9a, 0x54, 0x7e, 0x92, 0x4d, 0xb0, 0x2f, 0x59, 0x30, - 0x4e, 0xaf, 0x62, 0xde, 0x31, 0xd7, 0x8d, 0x8d, 0xd5, 0xad, 0xb7, 0x37, 0xe3, 0x93, 0xcd, 0xa3, - 0x48, 0xa4, 0x7e, 0x78, 0xb6, 0xf9, 0x9c, 0x05, 0xa3, 0xab, 0x98, 0xd3, 0xfa, 0xa5, 0xfa, 0x70, - 0x0f, 0xa1, 0x31, 0x4c, 0x26, 0xbb, 0xb3, 0x70, 0x92, 0xfa, 0x51, 0x28, 0x77, 0x0c, 0xd9, 0x94, - 0xe3, 0x8a, 0x0e, 0xc5, 0x6f, 0x89, 0x63, 0xc9, 0x99, 0xe8, 0x54, 0xd6, 0x2b, 0x12, 0x27, 0xbf, - 0x49, 0x07, 0xea, 0xbe, 0xd8, 0x89, 0x66, 0x61, 0xda, 0xa9, 0xae, 0x1b, 0x1b, 0x36, 0xcd, 0x40, - 0xf7, 0xf7, 0x26, 0xd4, 0xfe, 0x71, 0xc6, 0x93, 0x2b, 0x94, 0x4b, 0xd3, 0x24, 0x5b, 0x4b, 0x7e, - 0x93, 0xdb, 0x50, 0x0b, 0x58, 0x78, 0x26, 0x3a, 0x26, 0x2e, 0xa6, 0x00, 0xf2, 0x1e, 0x38, 0xec, - 0x34, 0xe5, 0xc9, 0x78, 0xe6, 0x7b, 0x9d, 0xca, 0xba, 0xb1, 0x61, 0x51, 0x1b, 0x11, 0xc7, 0xbe, - 0x47, 0xde, 0x05, 0xdb, 0x8b, 0xc6, 0x93, 0xf2, 0x5e, 0x5e, 0x84, 0x7b, 0x91, 0x0f, 0xc1, 0x9e, - 0xf9, 0xde, 0x38, 0xf0, 0x45, 0xda, 0xa9, 0xad, 0x1b, 0x1b, 0x8d, 0x2d, 0x5b, 0x5e, 0x56, 0xea, - 0x8e, 0xd6, 0x67, 0xbe, 0x87, 0x4a, 0x7c, 0x04, 0xb6, 0x48, 0x26, 0xe3, 0xd3, 0x59, 0x38, 0xe9, - 0x58, 0xc8, 0x74, 0x4b, 0x32, 0x95, 0x6e, 0x4d, 0xeb, 0x42, 0x01, 0xf2, 0x5a, 0x09, 0xbf, 0xe4, - 0x89, 0xe0, 0x9d, 0xba, 0xda, 0x4a, 0x83, 0xe4, 0x31, 0x34, 0x4e, 0xd9, 0x84, 0xa7, 0xe3, 0x98, - 0x25, 0x6c, 0xda, 0xb1, 0x8b, 0x85, 0x76, 0x25, 0xfa, 0x48, 0x62, 0x05, 0x85, 0xd3, 0x1c, 0x20, - 0x9f, 0x43, 0x0b, 0x21, 0x31, 0x3e, 0xf5, 0x83, 0x94, 0x27, 0x1d, 0x07, 0x65, 0x56, 0x51, 0x06, - 0x31, 0xa3, 0x84, 0x73, 0xda, 0x54, 0x4c, 0x0a, 0x43, 0xfe, 0x16, 0x80, 0xcf, 0x63, 0x16, 0x7a, - 0x63, 0x16, 0x04, 0x1d, 0xc0, 0x33, 0x38, 0x0a, 0xb3, 0x1d, 0x04, 0xe4, 0x1d, 0x79, 0x3e, 0xe6, - 0x8d, 0x53, 0xd1, 0x69, 0xad, 0x1b, 0x1b, 0x55, 0x6a, 0x49, 0x70, 0x24, 0xdc, 0x2d, 0x70, 0xd0, - 0x23, 0xf0, 0xc6, 0xf7, 0xc1, 0xba, 0x94, 0x80, 0x72, 0x9c, 0xc6, 0x56, 0x4b, 0x6e, 0x99, 0x3b, - 0x0d, 0xd5, 0x44, 0x77, 0x0d, 0xec, 0x3d, 0x16, 0x9e, 0x65, 0x9e, 0x26, 0x4d, 0x81, 0x02, 0x0e, - 0xc5, 0x6f, 0xf7, 0x47, 0x13, 0x2c, 0xca, 0xc5, 0x2c, 0x48, 0xc9, 0x43, 0x00, 0xa9, 0xe8, 0x29, - 0x4b, 0x13, 0x7f, 0xae, 0x57, 0x2d, 0x54, 0xed, 0xcc, 0x7c, 0x6f, 0x1f, 0x49, 0xe4, 0x31, 0x34, - 0x71, 0xf5, 0x8c, 0xd5, 0x2c, 0x0e, 0x90, 0x9f, 0x8f, 0x36, 0x90, 0x45, 0x4b, 0xdc, 0x01, 0x0b, - 0x6d, 0xab, 0xfc, 0xab, 0x45, 0x35, 0x44, 0xee, 0xc3, 0xaa, 0x1f, 0xa6, 0x52, 0xf7, 0x93, 0x74, - 0xec, 0x71, 0x91, 0x19, 0xbf, 0x95, 0x63, 0x7b, 0x5c, 0xa4, 0xe4, 0x33, 0x50, 0x0a, 0xcc, 0x36, - 0xac, 0xe1, 0x86, 0xab, 0xb9, 0x61, 0x84, 0xda, 0x11, 0x79, 0xf4, 0x8e, 0x9f, 0x42, 0x43, 0xde, - 0x2f, 0x93, 0xb0, 0x50, 0xa2, 0x89, 0xb7, 0xd1, 0xea, 0xa0, 0x20, 0x19, 0x34, 0xbb, 0x54, 0x8d, - 0x74, 0x30, 0xe5, 0x10, 0xf8, 0xed, 0xf6, 0xa1, 0x76, 0x98, 0x78, 0x3c, 0xb9, 0xd6, 0xc7, 0x09, - 0x54, 0x3d, 0x2e, 0x26, 0xf8, 0xfc, 0x6c, 0x8a, 0xdf, 0x85, 0xdf, 0x57, 0x4a, 0x7e, 0xef, 0xfe, - 0x87, 0x01, 0x8d, 0x61, 0x94, 0xa4, 0xfb, 0x5c, 0x08, 0x76, 0xc6, 0xc9, 0x5d, 0xa8, 0x45, 0x72, - 0x59, 0xad, 0x61, 0x47, 0x9e, 0x09, 0xf7, 0xa1, 0x0a, 0xbf, 0x64, 0x07, 0xf3, 0x66, 0x3b, 0xdc, - 0x86, 0x9a, 0x7a, 0x31, 0xf2, 0x35, 0xd5, 0xa8, 0x02, 0xa4, 0xae, 0xa3, 0xd3, 0x53, 0xc1, 0x95, - 0x2e, 0x6b, 0x54, 0x43, 0x37, 0xbb, 0xd5, 0xdf, 0x03, 0xc8, 0xf3, 0xfd, 0x4c, 0x2f, 0x70, 0xcf, - 0xa1, 0x41, 0xd9, 0x69, 0xba, 0x13, 0x85, 0x29, 0x9f, 0xa7, 0x64, 0x15, 0x4c, 0xdf, 0x43, 0x15, - 0x59, 0xd4, 0xf4, 0x3d, 0x79, 0xb8, 0xb3, 0x24, 0x9a, 0xc5, 0xa8, 0xa1, 0x16, 0x55, 0x00, 0xaa, - 0xd2, 0xf3, 0x12, 0x3c, 0xb1, 0x54, 0xa5, 0xe7, 0x25, 0xe4, 0x2e, 0x34, 0x44, 0xc8, 0x62, 0x71, - 0x1e, 0xa5, 0xf2, 0x70, 0x55, 0x3c, 0x1c, 0x64, 0xa8, 0x91, 0x70, 0xff, 0xdf, 0x00, 0x6b, 0x9f, - 0x4f, 0x4f, 0x78, 0xf2, 0xca, 0x2e, 0xef, 0x82, 0x8d, 0x0b, 0x8f, 0x7d, 0x4f, 0x6f, 0x54, 0x47, - 0x78, 0xe0, 0x5d, 0xbb, 0xd5, 0x1d, 0xb0, 0x02, 0xce, 0xa4, 0xf2, 0x95, 0x9f, 0x69, 0x48, 0xea, - 0x86, 0x4d, 0xc7, 0x1e, 0x67, 0x1e, 0x86, 0x18, 0x9b, 0x5a, 0x6c, 0xda, 0xe3, 0xcc, 0x93, 0x67, - 0x0b, 0x98, 0x48, 0xc7, 0xb3, 0xd8, 0x63, 0x29, 0xc7, 0xd0, 0x52, 0x95, 0x8e, 0x23, 0xd2, 0x63, - 0xc4, 0x90, 0x47, 0xf0, 0xd6, 0x24, 0x98, 0x09, 0x19, 0xd7, 0xfc, 0xf0, 0x34, 0x1a, 0x47, 0x61, - 0x70, 0x85, 0xfa, 0xb5, 0xe9, 0x2d, 0x4d, 0x18, 0x84, 0xa7, 0xd1, 0x61, 0x18, 0x5c, 0xb9, 0x7f, - 0x32, 0xa0, 0xf6, 0x14, 0xd5, 0xf0, 0x18, 0xea, 0x53, 0xbc, 0x50, 0xf6, 0x7a, 0xef, 0x48, 0x0d, - 0x23, 0x6d, 0x53, 0xdd, 0x54, 0xf4, 0xc3, 0x34, 0xb9, 0xa2, 0x19, 0x9b, 0x94, 0x48, 0xd9, 0x49, - 0xc0, 0x53, 0xa1, 0x3d, 0xa2, 0x24, 0x31, 0x52, 0x04, 0x2d, 0xa1, 0xd9, 0xba, 0xbb, 0xd0, 0x2c, - 0x2f, 0x25, 0xd3, 0xc8, 0x05, 0xbf, 0x42, 0xdd, 0x55, 0xa9, 0xfc, 0x24, 0xeb, 0x50, 0xc3, 0x47, - 0x8a, 0x9a, 0x6b, 0x6c, 0x81, 0x5c, 0x51, 0x89, 0x50, 0x45, 0xf8, 0xc6, 0xfc, 0xca, 0x90, 0xeb, - 0x94, 0x37, 0x28, 0xaf, 0xe3, 0xdc, 0xbc, 0x8e, 0x12, 0x29, 0xad, 0xe3, 0xfe, 0xd1, 0x80, 0xe6, - 0xf7, 0x3c, 0x89, 0x8e, 0x92, 0x28, 0x8e, 0x04, 0x0b, 0x88, 0x0b, 0x96, 0xba, 0xdd, 0x35, 0xfb, - 0x6b, 0x8a, 0xe4, 0x51, 0xf7, 0x41, 0x33, 0x2e, 0xae, 0xad, 0x29, 0x64, 0x0d, 0x60, 0xca, 0xe6, - 0x7b, 0x9c, 0x09, 0x3e, 0xf0, 0x32, 0xf7, 0x29, 0x30, 0xa4, 0x0b, 0xf6, 0x94, 0xcd, 0x47, 0xf3, - 0x70, 0x24, 0xd0, 0xba, 0x55, 0x9a, 0xc3, 0xe4, 0x7d, 0x70, 0xa6, 0x6c, 0x2e, 0xfd, 0x78, 0xe0, - 0x69, 0xeb, 0x16, 0x08, 0xf2, 0x01, 0x54, 0xd2, 0x79, 0x88, 0x41, 0x41, 0xe6, 0x01, 0x99, 0xbb, - 0x47, 0xf3, 0x50, 0x7b, 0x3c, 0x95, 0xb4, 0x4c, 0x1b, 0x76, 0xa1, 0x8d, 0x36, 0x54, 0x26, 0xbe, - 0x87, 0x89, 0xc0, 0xa1, 0xf2, 0xd3, 0xfd, 0xdf, 0x0a, 0xdc, 0xd2, 0xa6, 0x38, 0xf7, 0xe3, 0x61, - 0x2a, 0xfd, 0xa6, 0x03, 0x75, 0x7c, 0xae, 0x3c, 0xd1, 0x16, 0xc9, 0x40, 0xf2, 0x25, 0x58, 0xe8, - 0xc2, 0x99, 0xa1, 0xef, 0x16, 0x6a, 0xc9, 0xc5, 0x95, 0xe1, 0xb5, 0xc5, 0x35, 0x3b, 0xf9, 0x02, - 0x6a, 0x2f, 0x78, 0x12, 0xa9, 0xf0, 0xd3, 0xd8, 0x5a, 0xbb, 0x4e, 0x4e, 0x1a, 0x40, 0x8b, 0x29, - 0xe6, 0xbf, 0xa2, 0xf6, 0xee, 0xc9, 0x80, 0x33, 0x8d, 0x2e, 0xb9, 0xd7, 0xa9, 0xe3, 0x89, 0xca, - 0x06, 0xce, 0x48, 0x99, 0xba, 0xec, 0x5c, 0x5d, 0xdd, 0x1e, 0x34, 0x4a, 0xd7, 0x2b, 0xfb, 0x5b, - 0x4b, 0x69, 0xf8, 0xee, 0xa2, 0xbf, 0x39, 0xf9, 0x4b, 0x28, 0xbb, 0x6d, 0x0f, 0xa0, 0xb8, 0xec, - 0x5f, 0xea, 0xfc, 0xee, 0xbf, 0x19, 0x70, 0x6b, 0x27, 0x0a, 0x43, 0x8e, 0x35, 0x84, 0x32, 0x5d, - 0xe1, 0xb7, 0xc6, 0x8d, 0x7e, 0xfb, 0x11, 0xd4, 0x84, 0x64, 0xd6, 0xab, 0xbf, 0x7d, 0x8d, 0x2d, - 0xa8, 0xe2, 0x90, 0x21, 0x66, 0xca, 0xe6, 0xe3, 0x98, 0x87, 0x9e, 0x1f, 0x9e, 0xa1, 0x9f, 0x2b, - 0x0b, 0x1c, 0x29, 0x8c, 0xfb, 0x9f, 0x06, 0x58, 0xca, 0xe5, 0x17, 0xc2, 0x9d, 0xb1, 0x18, 0xee, - 0xde, 0x07, 0x27, 0x4e, 0xb8, 0xe7, 0x4f, 0xb2, 0x5d, 0x1d, 0x5a, 0x20, 0x64, 0x34, 0x3e, 0x8d, - 0x92, 0x09, 0xc7, 0xe5, 0x6d, 0xaa, 0x00, 0x59, 0x92, 0x61, 0x4a, 0xc0, 0xa0, 0xa5, 0x22, 0xa2, - 0x2d, 0x11, 0x32, 0x5a, 0x49, 0x11, 0x11, 0xb3, 0x89, 0x2a, 0x92, 0x2a, 0x54, 0x01, 0x32, 0x82, - 0x2a, 0xcb, 0xa1, 0xc5, 0x6c, 0xaa, 0x21, 0xf7, 0xbf, 0x4d, 0x68, 0xf6, 0xfc, 0x84, 0x4f, 0x52, - 0xee, 0xf5, 0xbd, 0x33, 0x64, 0xe4, 0x61, 0xea, 0xa7, 0x57, 0x3a, 0x5a, 0x6b, 0x28, 0x4f, 0xa6, - 0xe6, 0x62, 0xc1, 0xa8, 0x6c, 0x51, 0xc1, 0x1a, 0x57, 0x01, 0x64, 0x0b, 0x40, 0x95, 0x19, 0x58, - 0xe7, 0x56, 0x6f, 0xae, 0x73, 0x1d, 0x64, 0x93, 0x9f, 0x52, 0x41, 0x4a, 0xc6, 0x57, 0x91, 0xdc, - 0xc2, 0x22, 0x78, 0x26, 0x1d, 0x19, 0xb3, 0xf3, 0x09, 0x0f, 0xd0, 0x51, 0x31, 0x3b, 0x9f, 0xf0, - 0x20, 0xaf, 0x89, 0xea, 0xea, 0x38, 0xf2, 0x9b, 0x7c, 0x08, 0x66, 0x14, 0xe3, 0xfd, 0xf4, 0x86, - 0xe5, 0x8b, 0x6d, 0x1e, 0xc6, 0xd4, 0x8c, 0x62, 0xe9, 0x05, 0xaa, 0xa8, 0xeb, 0x38, 0xda, 0xb9, - 0x65, 0x78, 0xc0, 0x72, 0x84, 0x6a, 0x8a, 0x7b, 0x07, 0xcc, 0xc3, 0x98, 0xd4, 0xa1, 0x32, 0xec, - 0x8f, 0xda, 0x2b, 0xf2, 0xa3, 0xd7, 0xdf, 0x6b, 0x1b, 0xee, 0x4b, 0x03, 0x9c, 0xfd, 0x59, 0xca, - 0xa4, 0x4f, 0x89, 0xd7, 0x19, 0xf5, 0x5d, 0xb0, 0x45, 0xca, 0x12, 0xcc, 0x8b, 0xa6, 0x0a, 0x13, - 0x08, 0x8f, 0x04, 0x79, 0x00, 0x35, 0xee, 0x9d, 0xf1, 0xec, 0xb5, 0xb7, 0x97, 0xcf, 0x49, 0x15, - 0x99, 0x6c, 0x80, 0x25, 0x26, 0xe7, 0x7c, 0xca, 0x3a, 0xd5, 0x82, 0x71, 0x88, 0x18, 0x95, 0xc2, - 0xa8, 0xa6, 0x63, 0x0d, 0x9e, 0x44, 0x31, 0x16, 0xa5, 0x35, 0x5d, 0x83, 0x27, 0x51, 0x2c, 0x4b, - 0xd2, 0x2d, 0xf8, 0x1b, 0xff, 0x2c, 0x8c, 0x12, 0x3e, 0xf6, 0x43, 0x8f, 0xcf, 0xc7, 0x93, 0x28, - 0x3c, 0x0d, 0xfc, 0x49, 0x8a, 0xba, 0xb4, 0xe9, 0xdb, 0x8a, 0x38, 0x90, 0xb4, 0x1d, 0x4d, 0x72, - 0x3f, 0x04, 0xe7, 0x19, 0xbf, 0xc2, 0x82, 0x50, 0x90, 0x3b, 0x60, 0x5e, 0x5c, 0xea, 0x5c, 0x67, - 0xc9, 0x13, 0x3c, 0x7b, 0x4e, 0xcd, 0x8b, 0x4b, 0x77, 0x0e, 0xf6, 0x50, 0x27, 0x7a, 0xf2, 0x91, - 0x0c, 0x89, 0x18, 0x5a, 0xf5, 0xc3, 0xc2, 0xca, 0xbb, 0x54, 0x63, 0xd0, 0x8c, 0x2e, 0x6d, 0x89, - 0x07, 0xd1, 0x4a, 0x51, 0x40, 0xb9, 0xc2, 0xa9, 0x94, 0x2b, 0x1c, 0x2c, 0xd6, 0xa2, 0x90, 0x6b, - 0x17, 0xc7, 0x6f, 0xf7, 0xdf, 0x4d, 0xb0, 0xf3, 0x54, 0xf4, 0x31, 0x38, 0xd3, 0xcc, 0x1e, 0xfa, - 0xc9, 0x62, 0x39, 0x9b, 0x1b, 0x89, 0x16, 0x74, 0x7d, 0x97, 0xea, 0xf2, 0x5d, 0x8a, 0x37, 0x5f, - 0x7b, 0xe3, 0x9b, 0x7f, 0x08, 0xb7, 0x26, 0x01, 0x67, 0xe1, 0xb8, 0x78, 0xb2, 0xca, 0x2b, 0x57, - 0x11, 0x7d, 0x94, 0xbf, 0x5b, 0x1d, 0xb7, 0xea, 0x45, 0x7a, 0xb9, 0x0f, 0x35, 0x8f, 0x07, 0x29, - 0x2b, 0x77, 0x27, 0x87, 0x09, 0x9b, 0x04, 0xbc, 0x27, 0xd1, 0x54, 0x51, 0xc9, 0x06, 0xd8, 0x59, - 0x05, 0xa5, 0x7b, 0x12, 0x2c, 0x7e, 0x33, 0x65, 0xd3, 0x9c, 0xea, 0x7e, 0x06, 0x95, 0x67, 0xcf, - 0x87, 0x37, 0x59, 0x28, 0xd7, 0x9d, 0x59, 0xd2, 0xdd, 0x0f, 0x60, 0x3e, 0x7b, 0x5e, 0x8e, 0xa9, - 0xcd, 0x3c, 0xf5, 0xc9, 0x4e, 0xd5, 0x2c, 0x3a, 0xd5, 0x2e, 0xd8, 0x33, 0xc1, 0x93, 0x7d, 0x9e, - 0x32, 0xfd, 0xb8, 0x73, 0x58, 0xa6, 0x40, 0xd9, 0x76, 0xf9, 0x51, 0xa8, 0xd3, 0x4e, 0x06, 0xba, - 0xbf, 0xab, 0x40, 0x5d, 0x3f, 0x72, 0xb9, 0xe6, 0x2c, 0x2f, 0xf9, 0xe4, 0x67, 0x11, 0x2d, 0xcc, - 0x72, 0xb4, 0x28, 0xf7, 0xc4, 0x95, 0x37, 0xf7, 0xc4, 0xe4, 0x1b, 0x68, 0xc6, 0x8a, 0x56, 0x8e, - 0x2f, 0xef, 0x94, 0x65, 0xf4, 0x2f, 0xca, 0x35, 0xe2, 0x02, 0x90, 0x2f, 0x05, 0x9b, 0x8b, 0x94, - 0x9d, 0xa1, 0xb1, 0x9b, 0xb4, 0x2e, 0xe1, 0x11, 0x3b, 0xbb, 0x21, 0xca, 0xfc, 0x84, 0x60, 0x21, - 0x4b, 0xdb, 0x28, 0xee, 0x34, 0x31, 0x00, 0xc8, 0x00, 0x53, 0x7e, 0xfb, 0xad, 0xc5, 0xb7, 0xff, - 0x1e, 0x38, 0x93, 0x68, 0x3a, 0xf5, 0x91, 0xb6, 0xaa, 0x92, 0xb2, 0x42, 0x8c, 0x84, 0xfb, 0x02, - 0xea, 0xfa, 0xb2, 0xa4, 0x01, 0xf5, 0x5e, 0x7f, 0x77, 0xfb, 0x78, 0x4f, 0x46, 0x1f, 0x00, 0xeb, - 0xc9, 0xe0, 0x60, 0x9b, 0xfe, 0x73, 0xdb, 0x90, 0x91, 0x68, 0x70, 0x30, 0x6a, 0x9b, 0xc4, 0x81, - 0xda, 0xee, 0xde, 0xe1, 0xf6, 0xa8, 0x5d, 0x21, 0x36, 0x54, 0x9f, 0x1c, 0x1e, 0xee, 0xb5, 0xab, - 0xa4, 0x09, 0x76, 0x6f, 0x7b, 0xd4, 0x1f, 0x0d, 0xf6, 0xfb, 0xed, 0x9a, 0xe4, 0x7d, 0xda, 0x3f, - 0x6c, 0x5b, 0xf2, 0xe3, 0x78, 0xd0, 0x6b, 0xd7, 0x25, 0xfd, 0x68, 0x7b, 0x38, 0xfc, 0xee, 0x90, - 0xf6, 0xda, 0xb6, 0x5c, 0x77, 0x38, 0xa2, 0x83, 0x83, 0xa7, 0x6d, 0xc7, 0xfd, 0x0c, 0x1a, 0x25, - 0xa5, 0x49, 0x09, 0xda, 0xdf, 0x6d, 0xaf, 0xc8, 0x6d, 0x9e, 0x6f, 0xef, 0x1d, 0xf7, 0xdb, 0x06, - 0x59, 0x05, 0xc0, 0xcf, 0xf1, 0xde, 0xf6, 0xc1, 0xd3, 0xb6, 0xe9, 0xfe, 0x03, 0xd8, 0xc7, 0xbe, - 0xf7, 0x24, 0x88, 0x26, 0x17, 0xd2, 0xd7, 0x4e, 0x98, 0xe0, 0x3a, 0x4d, 0xe3, 0xb7, 0xcc, 0x23, - 0xe8, 0xd1, 0x42, 0x9b, 0x5b, 0x43, 0xee, 0x01, 0xd4, 0x8f, 0x7d, 0xef, 0x88, 0x4d, 0x2e, 0x64, - 0x3f, 0x7d, 0x22, 0xe5, 0xc7, 0xc2, 0x7f, 0xc1, 0x75, 0x08, 0x75, 0x10, 0x33, 0xf4, 0x5f, 0x70, - 0x72, 0x0f, 0x2c, 0x04, 0xb2, 0x82, 0x0a, 0x1f, 0x42, 0xb6, 0x27, 0xd5, 0x34, 0x37, 0xcd, 0x8f, - 0x8e, 0xbd, 0xf2, 0x5d, 0xa8, 0xc6, 0x6c, 0x72, 0xa1, 0x23, 0x51, 0x43, 0x8b, 0xc8, 0xed, 0x28, - 0x12, 0xc8, 0x43, 0xb0, 0xb5, 0x4b, 0x64, 0xeb, 0x36, 0x4a, 0xbe, 0x43, 0x73, 0xe2, 0xa2, 0xb1, - 0x2a, 0x4b, 0xc6, 0xfa, 0x02, 0xa0, 0x18, 0x2d, 0x5c, 0x53, 0x5a, 0xdf, 0x86, 0x1a, 0x0b, 0x7c, - 0x7d, 0x79, 0x87, 0x2a, 0xc0, 0x3d, 0x80, 0x46, 0x69, 0x20, 0x21, 0x3d, 0x85, 0x05, 0xc1, 0xf8, - 0x82, 0x5f, 0x09, 0x94, 0xb5, 0x69, 0x9d, 0x05, 0xc1, 0x33, 0x7e, 0x25, 0xc8, 0x3d, 0xa8, 0xa9, - 0x59, 0x86, 0xb9, 0xd4, 0x32, 0xa3, 0x28, 0x55, 0x44, 0xf7, 0x13, 0xb0, 0x54, 0x1f, 0x5d, 0x72, - 0x54, 0xe3, 0xc6, 0xac, 0xf6, 0xb5, 0x3e, 0x33, 0x76, 0xdd, 0xe4, 0x63, 0x3d, 0x33, 0x11, 0x6a, - 0x42, 0x63, 0x14, 0x95, 0x9e, 0x62, 0xd2, 0xe3, 0x12, 0x64, 0x76, 0x7b, 0x60, 0xbf, 0x76, 0x0a, - 0xa5, 0x15, 0x60, 0x16, 0x0a, 0xb8, 0x66, 0x2e, 0xe5, 0xfe, 0x0b, 0x40, 0x31, 0x5b, 0xd1, 0xef, - 0x46, 0xad, 0x22, 0xdf, 0xcd, 0x23, 0xb0, 0x27, 0xe7, 0x7e, 0xe0, 0x25, 0x3c, 0x5c, 0xb8, 0x75, - 0x31, 0x8d, 0xc9, 0xe9, 0x64, 0x1d, 0xaa, 0x38, 0x32, 0xaa, 0x14, 0x11, 0x32, 0x9f, 0x17, 0x21, - 0xc5, 0x3d, 0x81, 0x96, 0x4a, 0x96, 0x94, 0xff, 0xeb, 0x8c, 0x8b, 0xd7, 0x96, 0x60, 0x6b, 0x00, - 0x79, 0x3c, 0xcf, 0x86, 0x5f, 0x25, 0x8c, 0x74, 0xe5, 0x53, 0x9f, 0x07, 0x5e, 0x76, 0x1b, 0x0d, - 0xb9, 0x5f, 0x42, 0x33, 0xdb, 0x43, 0xb7, 0xe0, 0x59, 0xca, 0x56, 0xda, 0x54, 0x9d, 0x87, 0x62, - 0x39, 0x88, 0xbc, 0x3c, 0x63, 0xbb, 0xbf, 0x36, 0x33, 0x49, 0xdd, 0x8d, 0x2e, 0x14, 0x81, 0xc6, - 0x72, 0x11, 0xb8, 0x58, 0x50, 0x99, 0x3f, 0xa9, 0xa0, 0xfa, 0x0a, 0x1c, 0x0f, 0xab, 0x0a, 0xff, - 0x32, 0x8b, 0xab, 0xdd, 0xe5, 0x0a, 0x42, 0xd7, 0x1d, 0xfe, 0x25, 0xa7, 0x05, 0xb3, 0x3c, 0x4b, - 0x1a, 0x5d, 0xf0, 0xd0, 0x7f, 0x81, 0xed, 0xb6, 0xbc, 0x70, 0x81, 0x28, 0x66, 0x17, 0xaa, 0xd2, - 0xd0, 0xb3, 0x8b, 0x6c, 0x0c, 0x63, 0x15, 0x63, 0x18, 0xa9, 0xb5, 0x59, 0x2c, 0x78, 0x92, 0x66, - 0x15, 0xa7, 0x82, 0xf2, 0xca, 0xcd, 0xd1, 0xbc, 0x2c, 0x3c, 0x73, 0xbf, 0x06, 0x27, 0x3f, 0x8b, - 0x0c, 0x68, 0x07, 0x87, 0x07, 0x7d, 0x15, 0x7e, 0x06, 0x07, 0xbd, 0xfe, 0x3f, 0xb5, 0x0d, 0x19, - 0x12, 0x69, 0xff, 0x79, 0x9f, 0x0e, 0xfb, 0x6d, 0x53, 0x86, 0xae, 0x5e, 0x7f, 0xaf, 0x3f, 0xea, - 0xb7, 0x2b, 0xdf, 0x56, 0xed, 0x7a, 0xdb, 0xa6, 0x36, 0x9f, 0xc7, 0x81, 0x3f, 0xf1, 0x53, 0xf7, - 0x18, 0xec, 0x7d, 0x16, 0xbf, 0xd2, 0x3d, 0x14, 0x99, 0x6e, 0xa6, 0x47, 0x0e, 0x3a, 0x2b, 0xdd, - 0x87, 0xba, 0x7e, 0xf2, 0xda, 0x9b, 0x16, 0xc2, 0x41, 0x46, 0x73, 0xff, 0xc7, 0x80, 0xdb, 0xfb, - 0xd1, 0x25, 0xcf, 0x53, 0xfc, 0x11, 0xbb, 0x0a, 0x22, 0xe6, 0xbd, 0xc1, 0x74, 0x0f, 0xe0, 0x96, - 0x88, 0x66, 0xc9, 0x84, 0x8f, 0x97, 0xc6, 0x1d, 0x2d, 0x85, 0x7e, 0xaa, 0x5d, 0xd0, 0x85, 0x96, - 0xc7, 0x45, 0x5a, 0x70, 0x55, 0x90, 0xab, 0x21, 0x91, 0x19, 0x4f, 0x5e, 0xa7, 0x54, 0xdf, 0x54, - 0xa7, 0xb8, 0xbf, 0x34, 0xa0, 0xd5, 0x9f, 0xc7, 0x51, 0x92, 0x66, 0xc7, 0x7c, 0x8d, 0xfb, 0x3f, - 0x06, 0x4b, 0x4a, 0xcd, 0x84, 0x76, 0xad, 0x8e, 0x5c, 0x78, 0x41, 0x7a, 0x73, 0x88, 0x74, 0xaa, - 0xf9, 0x6e, 0x2e, 0xd8, 0xde, 0x81, 0xfa, 0x2c, 0xf4, 0xe7, 0xd9, 0x38, 0xa8, 0x42, 0x2d, 0x09, - 0x8e, 0x84, 0xfb, 0x0d, 0x58, 0x6a, 0x8d, 0x92, 0x75, 0x1b, 0x50, 0x1f, 0x1e, 0xef, 0xec, 0xf4, - 0x87, 0xc3, 0xb6, 0x41, 0x5a, 0xe0, 0xf4, 0x8e, 0x8f, 0xf6, 0x06, 0x3b, 0xdb, 0x23, 0x6d, 0xe1, - 0xdd, 0xed, 0xc1, 0x5e, 0xbf, 0xd7, 0xae, 0xb8, 0x3b, 0xe0, 0x8c, 0xe6, 0xa1, 0x16, 0x2f, 0x67, - 0x57, 0xe3, 0x35, 0xd9, 0xd5, 0x5c, 0x0a, 0xd8, 0x43, 0x68, 0x94, 0xaa, 0x2d, 0xf2, 0x01, 0x54, - 0xd3, 0x79, 0xb8, 0x38, 0x83, 0xcd, 0xf6, 0xa0, 0x48, 0x22, 0x1f, 0x40, 0x53, 0xf6, 0x77, 0x4c, - 0x08, 0xff, 0x2c, 0xe4, 0x9e, 0x5e, 0x51, 0xf6, 0x7c, 0xdb, 0x1a, 0xe5, 0xde, 0x85, 0x96, 0x6c, - 0xa8, 0xfd, 0x29, 0x17, 0x29, 0x9b, 0xc6, 0x58, 0x0b, 0xe8, 0x10, 0x5c, 0xa5, 0x66, 0x2a, 0xdc, - 0x07, 0xd0, 0x3c, 0xe2, 0x3c, 0xa1, 0x5c, 0xc4, 0x51, 0xa8, 0x92, 0xa2, 0x56, 0xb5, 0x8a, 0xf7, - 0x1a, 0x72, 0x7f, 0x00, 0x47, 0xd6, 0xcb, 0x4f, 0x58, 0x3a, 0x39, 0xff, 0x39, 0xf5, 0xf4, 0x03, - 0xa8, 0xc7, 0xca, 0x44, 0xba, 0xfa, 0x6d, 0x62, 0xc8, 0xd1, 0x66, 0xa3, 0x19, 0xd1, 0xfd, 0x02, - 0x2a, 0x07, 0xb3, 0x69, 0xf9, 0x1f, 0x89, 0xaa, 0xaa, 0xf3, 0x16, 0x3a, 0x49, 0x73, 0xb1, 0x93, - 0x74, 0xbf, 0x87, 0x46, 0x76, 0xd5, 0x81, 0x87, 0x7f, 0x2b, 0xa0, 0xaa, 0x07, 0xde, 0x82, 0xe6, - 0x55, 0x8b, 0xc6, 0x43, 0x6f, 0x90, 0xe9, 0x48, 0x01, 0x8b, 0x6b, 0xeb, 0x11, 0x44, 0xbe, 0xf6, - 0x2e, 0x34, 0xb3, 0x9a, 0x16, 0x8b, 0x4a, 0x69, 0xbc, 0xc0, 0xe7, 0x61, 0xc9, 0xb0, 0xb6, 0x42, - 0x8c, 0xc4, 0x6b, 0xa6, 0x85, 0x5b, 0xff, 0x67, 0x40, 0x55, 0xaa, 0x86, 0xdc, 0x83, 0x6a, 0x7f, - 0x72, 0x1e, 0x91, 0x05, 0x0d, 0x74, 0x17, 0x20, 0x77, 0x85, 0x7c, 0xa2, 0x86, 0x9f, 0xd9, 0x4c, - 0xb7, 0x95, 0x69, 0x16, 0x35, 0xff, 0x0a, 0xf7, 0x26, 0x34, 0xbe, 0x8d, 0xfc, 0x70, 0x47, 0xcd, - 0x03, 0xc9, 0xb2, 0x1d, 0x5e, 0xe1, 0xff, 0x14, 0xac, 0x81, 0x90, 0x06, 0x7f, 0x95, 0x15, 0xdb, - 0xb7, 0xb2, 0x2f, 0xb8, 0x2b, 0x5b, 0x7f, 0x30, 0xa1, 0xfa, 0x3d, 0x4f, 0x22, 0xf2, 0x09, 0xd4, - 0xf5, 0xb0, 0x82, 0x94, 0x86, 0x12, 0x5d, 0x7c, 0xe1, 0x4b, 0x53, 0x0c, 0x3c, 0x95, 0xa5, 0xd3, - 0x46, 0x31, 0x41, 0xe9, 0x5e, 0x17, 0x0d, 0xdc, 0x95, 0x0d, 0xe3, 0xb1, 0x41, 0x3e, 0x06, 0x4b, - 0xb9, 0xfe, 0x92, 0x6e, 0x96, 0x5b, 0x10, 0x77, 0xe5, 0xb1, 0x41, 0x1e, 0x42, 0x63, 0x78, 0x1e, - 0xcd, 0x02, 0x6f, 0xc8, 0x93, 0x4b, 0x4e, 0x4a, 0x73, 0xbb, 0x6e, 0xe9, 0xdb, 0x5d, 0x21, 0x1b, - 0x00, 0xca, 0x39, 0x8e, 0x7d, 0x4f, 0x90, 0xba, 0xa4, 0x1d, 0xcc, 0xa6, 0x6a, 0xd1, 0x92, 0xd7, - 0x28, 0xce, 0xd2, 0x13, 0x79, 0x1d, 0xe7, 0xe7, 0xd0, 0xda, 0xc1, 0x07, 0x7b, 0x98, 0x6c, 0x9f, - 0x44, 0x49, 0x4a, 0x96, 0x67, 0x77, 0xdd, 0x65, 0x84, 0xbb, 0x42, 0x1e, 0x83, 0x3d, 0x4a, 0xae, - 0x14, 0xff, 0x5b, 0xfa, 0x21, 0x17, 0xfb, 0x5d, 0x73, 0xcb, 0xad, 0xff, 0xaa, 0x80, 0xf5, 0x5d, - 0x94, 0x5c, 0xf0, 0x84, 0x3c, 0x02, 0x0b, 0x7b, 0x45, 0xed, 0x0a, 0x79, 0xdf, 0x78, 0xdd, 0x46, - 0xf7, 0xc0, 0x41, 0xa5, 0x8c, 0x98, 0xb8, 0x50, 0xaa, 0xc7, 0xbf, 0xd2, 0x94, 0x5e, 0x54, 0x09, - 0x80, 0x3e, 0xb0, 0x3a, 0x4c, 0x13, 0xce, 0xa6, 0x79, 0x7f, 0xbc, 0xd0, 0xc0, 0x75, 0xeb, 0xaa, - 0x47, 0x1b, 0x6a, 0xe3, 0x7c, 0x04, 0xd5, 0xa1, 0xba, 0xa9, 0x64, 0x2a, 0xfe, 0x6e, 0xe8, 0xae, - 0x66, 0x88, 0x7c, 0xe5, 0xbf, 0x03, 0x4b, 0x65, 0x6f, 0x75, 0xcd, 0x85, 0xf2, 0xa6, 0xdb, 0x2e, - 0xa3, 0xb4, 0x80, 0x0b, 0xf5, 0xa3, 0x59, 0x72, 0xc6, 0x47, 0x62, 0xc9, 0xf2, 0x99, 0x0d, 0x50, - 0x7b, 0x96, 0x0a, 0xf5, 0x6a, 0xd1, 0x85, 0xb0, 0xdf, 0x7d, 0x15, 0x85, 0x17, 0x6c, 0x53, 0x3e, - 0xe1, 0x7e, 0x29, 0x17, 0x92, 0xec, 0x52, 0xcb, 0x2f, 0x62, 0xc3, 0x20, 0x5f, 0x43, 0x6b, 0x21, - 0x6f, 0x12, 0x4c, 0x2f, 0xd7, 0xa5, 0xd2, 0x65, 0xe1, 0x27, 0xed, 0x5f, 0xbc, 0x5c, 0x33, 0x7e, - 0xf5, 0x72, 0xcd, 0xf8, 0xcd, 0xcb, 0x35, 0xe3, 0xc7, 0xdf, 0xae, 0xad, 0x9c, 0x58, 0xf8, 0x17, - 0xec, 0xe7, 0x7f, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xbe, 0x30, 0x0e, 0x9d, 0x1d, 0x00, 0x00, +func init() { proto.RegisterFile("pb.proto", fileDescriptor_pb_d366d8792d76fc2b) } + +var fileDescriptor_pb_d366d8792d76fc2b = []byte{ + // 3195 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x39, 0xcb, 0x72, 0xe3, 0x56, + 0x76, 0x02, 0x48, 0x82, 0xc0, 0x21, 0xa9, 0xa6, 0xaf, 0x3b, 0x6d, 0x9a, 0x76, 0xd4, 0x32, 0xdc, + 0x0f, 0x75, 0xdb, 0x56, 0xda, 0xb2, 0x13, 0x3f, 0x76, 0x6a, 0x91, 0xea, 0xa2, 0x5b, 0xaf, 0x5c, + 0x52, 0xed, 0xc4, 0x0b, 0xb3, 0x20, 0xe0, 0x8a, 0x42, 0x04, 0x02, 0x08, 0x2e, 0xa8, 0xa2, 0x7a, + 0x97, 0x4d, 0xbe, 0xc1, 0xab, 0x2c, 0xb2, 0x4c, 0x7e, 0x60, 0xe6, 0x03, 0xa6, 0x6a, 0x6a, 0x56, + 0xde, 0xce, 0x6e, 0xaa, 0x67, 0x35, 0xeb, 0xa9, 0xa9, 0x59, 0xcc, 0x66, 0xea, 0x9e, 0x7b, 0xf1, + 0x20, 0x5b, 0x52, 0xdb, 0x53, 0x35, 0x2b, 0xe2, 0xbc, 0xee, 0xe3, 0x9c, 0x73, 0xcf, 0x8b, 0x60, + 0xc6, 0x27, 0x9b, 0x71, 0x12, 0xa5, 0x11, 0xd1, 0xe3, 0x93, 0xae, 0xe5, 0xc4, 0xbe, 0x04, 0xed, + 0x2e, 0x54, 0xf7, 0x7c, 0x9e, 0x12, 0x02, 0xd5, 0x99, 0xef, 0xf1, 0x8e, 0xb6, 0x5e, 0xd9, 0x30, + 0x28, 0x7e, 0xdb, 0xfb, 0x60, 0x8d, 0x1c, 0x7e, 0xfe, 0xc2, 0x09, 0x66, 0x8c, 0xb4, 0xa1, 0x72, + 0xe1, 0x04, 0x1d, 0x6d, 0x5d, 0xdb, 0x68, 0x52, 0xf1, 0x49, 0x36, 0xc1, 0xbc, 0x70, 0x82, 0x71, + 0x7a, 0x19, 0xb3, 0x8e, 0xbe, 0xae, 0x6d, 0xac, 0x6e, 0xbd, 0xbd, 0x19, 0x9f, 0x6c, 0x1e, 0x45, + 0x3c, 0xf5, 0xc3, 0xc9, 0xe6, 0x0b, 0x27, 0x18, 0x5d, 0xc6, 0x8c, 0xd6, 0x2f, 0xe4, 0x87, 0x7d, + 0x08, 0x8d, 0x61, 0xe2, 0xee, 0xce, 0x42, 0x37, 0xf5, 0xa3, 0x50, 0xec, 0x18, 0x3a, 0x53, 0x86, + 0x2b, 0x5a, 0x14, 0xbf, 0x05, 0xce, 0x49, 0x26, 0xbc, 0x53, 0x59, 0xaf, 0x08, 0x9c, 0xf8, 0x26, + 0x1d, 0xa8, 0xfb, 0x7c, 0x27, 0x9a, 0x85, 0x69, 0xa7, 0xba, 0xae, 0x6d, 0x98, 0x34, 0x03, 0xed, + 0x3f, 0xea, 0x50, 0xfb, 0xd7, 0x19, 0x4b, 0x2e, 0x51, 0x2e, 0x4d, 0x93, 0x6c, 0x2d, 0xf1, 0x4d, + 0x6e, 0x43, 0x2d, 0x70, 0xc2, 0x09, 0xef, 0xe8, 0xb8, 0x98, 0x04, 0xc8, 0x7b, 0x60, 0x39, 0xa7, + 0x29, 0x4b, 0xc6, 0x33, 0xdf, 0xeb, 0x54, 0xd6, 0xb5, 0x0d, 0x83, 0x9a, 0x88, 0x38, 0xf6, 0x3d, + 0xf2, 0x2e, 0x98, 0x5e, 0x34, 0x76, 0xcb, 0x7b, 0x79, 0x11, 0xee, 0x45, 0x3e, 0x04, 0x73, 0xe6, + 0x7b, 0xe3, 0xc0, 0xe7, 0x69, 0xa7, 0xb6, 0xae, 0x6d, 0x34, 0xb6, 0x4c, 0x71, 0x59, 0xa1, 0x3b, + 0x5a, 0x9f, 0xf9, 0x1e, 0x2a, 0xf1, 0x31, 0x98, 0x3c, 0x71, 0xc7, 0xa7, 0xb3, 0xd0, 0xed, 0x18, + 0xc8, 0x74, 0x4b, 0x30, 0x95, 0x6e, 0x4d, 0xeb, 0x5c, 0x02, 0xe2, 0x5a, 0x09, 0xbb, 0x60, 0x09, + 0x67, 0x9d, 0xba, 0xdc, 0x4a, 0x81, 0xe4, 0x09, 0x34, 0x4e, 0x1d, 0x97, 0xa5, 0xe3, 0xd8, 0x49, + 0x9c, 0x69, 0xc7, 0x2c, 0x16, 0xda, 0x15, 0xe8, 0x23, 0x81, 0xe5, 0x14, 0x4e, 0x73, 0x80, 0x7c, + 0x06, 0x2d, 0x84, 0xf8, 0xf8, 0xd4, 0x0f, 0x52, 0x96, 0x74, 0x2c, 0x94, 0x59, 0x45, 0x19, 0xc4, + 0x8c, 0x12, 0xc6, 0x68, 0x53, 0x32, 0x49, 0x0c, 0xf9, 0x47, 0x00, 0x36, 0x8f, 0x9d, 0xd0, 0x1b, + 0x3b, 0x41, 0xd0, 0x01, 0x3c, 0x83, 0x25, 0x31, 0xdb, 0x41, 0x40, 0xde, 0x11, 0xe7, 0x73, 0xbc, + 0x71, 0xca, 0x3b, 0xad, 0x75, 0x6d, 0xa3, 0x4a, 0x0d, 0x01, 0x8e, 0xb8, 0xbd, 0x05, 0x16, 0x7a, + 0x04, 0xde, 0xf8, 0x3e, 0x18, 0x17, 0x02, 0x90, 0x8e, 0xd3, 0xd8, 0x6a, 0x89, 0x2d, 0x73, 0xa7, + 0xa1, 0x8a, 0x68, 0xaf, 0x81, 0xb9, 0xe7, 0x84, 0x93, 0xcc, 0xd3, 0x84, 0x29, 0x50, 0xc0, 0xa2, + 0xf8, 0x6d, 0xff, 0xa0, 0x83, 0x41, 0x19, 0x9f, 0x05, 0x29, 0x79, 0x08, 0x20, 0x14, 0x3d, 0x75, + 0xd2, 0xc4, 0x9f, 0xab, 0x55, 0x0b, 0x55, 0x5b, 0x33, 0xdf, 0xdb, 0x47, 0x12, 0x79, 0x02, 0x4d, + 0x5c, 0x3d, 0x63, 0xd5, 0x8b, 0x03, 0xe4, 0xe7, 0xa3, 0x0d, 0x64, 0x51, 0x12, 0x77, 0xc0, 0x40, + 0xdb, 0x4a, 0xff, 0x6a, 0x51, 0x05, 0x91, 0xfb, 0xb0, 0xea, 0x87, 0xa9, 0xd0, 0xbd, 0x9b, 0x8e, + 0x3d, 0xc6, 0x33, 0xe3, 0xb7, 0x72, 0x6c, 0x8f, 0xf1, 0x94, 0x7c, 0x0a, 0x52, 0x81, 0xd9, 0x86, + 0x35, 0xdc, 0x70, 0x35, 0x37, 0x0c, 0x97, 0x3b, 0x22, 0x8f, 0xda, 0xf1, 0x13, 0x68, 0x88, 0xfb, + 0x65, 0x12, 0x06, 0x4a, 0x34, 0xf1, 0x36, 0x4a, 0x1d, 0x14, 0x04, 0x83, 0x62, 0x17, 0xaa, 0x11, + 0x0e, 0x26, 0x1d, 0x02, 0xbf, 0xed, 0x3e, 0xd4, 0x0e, 0x13, 0x8f, 0x25, 0x57, 0xfa, 0x38, 0x81, + 0xaa, 0xc7, 0xb8, 0x8b, 0xcf, 0xcf, 0xa4, 0xf8, 0x5d, 0xf8, 0x7d, 0xa5, 0xe4, 0xf7, 0xf6, 0xff, + 0x68, 0xd0, 0x18, 0x46, 0x49, 0xba, 0xcf, 0x38, 0x77, 0x26, 0x8c, 0xdc, 0x85, 0x5a, 0x24, 0x96, + 0x55, 0x1a, 0xb6, 0xc4, 0x99, 0x70, 0x1f, 0x2a, 0xf1, 0x4b, 0x76, 0xd0, 0xaf, 0xb7, 0xc3, 0x6d, + 0xa8, 0xc9, 0x17, 0x23, 0x5e, 0x53, 0x8d, 0x4a, 0x40, 0xe8, 0x3a, 0x3a, 0x3d, 0xe5, 0x4c, 0xea, + 0xb2, 0x46, 0x15, 0x74, 0xbd, 0x5b, 0xfd, 0x33, 0x80, 0x38, 0xdf, 0xcf, 0xf4, 0x02, 0xfb, 0x0c, + 0x1a, 0xd4, 0x39, 0x4d, 0x77, 0xa2, 0x30, 0x65, 0xf3, 0x94, 0xac, 0x82, 0xee, 0x7b, 0xa8, 0x22, + 0x83, 0xea, 0xbe, 0x27, 0x0e, 0x37, 0x49, 0xa2, 0x59, 0x8c, 0x1a, 0x6a, 0x51, 0x09, 0xa0, 0x2a, + 0x3d, 0x2f, 0xc1, 0x13, 0x0b, 0x55, 0x7a, 0x5e, 0x42, 0xee, 0x42, 0x83, 0x87, 0x4e, 0xcc, 0xcf, + 0xa2, 0x54, 0x1c, 0xae, 0x8a, 0x87, 0x83, 0x0c, 0x35, 0xe2, 0xf6, 0xaf, 0x34, 0x30, 0xf6, 0xd9, + 0xf4, 0x84, 0x25, 0xaf, 0xed, 0xf2, 0x2e, 0x98, 0xb8, 0xf0, 0xd8, 0xf7, 0xd4, 0x46, 0x75, 0x84, + 0x07, 0xde, 0x95, 0x5b, 0xdd, 0x01, 0x23, 0x60, 0x8e, 0x50, 0xbe, 0xf4, 0x33, 0x05, 0x09, 0xdd, + 0x38, 0xd3, 0xb1, 0xc7, 0x1c, 0x0f, 0x43, 0x8c, 0x49, 0x0d, 0x67, 0xda, 0x63, 0x8e, 0x27, 0xce, + 0x16, 0x38, 0x3c, 0x1d, 0xcf, 0x62, 0xcf, 0x49, 0x19, 0x86, 0x96, 0xaa, 0x70, 0x1c, 0x9e, 0x1e, + 0x23, 0x86, 0x3c, 0x86, 0xb7, 0xdc, 0x60, 0xc6, 0x45, 0x5c, 0xf3, 0xc3, 0xd3, 0x68, 0x1c, 0x85, + 0xc1, 0x25, 0xea, 0xd7, 0xa4, 0xb7, 0x14, 0x61, 0x10, 0x9e, 0x46, 0x87, 0x61, 0x70, 0x69, 0xff, + 0x45, 0x83, 0xda, 0x33, 0x54, 0xc3, 0x13, 0xa8, 0x4f, 0xf1, 0x42, 0xd9, 0xeb, 0xbd, 0x23, 0x34, + 0x8c, 0xb4, 0x4d, 0x79, 0x53, 0xde, 0x0f, 0xd3, 0xe4, 0x92, 0x66, 0x6c, 0x42, 0x22, 0x75, 0x4e, + 0x02, 0x96, 0x72, 0xe5, 0x11, 0x25, 0x89, 0x91, 0x24, 0x28, 0x09, 0xc5, 0xd6, 0xdd, 0x85, 0x66, + 0x79, 0x29, 0x91, 0x46, 0xce, 0xd9, 0x25, 0xea, 0xae, 0x4a, 0xc5, 0x27, 0x59, 0x87, 0x1a, 0x3e, + 0x52, 0xd4, 0x5c, 0x63, 0x0b, 0xc4, 0x8a, 0x52, 0x84, 0x4a, 0xc2, 0xd7, 0xfa, 0x97, 0x9a, 0x58, + 0xa7, 0xbc, 0x41, 0x79, 0x1d, 0xeb, 0xfa, 0x75, 0xa4, 0x48, 0x69, 0x1d, 0xfb, 0xcf, 0x1a, 0x34, + 0xbf, 0x63, 0x49, 0x74, 0x94, 0x44, 0x71, 0xc4, 0x9d, 0x80, 0xd8, 0x60, 0xc8, 0xdb, 0x5d, 0xb1, + 0xbf, 0xa2, 0x08, 0x1e, 0x79, 0x1f, 0x34, 0xe3, 0xe2, 0xda, 0x8a, 0x42, 0xd6, 0x00, 0xa6, 0xce, + 0x7c, 0x8f, 0x39, 0x9c, 0x0d, 0xbc, 0xcc, 0x7d, 0x0a, 0x0c, 0xe9, 0x82, 0x39, 0x75, 0xe6, 0xa3, + 0x79, 0x38, 0xe2, 0x68, 0xdd, 0x2a, 0xcd, 0x61, 0xf2, 0x3e, 0x58, 0x53, 0x67, 0x2e, 0xfc, 0x78, + 0xe0, 0x29, 0xeb, 0x16, 0x08, 0xf2, 0x01, 0x54, 0xd2, 0x79, 0x88, 0x41, 0x41, 0xe4, 0x01, 0x91, + 0xbb, 0x47, 0xf3, 0x50, 0x79, 0x3c, 0x15, 0xb4, 0x4c, 0x1b, 0x66, 0xa1, 0x8d, 0x36, 0x54, 0x5c, + 0xdf, 0xc3, 0x44, 0x60, 0x51, 0xf1, 0x69, 0xff, 0xa2, 0x02, 0xb7, 0x94, 0x29, 0xce, 0xfc, 0x78, + 0x98, 0x0a, 0xbf, 0xe9, 0x40, 0x1d, 0x9f, 0x2b, 0x4b, 0x94, 0x45, 0x32, 0x90, 0x7c, 0x01, 0x06, + 0xba, 0x70, 0x66, 0xe8, 0xbb, 0x85, 0x5a, 0x72, 0x71, 0x69, 0x78, 0x65, 0x71, 0xc5, 0x4e, 0x3e, + 0x87, 0xda, 0x4b, 0x96, 0x44, 0x32, 0xfc, 0x34, 0xb6, 0xd6, 0xae, 0x92, 0x13, 0x06, 0x50, 0x62, + 0x92, 0xf9, 0xef, 0xa8, 0xbd, 0x7b, 0x22, 0xe0, 0x4c, 0xa3, 0x0b, 0xe6, 0x75, 0xea, 0x78, 0xa2, + 0xb2, 0x81, 0x33, 0x52, 0xa6, 0x2e, 0x33, 0x57, 0x57, 0xb7, 0x07, 0x8d, 0xd2, 0xf5, 0xca, 0xfe, + 0xd6, 0x92, 0x1a, 0xbe, 0xbb, 0xe8, 0x6f, 0x56, 0xfe, 0x12, 0xca, 0x6e, 0xdb, 0x03, 0x28, 0x2e, + 0xfb, 0xb7, 0x3a, 0xbf, 0xfd, 0x5f, 0x1a, 0xdc, 0xda, 0x89, 0xc2, 0x90, 0x61, 0x0d, 0x21, 0x4d, + 0x57, 0xf8, 0xad, 0x76, 0xad, 0xdf, 0x3e, 0x82, 0x1a, 0x17, 0xcc, 0x6a, 0xf5, 0xb7, 0xaf, 0xb0, + 0x05, 0x95, 0x1c, 0x22, 0xc4, 0x4c, 0x9d, 0xf9, 0x38, 0x66, 0xa1, 0xe7, 0x87, 0x13, 0xf4, 0x73, + 0x69, 0x81, 0x23, 0x89, 0xb1, 0xff, 0x57, 0x03, 0x43, 0xba, 0xfc, 0x42, 0xb8, 0xd3, 0x16, 0xc3, + 0xdd, 0xfb, 0x60, 0xc5, 0x09, 0xf3, 0x7c, 0x37, 0xdb, 0xd5, 0xa2, 0x05, 0x42, 0x44, 0xe3, 0xd3, + 0x28, 0x71, 0x19, 0x2e, 0x6f, 0x52, 0x09, 0x88, 0x92, 0x0c, 0x53, 0x02, 0x06, 0x2d, 0x19, 0x11, + 0x4d, 0x81, 0x10, 0xd1, 0x4a, 0x88, 0xf0, 0xd8, 0x71, 0x65, 0x91, 0x54, 0xa1, 0x12, 0x10, 0x11, + 0x54, 0x5a, 0x0e, 0x2d, 0x66, 0x52, 0x05, 0xd9, 0xff, 0xa7, 0x43, 0xb3, 0xe7, 0x27, 0xcc, 0x4d, + 0x99, 0xd7, 0xf7, 0x26, 0xc8, 0xc8, 0xc2, 0xd4, 0x4f, 0x2f, 0x55, 0xb4, 0x56, 0x50, 0x9e, 0x4c, + 0xf5, 0xc5, 0x82, 0x51, 0xda, 0xa2, 0x82, 0x35, 0xae, 0x04, 0xc8, 0x16, 0x80, 0x2c, 0x33, 0xb0, + 0xce, 0xad, 0x5e, 0x5f, 0xe7, 0x5a, 0xc8, 0x26, 0x3e, 0x85, 0x82, 0xa4, 0x8c, 0x2f, 0x23, 0xb9, + 0x81, 0x45, 0xf0, 0x4c, 0x38, 0x32, 0x66, 0xe7, 0x13, 0x16, 0xa0, 0xa3, 0x62, 0x76, 0x3e, 0x61, + 0x41, 0x5e, 0x13, 0xd5, 0xe5, 0x71, 0xc4, 0x37, 0xf9, 0x10, 0xf4, 0x28, 0xc6, 0xfb, 0xa9, 0x0d, + 0xcb, 0x17, 0xdb, 0x3c, 0x8c, 0xa9, 0x1e, 0xc5, 0xc2, 0x0b, 0x64, 0x51, 0xd7, 0xb1, 0x94, 0x73, + 0x8b, 0xf0, 0x80, 0xe5, 0x08, 0x55, 0x14, 0xfb, 0x0e, 0xe8, 0x87, 0x31, 0xa9, 0x43, 0x65, 0xd8, + 0x1f, 0xb5, 0x57, 0xc4, 0x47, 0xaf, 0xbf, 0xd7, 0xd6, 0xec, 0x57, 0x1a, 0x58, 0xfb, 0xb3, 0xd4, + 0x11, 0x3e, 0xc5, 0x6f, 0x32, 0xea, 0xbb, 0x60, 0xf2, 0xd4, 0x49, 0x30, 0x2f, 0xea, 0x32, 0x4c, + 0x20, 0x3c, 0xe2, 0xe4, 0x01, 0xd4, 0x98, 0x37, 0x61, 0xd9, 0x6b, 0x6f, 0x2f, 0x9f, 0x93, 0x4a, + 0x32, 0xd9, 0x00, 0x83, 0xbb, 0x67, 0x6c, 0xea, 0x74, 0xaa, 0x05, 0xe3, 0x10, 0x31, 0x32, 0x85, + 0x51, 0x45, 0xc7, 0x1a, 0x3c, 0x89, 0x62, 0x2c, 0x4a, 0x6b, 0xaa, 0x06, 0x4f, 0xa2, 0x58, 0x94, + 0xa4, 0x5b, 0xf0, 0x0f, 0xfe, 0x24, 0x8c, 0x12, 0x36, 0xf6, 0x43, 0x8f, 0xcd, 0xc7, 0x6e, 0x14, + 0x9e, 0x06, 0xbe, 0x9b, 0xa2, 0x2e, 0x4d, 0xfa, 0xb6, 0x24, 0x0e, 0x04, 0x6d, 0x47, 0x91, 0xec, + 0x0f, 0xc1, 0x7a, 0xce, 0x2e, 0xb1, 0x20, 0xe4, 0xe4, 0x0e, 0xe8, 0xe7, 0x17, 0x2a, 0xd7, 0x19, + 0xe2, 0x04, 0xcf, 0x5f, 0x50, 0xfd, 0xfc, 0xc2, 0x9e, 0x83, 0x39, 0x54, 0x89, 0x9e, 0x3c, 0x12, + 0x21, 0x11, 0x43, 0xab, 0x7a, 0x58, 0x58, 0x79, 0x97, 0x6a, 0x0c, 0x9a, 0xd1, 0x85, 0x2d, 0xf1, + 0x20, 0x4a, 0x29, 0x12, 0x28, 0x57, 0x38, 0x95, 0x72, 0x85, 0x83, 0xc5, 0x5a, 0x14, 0x32, 0xe5, + 0xe2, 0xf8, 0x6d, 0xff, 0xb7, 0x0e, 0x66, 0x9e, 0x8a, 0x3e, 0x02, 0x6b, 0x9a, 0xd9, 0x43, 0x3d, + 0x59, 0x2c, 0x67, 0x73, 0x23, 0xd1, 0x82, 0xae, 0xee, 0x52, 0x5d, 0xbe, 0x4b, 0xf1, 0xe6, 0x6b, + 0x6f, 0x7c, 0xf3, 0x0f, 0xe1, 0x96, 0x1b, 0x30, 0x27, 0x1c, 0x17, 0x4f, 0x56, 0x7a, 0xe5, 0x2a, + 0xa2, 0x8f, 0xf2, 0x77, 0xab, 0xe2, 0x56, 0xbd, 0x48, 0x2f, 0xf7, 0xa1, 0xe6, 0xb1, 0x20, 0x75, + 0xca, 0xdd, 0xc9, 0x61, 0xe2, 0xb8, 0x01, 0xeb, 0x09, 0x34, 0x95, 0x54, 0xb2, 0x01, 0x66, 0x56, + 0x41, 0xa9, 0x9e, 0x04, 0x8b, 0xdf, 0x4c, 0xd9, 0x34, 0xa7, 0xda, 0x9f, 0x42, 0xe5, 0xf9, 0x8b, + 0xe1, 0x75, 0x16, 0xca, 0x75, 0xa7, 0x97, 0x74, 0xf7, 0x3d, 0xe8, 0xcf, 0x5f, 0x94, 0x63, 0x6a, + 0x33, 0x4f, 0x7d, 0xa2, 0x53, 0xd5, 0x8b, 0x4e, 0xb5, 0x0b, 0xe6, 0x8c, 0xb3, 0x64, 0x9f, 0xa5, + 0x8e, 0x7a, 0xdc, 0x39, 0x2c, 0x52, 0xa0, 0x68, 0xbb, 0xfc, 0x28, 0x54, 0x69, 0x27, 0x03, 0xed, + 0x3f, 0x54, 0xa0, 0xae, 0x1e, 0xb9, 0x58, 0x73, 0x96, 0x97, 0x7c, 0xe2, 0xb3, 0x88, 0x16, 0x7a, + 0x39, 0x5a, 0x94, 0x7b, 0xe2, 0xca, 0x9b, 0x7b, 0x62, 0xf2, 0x35, 0x34, 0x63, 0x49, 0x2b, 0xc7, + 0x97, 0x77, 0xca, 0x32, 0xea, 0x17, 0xe5, 0x1a, 0x71, 0x01, 0x88, 0x97, 0x82, 0xcd, 0x45, 0xea, + 0x4c, 0xd0, 0xd8, 0x4d, 0x5a, 0x17, 0xf0, 0xc8, 0x99, 0x5c, 0x13, 0x65, 0x7e, 0x42, 0xb0, 0x10, + 0xa5, 0x6d, 0x14, 0x77, 0x9a, 0x18, 0x00, 0x44, 0x80, 0x29, 0xbf, 0xfd, 0xd6, 0xe2, 0xdb, 0x7f, + 0x0f, 0x2c, 0x37, 0x9a, 0x4e, 0x7d, 0xa4, 0xad, 0xca, 0xa4, 0x2c, 0x11, 0x23, 0x6e, 0xbf, 0x84, + 0xba, 0xba, 0x2c, 0x69, 0x40, 0xbd, 0xd7, 0xdf, 0xdd, 0x3e, 0xde, 0x13, 0xd1, 0x07, 0xc0, 0x78, + 0x3a, 0x38, 0xd8, 0xa6, 0xff, 0xde, 0xd6, 0x44, 0x24, 0x1a, 0x1c, 0x8c, 0xda, 0x3a, 0xb1, 0xa0, + 0xb6, 0xbb, 0x77, 0xb8, 0x3d, 0x6a, 0x57, 0x88, 0x09, 0xd5, 0xa7, 0x87, 0x87, 0x7b, 0xed, 0x2a, + 0x69, 0x82, 0xd9, 0xdb, 0x1e, 0xf5, 0x47, 0x83, 0xfd, 0x7e, 0xbb, 0x26, 0x78, 0x9f, 0xf5, 0x0f, + 0xdb, 0x86, 0xf8, 0x38, 0x1e, 0xf4, 0xda, 0x75, 0x41, 0x3f, 0xda, 0x1e, 0x0e, 0xbf, 0x3d, 0xa4, + 0xbd, 0xb6, 0x29, 0xd6, 0x1d, 0x8e, 0xe8, 0xe0, 0xe0, 0x59, 0xdb, 0xb2, 0x3f, 0x85, 0x46, 0x49, + 0x69, 0x42, 0x82, 0xf6, 0x77, 0xdb, 0x2b, 0x62, 0x9b, 0x17, 0xdb, 0x7b, 0xc7, 0xfd, 0xb6, 0x46, + 0x56, 0x01, 0xf0, 0x73, 0xbc, 0xb7, 0x7d, 0xf0, 0xac, 0xad, 0xdb, 0xff, 0x02, 0xe6, 0xb1, 0xef, + 0x3d, 0x0d, 0x22, 0xf7, 0x5c, 0xf8, 0xda, 0x89, 0xc3, 0x99, 0x4a, 0xd3, 0xf8, 0x2d, 0xf2, 0x08, + 0x7a, 0x34, 0x57, 0xe6, 0x56, 0x90, 0x7d, 0x00, 0xf5, 0x63, 0xdf, 0x3b, 0x72, 0xdc, 0x73, 0xd1, + 0x4f, 0x9f, 0x08, 0xf9, 0x31, 0xf7, 0x5f, 0x32, 0x15, 0x42, 0x2d, 0xc4, 0x0c, 0xfd, 0x97, 0x8c, + 0xdc, 0x03, 0x03, 0x81, 0xac, 0xa0, 0xc2, 0x87, 0x90, 0xed, 0x49, 0x15, 0xcd, 0x4e, 0xf3, 0xa3, + 0x63, 0xaf, 0x7c, 0x17, 0xaa, 0xb1, 0xe3, 0x9e, 0xab, 0x48, 0xd4, 0x50, 0x22, 0x62, 0x3b, 0x8a, + 0x04, 0xf2, 0x10, 0x4c, 0xe5, 0x12, 0xd9, 0xba, 0x8d, 0x92, 0xef, 0xd0, 0x9c, 0xb8, 0x68, 0xac, + 0xca, 0x92, 0xb1, 0x3e, 0x07, 0x28, 0x46, 0x0b, 0x57, 0x94, 0xd6, 0xb7, 0xa1, 0xe6, 0x04, 0xbe, + 0xba, 0xbc, 0x45, 0x25, 0x60, 0x1f, 0x40, 0xa3, 0x34, 0x90, 0x10, 0x9e, 0xe2, 0x04, 0xc1, 0xf8, + 0x9c, 0x5d, 0x72, 0x94, 0x35, 0x69, 0xdd, 0x09, 0x82, 0xe7, 0xec, 0x92, 0x93, 0x7b, 0x50, 0x93, + 0xb3, 0x0c, 0x7d, 0xa9, 0x65, 0x46, 0x51, 0x2a, 0x89, 0xf6, 0xc7, 0x60, 0xc8, 0x3e, 0xba, 0xe4, + 0xa8, 0xda, 0xb5, 0x59, 0xed, 0x2b, 0x75, 0x66, 0xec, 0xba, 0xc9, 0x47, 0x6a, 0x66, 0xc2, 0xe5, + 0x84, 0x46, 0x2b, 0x2a, 0x3d, 0xc9, 0xa4, 0xc6, 0x25, 0xc8, 0x6c, 0xf7, 0xc0, 0xbc, 0x71, 0x0a, + 0xa5, 0x14, 0xa0, 0x17, 0x0a, 0xb8, 0x62, 0x2e, 0x65, 0xff, 0x07, 0x40, 0x31, 0x5b, 0x51, 0xef, + 0x46, 0xae, 0x22, 0xde, 0xcd, 0x63, 0x30, 0xdd, 0x33, 0x3f, 0xf0, 0x12, 0x16, 0x2e, 0xdc, 0xba, + 0x98, 0xc6, 0xe4, 0x74, 0xb2, 0x0e, 0x55, 0x1c, 0x19, 0x55, 0x8a, 0x08, 0x99, 0xcf, 0x8b, 0x90, + 0x62, 0x9f, 0x40, 0x4b, 0x26, 0x4b, 0xca, 0xfe, 0x73, 0xc6, 0xf8, 0x8d, 0x25, 0xd8, 0x1a, 0x40, + 0x1e, 0xcf, 0xb3, 0xe1, 0x57, 0x09, 0x23, 0x5c, 0xf9, 0xd4, 0x67, 0x81, 0x97, 0xdd, 0x46, 0x41, + 0xf6, 0x17, 0xd0, 0xcc, 0xf6, 0x50, 0x2d, 0x78, 0x96, 0xb2, 0xa5, 0x36, 0x65, 0xe7, 0x21, 0x59, + 0x0e, 0x22, 0x2f, 0xcf, 0xd8, 0xf6, 0x6f, 0xf5, 0x4c, 0x52, 0x75, 0xa3, 0x0b, 0x45, 0xa0, 0xb6, + 0x5c, 0x04, 0x2e, 0x16, 0x54, 0xfa, 0x4f, 0x2a, 0xa8, 0xbe, 0x04, 0xcb, 0xc3, 0xaa, 0xc2, 0xbf, + 0xc8, 0xe2, 0x6a, 0x77, 0xb9, 0x82, 0x50, 0x75, 0x87, 0x7f, 0xc1, 0x68, 0xc1, 0x2c, 0xce, 0x92, + 0x46, 0xe7, 0x2c, 0xf4, 0x5f, 0x62, 0xbb, 0x2d, 0x2e, 0x5c, 0x20, 0x8a, 0xd9, 0x85, 0xac, 0x34, + 0xd4, 0xec, 0x22, 0x1b, 0xc3, 0x18, 0xc5, 0x18, 0x46, 0x68, 0x6d, 0x16, 0x73, 0x96, 0xa4, 0x59, + 0xc5, 0x29, 0xa1, 0xbc, 0x72, 0xb3, 0x14, 0xaf, 0x13, 0x4e, 0xec, 0xaf, 0xc0, 0xca, 0xcf, 0x22, + 0x02, 0xda, 0xc1, 0xe1, 0x41, 0x5f, 0x86, 0x9f, 0xc1, 0x41, 0xaf, 0xff, 0x6f, 0x6d, 0x4d, 0x84, + 0x44, 0xda, 0x7f, 0xd1, 0xa7, 0xc3, 0x7e, 0x5b, 0x17, 0xa1, 0xab, 0xd7, 0xdf, 0xeb, 0x8f, 0xfa, + 0xed, 0xca, 0x37, 0x55, 0xb3, 0xde, 0x36, 0xa9, 0xc9, 0xe6, 0x71, 0xe0, 0xbb, 0x7e, 0x6a, 0x1f, + 0x83, 0xb9, 0xef, 0xc4, 0xaf, 0x75, 0x0f, 0x45, 0xa6, 0x9b, 0xa9, 0x91, 0x83, 0xca, 0x4a, 0xf7, + 0xa1, 0xae, 0x9e, 0xbc, 0xf2, 0xa6, 0x85, 0x70, 0x90, 0xd1, 0xec, 0xff, 0xd7, 0xe0, 0xf6, 0x7e, + 0x74, 0xc1, 0xf2, 0x14, 0x7f, 0xe4, 0x5c, 0x06, 0x91, 0xe3, 0xbd, 0xc1, 0x74, 0x0f, 0xe0, 0x16, + 0x8f, 0x66, 0x89, 0xcb, 0xc6, 0x4b, 0xe3, 0x8e, 0x96, 0x44, 0x3f, 0x53, 0x2e, 0x68, 0x43, 0xcb, + 0x63, 0x3c, 0x2d, 0xb8, 0x2a, 0xc8, 0xd5, 0x10, 0xc8, 0x8c, 0x27, 0xaf, 0x53, 0xaa, 0x6f, 0xaa, + 0x53, 0xec, 0xdf, 0x68, 0xd0, 0xea, 0xcf, 0xe3, 0x28, 0x49, 0xb3, 0x63, 0xde, 0xe0, 0xfe, 0x4f, + 0xc0, 0x10, 0x52, 0x33, 0xae, 0x5c, 0xab, 0x23, 0x16, 0x5e, 0x90, 0xde, 0x1c, 0x22, 0x9d, 0x2a, + 0xbe, 0xeb, 0x0b, 0xb6, 0x77, 0xa0, 0x3e, 0x0b, 0xfd, 0x79, 0x36, 0x0e, 0xaa, 0x50, 0x43, 0x80, + 0x23, 0x6e, 0x7f, 0x0d, 0x86, 0x5c, 0xa3, 0x64, 0xdd, 0x06, 0xd4, 0x87, 0xc7, 0x3b, 0x3b, 0xfd, + 0xe1, 0xb0, 0xad, 0x91, 0x16, 0x58, 0xbd, 0xe3, 0xa3, 0xbd, 0xc1, 0xce, 0xf6, 0x48, 0x59, 0x78, + 0x77, 0x7b, 0xb0, 0xd7, 0xef, 0xb5, 0x2b, 0xf6, 0x0e, 0x58, 0xa3, 0x79, 0xa8, 0xc4, 0xcb, 0xd9, + 0x55, 0xbb, 0x21, 0xbb, 0xea, 0x4b, 0x01, 0x7b, 0x08, 0x8d, 0x52, 0xb5, 0x45, 0x3e, 0x80, 0x6a, + 0x3a, 0x0f, 0x17, 0x67, 0xb0, 0xd9, 0x1e, 0x14, 0x49, 0xe4, 0x03, 0x68, 0x8a, 0xfe, 0xce, 0xe1, + 0xdc, 0x9f, 0x84, 0xcc, 0x53, 0x2b, 0x8a, 0x9e, 0x6f, 0x5b, 0xa1, 0xec, 0xbb, 0xd0, 0x12, 0x0d, + 0xb5, 0x3f, 0x65, 0x3c, 0x75, 0xa6, 0x31, 0xd6, 0x02, 0x2a, 0x04, 0x57, 0xa9, 0x9e, 0x72, 0xfb, + 0x01, 0x34, 0x8f, 0x18, 0x4b, 0x28, 0xe3, 0x71, 0x14, 0xca, 0xa4, 0xa8, 0x54, 0x2d, 0xe3, 0xbd, + 0x82, 0xec, 0xef, 0xc1, 0x12, 0xf5, 0xf2, 0x53, 0x27, 0x75, 0xcf, 0x7e, 0x4e, 0x3d, 0xfd, 0x00, + 0xea, 0xb1, 0x34, 0x91, 0xaa, 0x7e, 0x9b, 0x18, 0x72, 0x94, 0xd9, 0x68, 0x46, 0xb4, 0x3f, 0x87, + 0xca, 0xc1, 0x6c, 0x5a, 0xfe, 0x47, 0xa2, 0x2a, 0xeb, 0xbc, 0x85, 0x4e, 0x52, 0x5f, 0xec, 0x24, + 0xed, 0xef, 0xa0, 0x91, 0x5d, 0x75, 0xe0, 0xe1, 0xdf, 0x0a, 0xa8, 0xea, 0x81, 0xb7, 0xa0, 0x79, + 0xd9, 0xa2, 0xb1, 0xd0, 0x1b, 0x64, 0x3a, 0x92, 0xc0, 0xe2, 0xda, 0x6a, 0x04, 0x91, 0xaf, 0xbd, + 0x0b, 0xcd, 0xac, 0xa6, 0xc5, 0xa2, 0x52, 0x18, 0x2f, 0xf0, 0x59, 0x58, 0x32, 0xac, 0x29, 0x11, + 0x23, 0x7e, 0xc3, 0xb4, 0xd0, 0xde, 0xcc, 0x1d, 0x8b, 0x40, 0xd5, 0x8d, 0x3c, 0xf9, 0x06, 0x6b, + 0x14, 0xbf, 0xc5, 0x85, 0xa7, 0x7c, 0x92, 0xe5, 0xa5, 0x29, 0x9f, 0xd8, 0x29, 0xb4, 0x9e, 0x3a, + 0xee, 0xf9, 0x2c, 0xce, 0xf2, 0x42, 0xc9, 0x97, 0xb5, 0x05, 0x5f, 0xbe, 0x61, 0x44, 0x59, 0x72, + 0x73, 0x39, 0xa5, 0x54, 0x6e, 0x2e, 0xec, 0x9b, 0x3a, 0xc9, 0x44, 0xcd, 0x70, 0x2d, 0xaa, 0xa0, + 0xad, 0x5f, 0x6a, 0x50, 0x15, 0x06, 0x24, 0xf7, 0xa0, 0xda, 0x77, 0xcf, 0x22, 0xb2, 0x60, 0xa7, + 0xee, 0x02, 0x64, 0xaf, 0x90, 0x8f, 0xe5, 0x88, 0x36, 0x9b, 0x3c, 0xb7, 0x32, 0xfb, 0xa3, 0x7f, + 0xbc, 0xc6, 0xbd, 0x09, 0x8d, 0x6f, 0x22, 0x3f, 0xdc, 0x91, 0x53, 0x4b, 0xb2, 0xec, 0x2d, 0xaf, + 0xf1, 0x7f, 0x02, 0xc6, 0x80, 0x0b, 0xb7, 0x7c, 0x9d, 0x15, 0x9b, 0xcc, 0xb2, 0xc7, 0xda, 0x2b, + 0x5b, 0x7f, 0xd2, 0xa1, 0xfa, 0x1d, 0x4b, 0x22, 0xf2, 0x31, 0xd4, 0xd5, 0x48, 0x85, 0x94, 0x46, + 0x27, 0x5d, 0x8c, 0x43, 0x4b, 0xb3, 0x16, 0x3c, 0x95, 0xa1, 0x92, 0x5b, 0x31, 0xe7, 0xe9, 0x5e, + 0x15, 0xb3, 0xec, 0x95, 0x0d, 0xed, 0x89, 0x46, 0x3e, 0x02, 0x43, 0x3e, 0xd0, 0x25, 0xdd, 0x2c, + 0x37, 0x4a, 0xf6, 0xca, 0x13, 0x8d, 0x3c, 0x84, 0xc6, 0xf0, 0x2c, 0x9a, 0x05, 0xde, 0x90, 0x25, + 0x17, 0x8c, 0x94, 0xa6, 0x8b, 0xdd, 0xd2, 0xb7, 0xbd, 0x42, 0x36, 0x00, 0xa4, 0x0b, 0x1f, 0xfb, + 0x1e, 0x27, 0x75, 0x41, 0x3b, 0x98, 0x4d, 0xe5, 0xa2, 0x25, 0xdf, 0x96, 0x9c, 0xa5, 0x87, 0x7c, + 0x13, 0xe7, 0x67, 0xd0, 0xda, 0xc1, 0xb0, 0x72, 0x98, 0x6c, 0x9f, 0x44, 0x49, 0x4a, 0x96, 0x27, + 0x8c, 0xdd, 0x65, 0x84, 0xbd, 0x42, 0x9e, 0x80, 0x39, 0x4a, 0x2e, 0x25, 0xff, 0x5b, 0x2a, 0xdc, + 0x14, 0xfb, 0x5d, 0x71, 0xcb, 0xad, 0x1f, 0x2b, 0x60, 0x7c, 0x1b, 0x25, 0xe7, 0x2c, 0x21, 0x8f, + 0xc1, 0xc0, 0x8e, 0x56, 0xb9, 0x42, 0xde, 0xdd, 0x5e, 0xb5, 0xd1, 0x3d, 0xb0, 0x50, 0x29, 0x23, + 0x87, 0x9f, 0x4b, 0xd5, 0xe3, 0x1f, 0x7e, 0x52, 0x2f, 0xb2, 0x50, 0x41, 0x1f, 0x58, 0x1d, 0xa6, + 0x09, 0x73, 0xa6, 0x79, 0x17, 0xbf, 0xd0, 0x66, 0x76, 0xeb, 0xb2, 0x93, 0x1c, 0x2a, 0xe3, 0x3c, + 0x82, 0xea, 0x50, 0xde, 0x54, 0x30, 0x15, 0x7f, 0x8a, 0x74, 0x57, 0x33, 0x44, 0xbe, 0xf2, 0x3f, + 0x81, 0x21, 0x6b, 0x0c, 0x79, 0xcd, 0x85, 0x22, 0xac, 0xdb, 0x2e, 0xa3, 0x94, 0x80, 0x0d, 0xf5, + 0xa3, 0x59, 0x32, 0x61, 0x23, 0xbe, 0x64, 0xf9, 0xcc, 0x06, 0xf6, 0x0a, 0x79, 0x04, 0x86, 0x7c, + 0xb5, 0x72, 0xd1, 0x85, 0x17, 0x2c, 0x6f, 0x26, 0x83, 0x00, 0x2a, 0xda, 0x90, 0xb9, 0x4b, 0xb2, + 0x2e, 0xe4, 0xb1, 0xee, 0xeb, 0x28, 0xd4, 0x45, 0x9b, 0x32, 0x97, 0xf9, 0xa5, 0xe4, 0x4e, 0xb2, + 0xfb, 0x2f, 0x3f, 0x9e, 0x0d, 0x8d, 0x7c, 0x05, 0xad, 0x85, 0x42, 0x80, 0x60, 0xbe, 0xbc, 0xaa, + 0x36, 0x58, 0x16, 0x7e, 0xda, 0xfe, 0xf5, 0xab, 0x35, 0xed, 0xc7, 0x57, 0x6b, 0xda, 0xef, 0x5e, + 0xad, 0x69, 0x3f, 0xfc, 0x7e, 0x6d, 0xe5, 0xc4, 0xc0, 0xff, 0x94, 0x3f, 0xfb, 0x6b, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x8a, 0x43, 0x8b, 0x5f, 0x6e, 0x1e, 0x00, 0x00, } From 7da0cae28e03d7739b961f710d843901c1887f38 Mon Sep 17 00:00:00 2001 From: srfrog Date: Thu, 8 Nov 2018 11:15:21 -0700 Subject: [PATCH 25/25] removed unneeded fallthrough --- ee/backup/writer.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ee/backup/writer.go b/ee/backup/writer.go index e837f2afdf6..886d2b54a93 100644 --- a/ee/backup/writer.go +++ b/ee/backup/writer.go @@ -66,9 +66,7 @@ func (r *Request) newWriter() (*writer, error) { h = &fileHandler{} case "s3": h = &s3Handler{} - case "http": - fallthrough - case "https": + case "http", "https": if strings.HasPrefix(uri.Host, "s3") && strings.HasSuffix(uri.Host, ".amazonaws.com") { h = &s3Handler{}