From 59e28e5a86feeaacf7aea49e4b6b052cc05a6863 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Sat, 19 Aug 2023 16:55:52 +0300 Subject: [PATCH] updates Signed-off-by: Vasiliy Tolstov --- database.db | Bin 32768 -> 0 bytes .../postgres/000001_init_schema.up.sql | 3 +- .../sqlite/000001_init_schema.up.sql | 28 +- internal/handler/packages_modules.go | 28 + internal/models/models.go | 29 +- internal/{ => modules}/modproxy.go | 8 +- internal/{ => modules}/packages.go | 2 +- internal/storage/sqlite/queries.go | 23 +- internal/storage/sqlite/storage.go | 123 ++-- internal/storage/storage.go | 6 +- internal/worker/worker.go | 159 +++-- proto/apidocs.swagger.yaml | 173 +++-- proto/pkgdash.pb.go | 635 +++++++++--------- proto/pkgdash.pb.validate.go | 63 +- proto/pkgdash.proto | 15 +- proto/pkgdash_micro_http.pb.go | 14 +- ui/src/app/api/models/module.ts | 5 +- .../api/services/pkgdash-service.service.ts | 291 ++++---- 18 files changed, 801 insertions(+), 804 deletions(-) delete mode 100644 database.db create mode 100644 internal/handler/packages_modules.go rename internal/{ => modules}/modproxy.go (99%) rename internal/{ => modules}/packages.go (99%) diff --git a/database.db b/database.db deleted file mode 100644 index a72196bb69a05a2a4dbbf17e9fb6deaa3330377d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI*&rah;90zcl0C5PAN>vphggU1ch)rT+%s;78X+bNrD;9RyYI~xCGZ-te9sCEu zsbX36(0gB@QV)HAK0x20Pf+#VW2>q^+i}E&x%=>hDH<|5*!V*5~__o9SGu9Gkj7OnoyQVK3;fBoh=pD7&kCQ`O?g)0m zee;O>S2jg{`J^Hb!tk!aFUKn z8=Za@`#P!1aqBL+rgB~EE@#$LX^rpJkSz8_iq+|9`R&(boqN|t;3vr9HOLvb43qz~>I*cmET=Nj^P z#de$GwA=ank!zE2Kr`Oq`;Kk-JfuMt6uLOCwzqa)ZL+QHjm_7r{}}dsn++VtX1hDh z*>bVkpyK4TL$4MvaO6;5cMNRq1!fVQ_LmkPH*G&WV+Wqso{O)|<;outy^tUP0SG_< z0uX=z1Rwwb2tWV=5O{b31-VdC#;9F#gU90Z-R-@y4p?44+ zo@jMlt*hO|g1VsB)RmgH!WPsuV`)v(a#3qhwW*Y@ zXLi~M&H^fd8bzO)cGI>!Ehb*aXe#frh3d{sA%_wSM8k&|^iqDW8ll1{C67UM^0G+VX>#B88jkQSj~b`f zHG@VV4V0V+Iaxae8qI0%Tn0@iOe2cyW;`|033AhjdqXso2P4K^|L(jq>Uum=>UvJ4 zac;xsdTrzRlbD+x+F)uRL(ifVzB>EKU0xF%ojS diff --git a/internal/database/migrations/postgres/000001_init_schema.up.sql b/internal/database/migrations/postgres/000001_init_schema.up.sql index bafd27d..8ce3d0e 100644 --- a/internal/database/migrations/postgres/000001_init_schema.up.sql +++ b/internal/database/migrations/postgres/000001_init_schema.up.sql @@ -15,8 +15,7 @@ create table if not exists comment ( create table if not exists module ( id serial not null unique primary key , name varchar not null , - version varchar not null , - last_version varchar not null + version varchar not null ); create table if not exists issue ( diff --git a/internal/database/migrations/sqlite/000001_init_schema.up.sql b/internal/database/migrations/sqlite/000001_init_schema.up.sql index 6771d97..f01fd9a 100644 --- a/internal/database/migrations/sqlite/000001_init_schema.up.sql +++ b/internal/database/migrations/sqlite/000001_init_schema.up.sql @@ -6,15 +6,6 @@ create table if not exists comments ( updated timestamp not null default current_timestamp ); -create table if not exists modules ( - id integer primary key autoincrement not null, - name varchar not null , - version varchar not null, - package integer not null, - last_version varchar not null, - created timestamp not null default current_timestamp, - updated timestamp not null default current_timestamp -); create table if not exists issues ( id integer primary key autoincrement not null, @@ -36,3 +27,22 @@ create table if not exists packages ( status integer default 1, last_check timestamp ); + +CREATE UNIQUE INDEX IF NOT EXISTS unique_idx_url on packages (url); + +create table if not exists modules ( + id integer primary key autoincrement not null, + name varchar not null, + version varchar not null, + last_check timestamp not null default current_timestamp +); + +CREATE UNIQUE INDEX IF NOT EXISTS unique_idx_name_version on modules (name,version); + +create table if not exists packages_modules ( + id integer primary key autoincrement not null, + package integer, + module integer not null +); + +CREATE UNIQUE INDEX IF NOT EXISTS unique_idx_package_module on packages_modules (package,module); \ No newline at end of file diff --git a/internal/handler/packages_modules.go b/internal/handler/packages_modules.go new file mode 100644 index 0000000..efac183 --- /dev/null +++ b/internal/handler/packages_modules.go @@ -0,0 +1,28 @@ +package handler + +import ( + "context" + "net/http" + + "git.unistack.org/unistack-org/pkgdash/internal/models" + pb "git.unistack.org/unistack-org/pkgdash/proto" + httpsrv "go.unistack.org/micro-server-http/v4" + "go.unistack.org/micro/v4/logger" +) + +func (h *Handler) PackagesModules(ctx context.Context, req *pb.PackagesModulesReq, rsp *pb.PackagesModulesRsp) error { + logger.Debug(ctx, "PackagesModuleshandler start") + + modules, err := h.store.PackagesModules(ctx, req) + if err != nil { + logger.Errorf(ctx, "error db response: %v", err) + httpsrv.SetRspCode(ctx, http.StatusInternalServerError) + return httpsrv.SetError(NewInternalError(err)) + } + + for _, mod := range modules { + rsp.Modules = append(rsp.Modules, models.NewModule(mod)) + } + logger.Debug(ctx, "PackagesModules handler stop") + return nil +} diff --git a/internal/models/models.go b/internal/models/models.go index 31e2c50..1cfb98c 100644 --- a/internal/models/models.go +++ b/internal/models/models.go @@ -9,6 +9,7 @@ import ( ) type Package struct { + LastCheck sql.NullTime `db:"last_check"` Created time.Time `db:"created"` Updated time.Time `db:"updated"` Name string `db:"name"` @@ -18,7 +19,6 @@ type Package struct { Comments uint64 `db:"comments"` ID uint64 `db:"id"` Status uint64 `db:"status"` - LastCheck sql.NullTime `db:"last_check"` } func NewPackage(pkg *Package) *pb.Package { @@ -39,25 +39,22 @@ func NewPackage(pkg *Package) *pb.Package { } type Module struct { - Created time.Time `db:"created"` - Updated time.Time `db:"updated"` - Name string `db:"name"` - Version string `db:"version"` - LastVersion string `db:"last_version"` - ID uint64 `db:"id"` - Package uint64 `db:"package"` + LastCheck sql.NullTime `db:"last_check"` + Name string `db:"name"` + Version string `db:"version"` + ID uint64 `db:"id"` } func NewModule(mod *Module) *pb.Module { - return &pb.Module{ - Name: mod.Name, - Version: mod.Version, - LastVersion: mod.LastVersion, - Package: mod.Package, - Id: mod.ID, - Created: timestamppb.New(mod.Created), - Updated: timestamppb.New(mod.Updated), + rsp := &pb.Module{ + Name: mod.Name, + Version: mod.Version, + Id: mod.ID, } + if mod.LastCheck.Valid { + rsp.LastCheck = timestamppb.New(mod.LastCheck.Time) + } + return rsp } type Issue struct { diff --git a/internal/modproxy.go b/internal/modules/modproxy.go similarity index 99% rename from internal/modproxy.go rename to internal/modules/modproxy.go index 6cebcb0..efc4559 100644 --- a/internal/modproxy.go +++ b/internal/modules/modproxy.go @@ -1,4 +1,4 @@ -package internal +package modules import ( "bufio" @@ -237,19 +237,19 @@ func QueryPackage(pkgpath string, cached bool) (*Module, error) { // Update reports a newer version of a module. // The Err field will be set if an error occured. type Update struct { + Err error Module module.Version Version string - Err error } // UpdateOptions specifies a set of modules to check for updates. // The OnUpdate callback will be invoked with any updates found. type UpdateOptions struct { + OnUpdate func(Update) + Modules []module.Version Pre bool Cached bool Major bool - Modules []module.Version - OnUpdate func(Update) } // Updates finds updates for a set of specified modules. diff --git a/internal/packages.go b/internal/modules/packages.go similarity index 99% rename from internal/packages.go rename to internal/modules/packages.go index 011f5a2..ab089d2 100644 --- a/internal/packages.go +++ b/internal/modules/packages.go @@ -1,4 +1,4 @@ -package internal +package modules import ( "fmt" diff --git a/internal/storage/sqlite/queries.go b/internal/storage/sqlite/queries.go index d06ab6a..0734f85 100644 --- a/internal/storage/sqlite/queries.go +++ b/internal/storage/sqlite/queries.go @@ -1,14 +1,17 @@ package sqlite const ( - queryPackagesProcess = `select id, name, url, comments, modules, issues, created, updated from packages where ROUND((JULIANDAY(CURRENT_TIMESTAMP) - JULIANDAY(last_check)) * 86400) > $1 or last_check is NULL` - queryPackagesModulesCount = `update packages set modules = $2, last_check = CURRENT_TIMESTAMP where id = $1;` - queryPackagesList = `select id, name, url, comments, modules, issues, created, updated from packages;` - queryPackagesLookup = `select id, name, url, comments, modules, issues, created, updated from packages where id = $1;` - queryCommentsCreate = `insert into comments (comment) values ($1) returning id;` - queryPackagesCreate = `insert into packages (name, url) values ($1, $2) returning *;` - queryInsMsgGetIDs = `insert into modules(name, version, last_version) values %s returning id;` - queryModulesList = `select id, name, version, last_version, created, updated from modules;` - queryModulesCreate = `insert into modules (name, version, last_version, package) values ($1, $2, $3, $4) returning *;` - queryCommentsList = `select id, text, created, updated from comments;` + queryPackagesModulesCreate = `insert into packages_modules as pm (package, module) values ($1, $2) on conflict (package,module) do nothing;` + queryPackagesUpdateLastCheck = `update packages set last_check = CURRENT_TIMESTAMP where id = $1;` + queryPackagesModules = `select modules.id, modules.name, modules.version from modules left join packages_modules on modules.id = packages_modules.module left join packages on packages.id = packages_modules.package where packages_modules.package = $1;` + queryPackagesProcess = `select id, name, url, comments, modules, issues, created, updated, last_check from packages where ROUND((JULIANDAY(CURRENT_TIMESTAMP) - JULIANDAY(last_check)) * 86400) > $1 or last_check is NULL` + queryModulesProcess = `select id, name, version, last_check from modules where ROUND((JULIANDAY(CURRENT_TIMESTAMP) - JULIANDAY(last_check)) * 86400) > $1 or last_check is NULL` + queryPackagesModulesCount = `update packages set modules = $2, last_check = CURRENT_TIMESTAMP where id = $1;` + queryPackagesList = `select id, name, url, comments, modules, issues, created, updated from packages;` + queryPackagesLookup = `select id, name, url, comments, modules, issues, created, updated from packages where id = $1;` + queryCommentsCreate = `insert into comments (comment) values ($1) returning id;` + queryPackagesCreate = `insert into packages as p (name, url) values ($1, $2) on conflict (url) do update set name = p.name returning *;` + queryModulesList = `select id, name, version from modules;` + queryModulesCreate = `insert into modules as m (name, version) values ($1, $2) on conflict (name,version) do update set last_check = CURRENT_TIMESTAMP returning *;` + queryCommentsList = `select id, text, created, updated from comments;` ) diff --git a/internal/storage/sqlite/storage.go b/internal/storage/sqlite/storage.go index 2bc0129..3f8d89a 100644 --- a/internal/storage/sqlite/storage.go +++ b/internal/storage/sqlite/storage.go @@ -3,7 +3,6 @@ package sqlite import ( "context" "fmt" - "strings" "time" "git.unistack.org/unistack-org/pkgdash/internal/models" @@ -29,6 +28,34 @@ func NewStorage() func(*sqlx.DB) interface{} { } } +func (s *Sqlite) PackagesModulesCreate(ctx context.Context, pkg *models.Package, modules []*models.Module) error { + tx, err := s.db.BeginTxx(ctx, nil) + if err != nil { + return err + } + + for _, mod := range modules { + err = tx.GetContext(ctx, mod, queryModulesCreate, mod.Name, mod.Version) + if err != nil { + _ = tx.Rollback() + return err + } + _, err = tx.ExecContext(ctx, queryPackagesModulesCreate, pkg.ID, mod.ID) + if err != nil { + _ = tx.Rollback() + return err + } + + } + + if err = tx.Commit(); err != nil { + _ = tx.Rollback() + return err + } + + return nil +} + func (s *Sqlite) PackagesDelete(ctx context.Context, req *pb.PackagesDeleteReq) error { return fmt.Errorf("need implement") } @@ -59,6 +86,17 @@ func (s *Sqlite) PackagesList(ctx context.Context, req *pb.PackagesListReq) ([]* return packages, nil } +func (s *Sqlite) PackagesModules(ctx context.Context, req *pb.PackagesModulesReq) ([]*models.Module, error) { + var modules []*models.Module + + err := s.db.SelectContext(ctx, &modules, queryPackagesModules, req.Package) + if err != nil { + return nil, err + } + + return modules, nil +} + func (s *Sqlite) CommentsDelete(ctx context.Context, req *pb.CommentsDeleteReq) error { return nil } @@ -96,6 +134,36 @@ func (s *Sqlite) PackagesProcess(ctx context.Context, td time.Duration) ([]*mode return packages, nil } +func (s *Sqlite) PackagesUpdateLastCheck(ctx context.Context, packages []*models.Package) error { + tx, err := s.db.BeginTxx(ctx, nil) + if err != nil { + return err + } + for _, pkg := range packages { + if _, err = tx.ExecContext(ctx, queryPackagesUpdateLastCheck, pkg.ID); err != nil { + tx.Rollback() + return err + } + } + + if err = tx.Commit(); err != nil { + tx.Rollback() + return err + } + + return nil +} + +func (s *Sqlite) ModulesProcess(ctx context.Context, td time.Duration) ([]*models.Module, error) { + var modules []*models.Module + err := s.db.SelectContext(ctx, &modules, queryModulesProcess, td.Seconds()) + if err != nil { + return nil, err + } + + return modules, nil +} + func (s *Sqlite) PackagesCreate(ctx context.Context, req *pb.PackagesCreateReq) (*models.Package, error) { pkg := &models.Package{} err := s.db.GetContext(ctx, pkg, queryPackagesCreate, req.Name, req.Url) @@ -106,25 +174,20 @@ func (s *Sqlite) PackagesCreate(ctx context.Context, req *pb.PackagesCreateReq) return pkg, nil } -func (s *Sqlite) PackagesModulesCreate(ctx context.Context, pkg *models.Package, modules []*models.Module) error { +func (s *Sqlite) ModulesCreate(ctx context.Context, modules []*models.Module) error { tx, err := s.db.BeginTxx(ctx, nil) if err != nil { return err } for _, mod := range modules { - err = tx.GetContext(ctx, mod, queryModulesCreate, mod.Name, mod.Version, mod.LastVersion, mod.Package) + err = tx.GetContext(ctx, mod, queryModulesCreate, mod.Name, mod.Version) if err != nil { _ = tx.Rollback() return err } } - if _, err = tx.ExecContext(ctx, queryPackagesModulesCount, pkg.ID, len(modules)); err != nil { - _ = tx.Rollback() - return err - } - if err = tx.Commit(); err != nil { _ = tx.Rollback() return err @@ -134,41 +197,12 @@ func (s *Sqlite) PackagesModulesCreate(ctx context.Context, pkg *models.Package, } func (s *Sqlite) ModulesList(ctx context.Context, req *pb.ModulesListReq) ([]*models.Module, error) { - var err error var modules []*models.Module - rows, err := s.db.QueryContext(ctx, queryModulesList) + err := s.db.SelectContext(ctx, &modules, queryModulesList) if err != nil { return nil, err } - defer func() { - if err = rows.Close(); err != nil { - return - } - err = rows.Err() - }() - - for ; rows.Err() == nil; rows.Next() { - mod := &models.Module{} - if err = rows.Scan( - &mod.ID, - &mod.Name, - &mod.Version, - &mod.LastVersion, - ); err != nil { - return nil, err - } - - modules = append(modules, mod) - } - - if err = rows.Err(); err != nil { - return nil, err - } - - if err = rows.Close(); err != nil { - return nil, err - } return modules, nil } @@ -183,16 +217,3 @@ func (s *Sqlite) CommentsList(ctx context.Context, req *pb.CommentsListReq) ([]* return comments, nil } - -func generateQuery(rsp []models.Module) string { - const pattern = `%c('%s', '%s', '%s')` - build := strings.Builder{} - comma := ' ' - for i := range rsp { - str := fmt.Sprintf(pattern, comma, rsp[i].Name, rsp[i].Version, rsp[i].LastVersion) - build.WriteString(str) - comma = ',' - } - - return fmt.Sprintf(queryInsMsgGetIDs, build.String()) -} diff --git a/internal/storage/storage.go b/internal/storage/storage.go index 55e818e..504497b 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -17,6 +17,10 @@ func RegisterStorage(name string, fn func(*sqlx.DB) interface{}) { var storages = map[string]func(*sqlx.DB) interface{}{} type Storage interface { + PackagesModulesCreate(ctx context.Context, pkg *models.Package, modules []*models.Module) error + PackagesUpdateLastCheck(ctx context.Context, packages []*models.Package) error + PackagesModules(ctx context.Context, req *pb.PackagesModulesReq) ([]*models.Module, error) + ModulesProcess(ctx context.Context, td time.Duration) ([]*models.Module, error) PackagesProcess(ctx context.Context, td time.Duration) ([]*models.Package, error) PackagesCreate(ctx context.Context, req *pb.PackagesCreateReq) (*models.Package, error) PackagesList(ctx context.Context, req *pb.PackagesListReq) ([]*models.Package, error) @@ -27,7 +31,7 @@ type Storage interface { CommentsDelete(ctx context.Context, req *pb.CommentsDeleteReq) error CommentsList(ctx context.Context, req *pb.CommentsListReq) ([]*models.Comment, error) ModulesList(ctx context.Context, req *pb.ModulesListReq) ([]*models.Module, error) - PackagesModulesCreate(ctx context.Context, pkg *models.Package, modules []*models.Module) error + ModulesCreate(ctx context.Context, modules []*models.Module) error } func NewStorage(name string, db *sqlx.DB) (Storage, error) { diff --git a/internal/worker/worker.go b/internal/worker/worker.go index e0e459d..4a9fbce 100644 --- a/internal/worker/worker.go +++ b/internal/worker/worker.go @@ -12,8 +12,8 @@ import ( "sync" "time" - "git.unistack.org/unistack-org/pkgdash/internal" "git.unistack.org/unistack-org/pkgdash/internal/models" + "git.unistack.org/unistack-org/pkgdash/internal/modules" "git.unistack.org/unistack-org/pkgdash/internal/storage" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/filemode" @@ -26,63 +26,68 @@ import ( ) func Run(ctx context.Context, store storage.Storage, td time.Duration) { - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() + modTicker := time.NewTicker(5 * time.Second) + defer modTicker.Stop() + pkgTicker := time.NewTicker(5 * time.Second) + defer pkgTicker.Stop() + var wg sync.WaitGroup for { select { case <-ctx.Done(): return - case <-ticker.C: - logger.Infof(ctx, "check packages to process") + case <-pkgTicker.C: packages, err := store.PackagesProcess(ctx, td) - logger.Infof(ctx, "check packages to process %#+v, err: %v", packages, err) - if err != nil && err != sql.ErrNoRows { + if err != nil { + if err != sql.ErrNoRows { + continue + } logger.Fatalf(ctx, "failed to get packages to process: %v", err) } wg.Add(len(packages)) for _, pkg := range packages { go func(p *models.Package) { - if err := process(ctx, store, p); err != nil { + if err := parseModFile(ctx, store, p); err != nil { logger.Errorf(ctx, "failed to process package %s: %v", p.Name, err) } + p.LastCheck.Time = time.Now() wg.Done() }(pkg) } wg.Wait() + if err = store.PackagesUpdateLastCheck(ctx, packages); err != nil { + logger.Errorf(ctx, "update packages last_check %#+v, err: %v", packages, err) + } + case <-modTicker.C: + modules, err := store.ModulesProcess(ctx, td) + if err != nil { + if err != sql.ErrNoRows { + continue + } + logger.Fatalf(ctx, "failed to get modules to process: %v", err) + } + if err := processModules(ctx, store, modules); err != nil { + logger.Errorf(ctx, "failed to process modules: %v", err) + } } } } -func process(ctx context.Context, store storage.Storage, pkg *models.Package) error { +func parseModFile(ctx context.Context, store storage.Storage, pkg *models.Package) error { logger.Infof(ctx, "process package %v", pkg) - modules, err := getGoModule(ctx, pkg.ID, pkg.URL) + + u, err := url.Parse(pkg.URL) if err != nil { - logger.Errorf(ctx, "failed to get modules: %v", err) return err } - if err = store.PackagesModulesCreate(ctx, pkg, modules); err != nil { - logger.Errorf(ctx, "failed to set create modules: %v", err) - return err - } - - return nil -} - -func getGoModule(ctx context.Context, pkgID uint64, gitUrl string) ([]*models.Module, error) { - u, err := url.Parse(gitUrl) - if err != nil { - logger.Fatal(ctx, err) - } - var rev string if idx := strings.Index(u.Path, "@"); idx > 0 { rev = u.Path[idx+1:] } cloneOpts := &git.CloneOptions{ - URL: gitUrl, + URL: pkg.URL, Progress: os.Stdout, } @@ -92,27 +97,27 @@ func getGoModule(ctx context.Context, pkgID uint64, gitUrl string) ([]*models.Mo } if err = cloneOpts.Validate(); err != nil { - return nil, err + return err } repo, err := git.CloneContext(ctx, memory.NewStorage(), nil, cloneOpts) if err != nil { - return nil, err + return err } ref, err := repo.Head() if err != nil { - return nil, fmt.Errorf("failed to get head: %v", err) + return fmt.Errorf("failed to get head: %v", err) } commit, err := repo.CommitObject(ref.Hash()) if err != nil { - return nil, fmt.Errorf("failed to get commit: %v", err) + return fmt.Errorf("failed to get commit: %v", err) } tree, err := commit.Tree() if err != nil { - return nil, err + return err } unique := make(map[string]*models.Module) @@ -127,73 +132,95 @@ func getGoModule(ctx context.Context, pkgID uint64, gitUrl string) ([]*models.Mo switch file.Mode { case filemode.Regular: if strings.HasSuffix(file.Name, "go.mod") { - if mvs, err = Direct(file); err != nil { + if mvs, err = parseFile(file); err != nil { return err } for i := range mvs { unique[mvs[i].Path] = &models.Module{ - Package: pkgID, - Name: mvs[i].Path, - Version: mvs[i].Version, - LastVersion: mvs[i].Version, + Name: mvs[i].Path, + Version: mvs[i].Version, } } - internal.Updates(internal.UpdateOptions{ - Pre: false, - Major: false, - Cached: false, - Modules: mvs, - OnUpdate: func(u internal.Update) { - if u.Err != nil { - logger.Errorf(ctx, "%s: failed: %v\n", u.Module.Path, u.Err) - } else { - val := unique[u.Module.Path] - val.LastVersion = u.Version - unique[u.Module.Path] = val - } - }, - }) } } return nil }) - result := make([]*models.Module, 0, len(unique)) + modules := make([]*models.Module, 0, len(unique)) for _, v := range unique { - result = append(result, v) + modules = append(modules, v) } - sort.Slice(result, func(i, j int) bool { - return result[i].Name < result[j].Name + sort.Slice(modules, func(i, j int) bool { + return modules[i].Name < modules[j].Name }) - return result, err + if err = store.PackagesModulesCreate(ctx, pkg, modules); err != nil { + logger.Errorf(ctx, "failed to set create modules: %v", err) + return err + } + + return nil } -func Direct(file *object.File) ([]module.Version, error) { +func processModules(ctx context.Context, store storage.Storage, mods []*models.Module) error { + mvs := make(map[string]*models.Module, len(mods)) + + for _, mod := range mods { + mvs[mod.Name] = mod + } + + mvsu := make([]module.Version, 0, len(mvs)) + for _, mv := range mvs { + mvsu = append(mvsu, module.Version{Path: mv.Name, Version: mv.Version}) + } + + modules.Updates(modules.UpdateOptions{ + Pre: false, + Major: false, + Cached: false, + Modules: mvsu, + OnUpdate: func(u modules.Update) { + if u.Err != nil { + logger.Errorf(ctx, "%s: failed: %v", u.Module.Path, u.Err) + } else { + mvs[u.Module.Path].Version = u.Version + } + }, + }) + + if err := store.ModulesCreate(ctx, mods); err != nil { + return err + } + + return nil +} + +func parseFile(file *object.File) ([]module.Version, error) { r, err := file.Reader() if err != nil { return nil, err } - defer r.Close() + data, err := io.ReadAll(r) + r.Close() if err != nil { return nil, err } + modfile, err := modfile.ParseLax("go.mod", data, nil) if err != nil { return nil, err } - var mods []module.Version + + mods := make([]module.Version, 0, len(modfile.Require)) for _, req := range modfile.Require { - // if !req.Indirect { mods = append(mods, req.Mod) - //} } - /* - sort.Slice(mods, func(i, j int) bool { - return mods[i].Path < mods[j].Path - }) - */ + + sort.Slice(mods, func(i, j int) bool { + return mods[i].Path < mods[j].Path + }) + return mods, nil } diff --git a/proto/apidocs.swagger.yaml b/proto/apidocs.swagger.yaml index 7e323a1..742501c 100644 --- a/proto/apidocs.swagger.yaml +++ b/proto/apidocs.swagger.yaml @@ -173,86 +173,6 @@ paths: application/json: schema: $ref: '#/components/schemas/PackagesDeleteRsp' - /v1/packages/{id}/modules: - get: - tags: - - PkgdashService - operationId: PackagesModules - parameters: - - name: id - in: path - required: true - schema: - type: integer - format: uint64 - responses: - default: - description: Default - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRsp' - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/PackagesModulesRsp' - /v1/packages/{package_id}/comments: - get: - tags: - - PkgdashService - operationId: CommentsList - parameters: - - name: package_id - in: path - required: true - schema: - type: integer - format: uint64 - responses: - default: - description: Default - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRsp' - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/CommentsListRsp' - post: - tags: - - PkgdashService - operationId: CommentsCreate - parameters: - - name: package_id - in: path - required: true - schema: - type: integer - format: uint64 - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/CommentsCreateReq' - required: true - responses: - default: - description: Default - content: - application/json: - schema: - $ref: '#/components/schemas/ErrorRsp' - "200": - description: OK - content: - application/json: - schema: - $ref: '#/components/schemas/CommentsCreateRsp' /v1/packages/{package_id}/comments/{id}: delete: tags: @@ -284,6 +204,89 @@ paths: application/json: schema: $ref: '#/components/schemas/CommentsDeleteRsp' + /v1/packages/{package}/comments: + get: + tags: + - PkgdashService + operationId: CommentsList + parameters: + - name: package + in: path + required: true + schema: + type: string + - name: package_id + in: query + schema: + type: integer + format: uint64 + responses: + default: + description: Default + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorRsp' + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CommentsListRsp' + post: + tags: + - PkgdashService + operationId: CommentsCreate + parameters: + - name: package + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CommentsCreateReq' + required: true + responses: + default: + description: Default + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorRsp' + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/CommentsCreateRsp' + /v1/packages/{package}/modules: + get: + tags: + - PkgdashService + operationId: PackagesModules + parameters: + - name: package + in: path + required: true + schema: + type: integer + format: uint64 + responses: + default: + description: Default + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorRsp' + "200": + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/PackagesModulesRsp' components: schemas: Comment: @@ -352,15 +355,7 @@ components: type: string version: type: string - package: - type: integer - format: uint64 - last_version: - type: string - created: - type: string - format: RFC3339 - updated: + last_check: type: string format: RFC3339 ModulesListRsp: diff --git a/proto/pkgdash.pb.go b/proto/pkgdash.pb.go index 85d8695..8ed7608 100644 --- a/proto/pkgdash.pb.go +++ b/proto/pkgdash.pb.go @@ -29,7 +29,7 @@ type PackagesModulesReq struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Package uint64 `protobuf:"varint,1,opt,name=package,proto3" json:"package,omitempty"` } func (x *PackagesModulesReq) Reset() { @@ -64,9 +64,9 @@ func (*PackagesModulesReq) Descriptor() ([]byte, []int) { return file_pkgdash_proto_rawDescGZIP(), []int{0} } -func (x *PackagesModulesReq) GetId() uint64 { +func (x *PackagesModulesReq) GetPackage() uint64 { if x != nil { - return x.Id + return x.Package } return 0 } @@ -399,13 +399,10 @@ type Module struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - Package uint64 `protobuf:"varint,4,opt,name=package,proto3" json:"package,omitempty"` - LastVersion string `protobuf:"bytes,5,opt,name=last_version,json=lastVersion,proto3" json:"last_version,omitempty"` - Created *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=created,proto3" json:"created,omitempty"` - Updated *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=updated,proto3" json:"updated,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + LastCheck *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=last_check,json=lastCheck,proto3" json:"last_check,omitempty"` } func (x *Module) Reset() { @@ -461,30 +458,9 @@ func (x *Module) GetVersion() string { return "" } -func (x *Module) GetPackage() uint64 { +func (x *Module) GetLastCheck() *timestamppb.Timestamp { if x != nil { - return x.Package - } - return 0 -} - -func (x *Module) GetLastVersion() string { - if x != nil { - return x.LastVersion - } - return "" -} - -func (x *Module) GetCreated() *timestamppb.Timestamp { - if x != nil { - return x.Created - } - return nil -} - -func (x *Module) GetUpdated() *timestamppb.Timestamp { - if x != nil { - return x.Updated + return x.LastCheck } return nil } @@ -1556,277 +1532,269 @@ var file_pkgdash_proto_rawDesc = []byte{ 0x1a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x24, 0x0a, 0x12, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x12, - 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, - 0x73, 0x70, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x23, 0x0a, - 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x22, 0x62, 0x0a, 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xcf, 0x02, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x39, - 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x9c, 0x02, 0x0a, 0x06, 0x4d, 0x6f, - 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x12, 0x2a, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2e, 0x0a, 0x12, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x3f, 0x0a, 0x12, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x07, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, + 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x23, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x11, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, + 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x62, 0x0a, + 0x08, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x22, 0xcf, 0x02, 0x0a, 0x07, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x17, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, + 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, + 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x87, 0x02, 0x0a, 0x05, 0x49, 0x73, 0x73, - 0x75, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x32, 0x02, 0x20, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, - 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, - 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x22, 0xcb, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, - 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, - 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x22, 0x43, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x23, 0x0a, 0x11, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x13, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x73, 0x70, 0x22, 0x11, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x3f, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, - 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x17, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x22, 0x9c, 0x01, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, - 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, - 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, - 0x73, 0x22, 0x3f, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, - 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x22, 0x56, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x27, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x32, 0x02, 0x20, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x43, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x12, - 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x65, 0x0a, 0x11, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, - 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, 0x3b, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, - 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x11, 0x43, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, - 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x32, 0xd5, 0x0d, 0x0a, - 0x0e, 0x50, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x91, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x1a, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x22, 0x87, 0x02, 0x0a, 0x05, 0x49, 0x73, 0x73, 0x75, 0x65, 0x12, 0x17, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, + 0x00, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x64, + 0x65, 0x73, 0x63, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0xcb, 0x01, 0x0a, + 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x21, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x07, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x34, + 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x43, 0x0a, 0x11, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x13, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x73, 0x70, 0x22, 0x23, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x13, 0x0a, 0x11, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x11, + 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x22, 0x3f, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, + 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x04, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x11, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, + 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x11, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x27, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x32, 0x02, 0x20, 0x00, 0x52, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, + 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x65, 0x0a, 0x11, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x04, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x11, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, + 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x52, 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0x10, 0x0a, + 0x0e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x22, + 0x3b, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, + 0x70, 0x12, 0x29, 0x0a, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0f, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x12, + 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, + 0x3f, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x73, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x43, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, + 0x75, 0x70, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x3f, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x70, 0x6b, + 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x32, 0xd1, 0x0d, 0x0a, 0x0e, 0x50, 0x6b, 0x67, 0x64, 0x61, + 0x73, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x01, 0x0a, 0x0e, 0x50, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x1a, 0x2e, 0x70, + 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, + 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, + 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x52, 0x73, 0x70, 0x22, 0x47, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x42, 0x17, 0x0a, 0x15, 0x12, + 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x13, 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x8f, 0x01, + 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, + 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x45, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, + 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x11, 0x22, 0x0c, + 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x91, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, 0x22, 0x47, 0xaa, 0x84, 0x9e, 0x03, - 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x47, 0xaa, 0x84, 0x9e, 0x03, + 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x13, - 0x12, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x12, 0x8f, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, - 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, - 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x45, - 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, - 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, - 0xff, 0xf9, 0x01, 0x11, 0x22, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x91, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x73, 0x70, - 0x22, 0x47, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, - 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, - 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x13, 0x2a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x84, 0x01, 0x0a, 0x0c, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x70, 0x6b, 0x67, - 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x22, 0x40, - 0xaa, 0x84, 0x9e, 0x03, 0x27, 0x2a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, - 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, - 0x01, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, - 0x12, 0x9d, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, - 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x73, 0x70, 0x22, 0x50, - 0xaa, 0x84, 0x9e, 0x03, 0x2a, 0x2a, 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, - 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, - 0xea, 0xff, 0xf9, 0x01, 0x1b, 0x12, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x94, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x4a, 0xaa, 0x84, 0x9e, - 0x03, 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, - 0x16, 0x1a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, - 0x7b, 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0xa5, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, - 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x73, 0x70, 0x22, 0x5b, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, - 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x27, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x12, - 0xc5, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, - 0x75, 0x70, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x1a, - 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, 0x22, 0x7b, 0xaa, 0x84, 0x9e, 0x03, - 0x29, 0x2a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, - 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x47, - 0x12, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x29, 0x12, 0x27, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x9a, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, - 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x22, 0x56, 0xaa, 0x84, - 0x9e, 0x03, 0x27, 0x2a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, - 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x24, - 0x12, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0xbc, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, - 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, - 0x72, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, - 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, - 0xea, 0xff, 0xf9, 0x01, 0x3e, 0x2a, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x5a, 0x13, - 0x2a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, - 0x69, 0x64, 0x7d, 0x12, 0x7f, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x6b, - 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x73, 0x70, 0x22, 0x3e, 0xaa, 0x84, 0x9e, 0x03, 0x26, 0x2a, 0x0b, 0x4d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, + 0x2a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x12, 0x84, 0x01, 0x0a, 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x18, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x18, + 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x22, 0x40, 0xaa, 0x84, 0x9e, 0x03, 0x27, 0x2a, + 0x0c, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x17, 0x0a, + 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x0e, 0x12, 0x0c, 0x2f, 0x76, + 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0xa2, 0x01, 0x0a, 0x0f, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x1b, + 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x70, 0x6b, + 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x73, 0x70, 0x22, 0x55, 0xaa, 0x84, 0x9e, 0x03, 0x2a, 0x2a, + 0x0f, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, + 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, + 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x20, 0x12, + 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x7d, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, + 0x94, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, + 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x4a, 0xaa, 0x84, 0x9e, 0x03, + 0x29, 0x2a, 0x0e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, + 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x16, + 0x1a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x3a, 0x01, 0x2a, 0x12, 0xa2, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, + 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x73, + 0x70, 0x22, 0x58, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, - 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x0d, 0x12, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x75, 0x6e, 0x69, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x3b, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x24, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x7d, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0xc2, 0x01, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x1a, + 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, + 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x52, 0x73, 0x70, 0x22, 0x78, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x42, 0x17, 0x0a, + 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x44, 0x12, 0x1a, 0x2f, 0x76, + 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x26, 0x12, 0x24, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, + 0x12, 0x97, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x18, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x70, 0x6b, + 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x73, 0x70, 0x22, 0x53, 0xaa, 0x84, 0x9e, 0x03, 0x27, 0x2a, 0x0c, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x17, 0x0a, 0x15, 0x12, 0x13, + 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x21, 0x12, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xbc, 0x01, 0x0a, 0x0e, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1a, 0x2e, + 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x70, 0x6b, 0x67, 0x64, + 0x61, 0x73, 0x68, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x73, 0x70, 0x22, 0x72, 0xaa, 0x84, 0x9e, 0x03, 0x29, 0x2a, 0x0e, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x17, 0x0a, 0x15, + 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x3e, 0x2a, 0x27, 0x2f, 0x76, 0x31, + 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x7b, 0x69, 0x64, 0x7d, 0x5a, 0x13, 0x2a, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x7f, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, + 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x1a, 0x17, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x73, 0x70, 0x22, 0x3e, 0xaa, 0x84, 0x9e, 0x03, + 0x26, 0x2a, 0x0b, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x17, + 0x0a, 0x15, 0x12, 0x13, 0x0a, 0x11, 0x2e, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x52, 0x73, 0x70, 0xb2, 0xea, 0xff, 0xf9, 0x01, 0x0d, 0x12, 0x0b, 0x2f, + 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, + 0x2e, 0x75, 0x6e, 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x75, 0x6e, + 0x69, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x6f, 0x72, 0x67, 0x2f, 0x70, 0x6b, 0x67, 0x64, 0x61, + 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x70, 0x6b, 0x67, 0x64, 0x61, 0x73, 0x68, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1878,46 +1846,45 @@ var file_pkgdash_proto_depIdxs = []int32{ 27, // 2: pkgdash.Package.created:type_name -> google.protobuf.Timestamp 27, // 3: pkgdash.Package.updated:type_name -> google.protobuf.Timestamp 27, // 4: pkgdash.Package.last_check:type_name -> google.protobuf.Timestamp - 27, // 5: pkgdash.Module.created:type_name -> google.protobuf.Timestamp - 27, // 6: pkgdash.Module.updated:type_name -> google.protobuf.Timestamp - 27, // 7: pkgdash.Issue.created:type_name -> google.protobuf.Timestamp - 27, // 8: pkgdash.Issue.updated:type_name -> google.protobuf.Timestamp - 27, // 9: pkgdash.Comment.created:type_name -> google.protobuf.Timestamp - 27, // 10: pkgdash.Comment.updated:type_name -> google.protobuf.Timestamp - 5, // 11: pkgdash.PackagesListRsp.packages:type_name -> pkgdash.Package - 5, // 12: pkgdash.PackagesUpdateRsp.package:type_name -> pkgdash.Package - 8, // 13: pkgdash.CommentsCreateRsp.comment:type_name -> pkgdash.Comment - 5, // 14: pkgdash.PackagesCreateRsp.package:type_name -> pkgdash.Package - 6, // 15: pkgdash.ModulesListRsp.modules:type_name -> pkgdash.Module - 8, // 16: pkgdash.CommentsListRsp.comments:type_name -> pkgdash.Comment - 8, // 17: pkgdash.CommentsLookupRsp.comment:type_name -> pkgdash.Comment - 2, // 18: pkgdash.PkgdashService.PackagesLookup:input_type -> pkgdash.PackagesLookupReq - 19, // 19: pkgdash.PkgdashService.PackagesCreate:input_type -> pkgdash.PackagesCreateReq - 11, // 20: pkgdash.PkgdashService.PackagesDelete:input_type -> pkgdash.PackagesDeleteReq - 13, // 21: pkgdash.PkgdashService.PackagesList:input_type -> pkgdash.PackagesListReq - 0, // 22: pkgdash.PkgdashService.PackagesModules:input_type -> pkgdash.PackagesModulesReq - 15, // 23: pkgdash.PkgdashService.PackagesUpdate:input_type -> pkgdash.PackagesUpdateReq - 17, // 24: pkgdash.PkgdashService.CommentsCreate:input_type -> pkgdash.CommentsCreateReq - 25, // 25: pkgdash.PkgdashService.CommentsLookup:input_type -> pkgdash.CommentsLookupReq - 23, // 26: pkgdash.PkgdashService.CommentsList:input_type -> pkgdash.CommentsListReq - 9, // 27: pkgdash.PkgdashService.CommentsDelete:input_type -> pkgdash.CommentsDeleteReq - 21, // 28: pkgdash.PkgdashService.ModulesList:input_type -> pkgdash.ModulesListReq - 3, // 29: pkgdash.PkgdashService.PackagesLookup:output_type -> pkgdash.PackagesLookupRsp - 20, // 30: pkgdash.PkgdashService.PackagesCreate:output_type -> pkgdash.PackagesCreateRsp - 12, // 31: pkgdash.PkgdashService.PackagesDelete:output_type -> pkgdash.PackagesDeleteRsp - 14, // 32: pkgdash.PkgdashService.PackagesList:output_type -> pkgdash.PackagesListRsp - 1, // 33: pkgdash.PkgdashService.PackagesModules:output_type -> pkgdash.PackagesModulesRsp - 16, // 34: pkgdash.PkgdashService.PackagesUpdate:output_type -> pkgdash.PackagesUpdateRsp - 18, // 35: pkgdash.PkgdashService.CommentsCreate:output_type -> pkgdash.CommentsCreateRsp - 26, // 36: pkgdash.PkgdashService.CommentsLookup:output_type -> pkgdash.CommentsLookupRsp - 24, // 37: pkgdash.PkgdashService.CommentsList:output_type -> pkgdash.CommentsListRsp - 10, // 38: pkgdash.PkgdashService.CommentsDelete:output_type -> pkgdash.CommentsDeleteRsp - 22, // 39: pkgdash.PkgdashService.ModulesList:output_type -> pkgdash.ModulesListRsp - 29, // [29:40] is the sub-list for method output_type - 18, // [18:29] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 27, // 5: pkgdash.Module.last_check:type_name -> google.protobuf.Timestamp + 27, // 6: pkgdash.Issue.created:type_name -> google.protobuf.Timestamp + 27, // 7: pkgdash.Issue.updated:type_name -> google.protobuf.Timestamp + 27, // 8: pkgdash.Comment.created:type_name -> google.protobuf.Timestamp + 27, // 9: pkgdash.Comment.updated:type_name -> google.protobuf.Timestamp + 5, // 10: pkgdash.PackagesListRsp.packages:type_name -> pkgdash.Package + 5, // 11: pkgdash.PackagesUpdateRsp.package:type_name -> pkgdash.Package + 8, // 12: pkgdash.CommentsCreateRsp.comment:type_name -> pkgdash.Comment + 5, // 13: pkgdash.PackagesCreateRsp.package:type_name -> pkgdash.Package + 6, // 14: pkgdash.ModulesListRsp.modules:type_name -> pkgdash.Module + 8, // 15: pkgdash.CommentsListRsp.comments:type_name -> pkgdash.Comment + 8, // 16: pkgdash.CommentsLookupRsp.comment:type_name -> pkgdash.Comment + 2, // 17: pkgdash.PkgdashService.PackagesLookup:input_type -> pkgdash.PackagesLookupReq + 19, // 18: pkgdash.PkgdashService.PackagesCreate:input_type -> pkgdash.PackagesCreateReq + 11, // 19: pkgdash.PkgdashService.PackagesDelete:input_type -> pkgdash.PackagesDeleteReq + 13, // 20: pkgdash.PkgdashService.PackagesList:input_type -> pkgdash.PackagesListReq + 0, // 21: pkgdash.PkgdashService.PackagesModules:input_type -> pkgdash.PackagesModulesReq + 15, // 22: pkgdash.PkgdashService.PackagesUpdate:input_type -> pkgdash.PackagesUpdateReq + 17, // 23: pkgdash.PkgdashService.CommentsCreate:input_type -> pkgdash.CommentsCreateReq + 25, // 24: pkgdash.PkgdashService.CommentsLookup:input_type -> pkgdash.CommentsLookupReq + 23, // 25: pkgdash.PkgdashService.CommentsList:input_type -> pkgdash.CommentsListReq + 9, // 26: pkgdash.PkgdashService.CommentsDelete:input_type -> pkgdash.CommentsDeleteReq + 21, // 27: pkgdash.PkgdashService.ModulesList:input_type -> pkgdash.ModulesListReq + 3, // 28: pkgdash.PkgdashService.PackagesLookup:output_type -> pkgdash.PackagesLookupRsp + 20, // 29: pkgdash.PkgdashService.PackagesCreate:output_type -> pkgdash.PackagesCreateRsp + 12, // 30: pkgdash.PkgdashService.PackagesDelete:output_type -> pkgdash.PackagesDeleteRsp + 14, // 31: pkgdash.PkgdashService.PackagesList:output_type -> pkgdash.PackagesListRsp + 1, // 32: pkgdash.PkgdashService.PackagesModules:output_type -> pkgdash.PackagesModulesRsp + 16, // 33: pkgdash.PkgdashService.PackagesUpdate:output_type -> pkgdash.PackagesUpdateRsp + 18, // 34: pkgdash.PkgdashService.CommentsCreate:output_type -> pkgdash.CommentsCreateRsp + 26, // 35: pkgdash.PkgdashService.CommentsLookup:output_type -> pkgdash.CommentsLookupRsp + 24, // 36: pkgdash.PkgdashService.CommentsList:output_type -> pkgdash.CommentsListRsp + 10, // 37: pkgdash.PkgdashService.CommentsDelete:output_type -> pkgdash.CommentsDeleteRsp + 22, // 38: pkgdash.PkgdashService.ModulesList:output_type -> pkgdash.ModulesListRsp + 28, // [28:39] is the sub-list for method output_type + 17, // [17:28] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_pkgdash_proto_init() } diff --git a/proto/pkgdash.pb.validate.go b/proto/pkgdash.pb.validate.go index 1bfe30c..25a204f 100644 --- a/proto/pkgdash.pb.validate.go +++ b/proto/pkgdash.pb.validate.go @@ -57,7 +57,7 @@ func (m *PackagesModulesReq) validate(all bool) error { var errors []error - // no validation rules for Id + // no validation rules for Package if len(errors) > 0 { return PackagesModulesReqMultiError(errors) @@ -889,34 +889,12 @@ func (m *Module) validate(all bool) error { errors = append(errors, err) } - if m.GetPackage() <= 0 { - err := ModuleValidationError{ - field: "Package", - reason: "value must be greater than 0", - } - if !all { - return err - } - errors = append(errors, err) - } - - if utf8.RuneCountInString(m.GetLastVersion()) < 1 { - err := ModuleValidationError{ - field: "LastVersion", - reason: "value length must be at least 1 runes", - } - if !all { - return err - } - errors = append(errors, err) - } - if all { - switch v := interface{}(m.GetCreated()).(type) { + switch v := interface{}(m.GetLastCheck()).(type) { case interface{ ValidateAll() error }: if err := v.ValidateAll(); err != nil { errors = append(errors, ModuleValidationError{ - field: "Created", + field: "LastCheck", reason: "embedded message failed validation", cause: err, }) @@ -924,45 +902,16 @@ func (m *Module) validate(all bool) error { case interface{ Validate() error }: if err := v.Validate(); err != nil { errors = append(errors, ModuleValidationError{ - field: "Created", + field: "LastCheck", reason: "embedded message failed validation", cause: err, }) } } - } else if v, ok := interface{}(m.GetCreated()).(interface{ Validate() error }); ok { + } else if v, ok := interface{}(m.GetLastCheck()).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { return ModuleValidationError{ - field: "Created", - reason: "embedded message failed validation", - cause: err, - } - } - } - - if all { - switch v := interface{}(m.GetUpdated()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, ModuleValidationError{ - field: "Updated", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, ModuleValidationError{ - field: "Updated", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetUpdated()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return ModuleValidationError{ - field: "Updated", + field: "LastCheck", reason: "embedded message failed validation", cause: err, } diff --git a/proto/pkgdash.proto b/proto/pkgdash.proto index 20f4776..d210e2c 100644 --- a/proto/pkgdash.proto +++ b/proto/pkgdash.proto @@ -68,7 +68,7 @@ service PkgdashService { }; }; }; - option (micro.api.http) = {get: "/v1/packages/{id}/modules"}; + option (micro.api.http) = {get: "/v1/packages/{package}/modules"}; } rpc PackagesUpdate(PackagesUpdateReq) returns (PackagesUpdateRsp) { option (micro.openapiv3.openapiv3_operation) = { @@ -94,7 +94,7 @@ service PkgdashService { }; }; option (micro.api.http) = { - post: "/v1/packages/{package_id}/comments"; + post: "/v1/packages/{package}/comments"; body: "*"; }; } @@ -109,7 +109,7 @@ service PkgdashService { }; option (micro.api.http) = { get: "/v1/comments/{id}/comments"; - additional_bindings {get: "/v1/comments/{package_id}/comments/{id}"}; + additional_bindings {get: "/v1/comments/{package}/comments/{id}"}; }; } rpc CommentsList(CommentsListReq) returns (CommentsListRsp) { @@ -121,7 +121,7 @@ service PkgdashService { }; }; }; - option (micro.api.http) = {get: "/v1/packages/{package_id}/comments"}; + option (micro.api.http) = {get: "/v1/packages/{package}/comments"}; } rpc CommentsDelete(CommentsDeleteReq) returns (CommentsDeleteRsp) { option (micro.openapiv3.openapiv3_operation) = { @@ -151,7 +151,7 @@ service PkgdashService { } message PackagesModulesReq { - uint64 id = 1 [json_name = "id"]; + uint64 package = 1 [json_name = "package"]; } message PackagesModulesRsp { @@ -189,10 +189,7 @@ message Module { uint64 id = 1 [(validate.rules).uint64.gt = 0]; string name = 2 [(validate.rules).string.min_len = 1]; string version = 3 [(validate.rules).string.min_len = 1]; - uint64 package = 4 [(validate.rules).uint64.gt = 0]; - string last_version = 5 [(validate.rules).string.min_len = 1]; - google.protobuf.Timestamp created = 6; - google.protobuf.Timestamp updated = 7; + google.protobuf.Timestamp last_check = 8; } message Issue { diff --git a/proto/pkgdash_micro_http.pb.go b/proto/pkgdash_micro_http.pb.go index ccf69a2..9ebc312 100644 --- a/proto/pkgdash_micro_http.pb.go +++ b/proto/pkgdash_micro_http.pb.go @@ -46,7 +46,7 @@ var ( }, { Name: "PkgdashService.PackagesModules", - Path: "/v1/packages/{id}/modules", + Path: "/v1/packages/{package}/modules", Method: "GET", Body: "", Stream: false, @@ -60,7 +60,7 @@ var ( }, { Name: "PkgdashService.CommentsCreate", - Path: "/v1/packages/{package_id}/comments", + Path: "/v1/packages/{package}/comments", Method: "POST", Body: "*", Stream: false, @@ -74,14 +74,14 @@ var ( }, { Name: "PkgdashService.CommentsLookup", - Path: "/v1/comments/{package_id}/comments/{id}", + Path: "/v1/comments/{package}/comments/{id}", Method: "GET", Body: "", Stream: false, }, { Name: "PkgdashService.CommentsList", - Path: "/v1/packages/{package_id}/comments", + Path: "/v1/packages/{package}/comments", Method: "GET", Body: "", Stream: false, @@ -200,7 +200,7 @@ func (c *pkgdashServiceClient) PackagesModules(ctx context.Context, req *Package ) opts = append(opts, v41.Method(http.MethodGet), - v41.Path("/v1/packages/{id}/modules"), + v41.Path("/v1/packages/{package}/modules"), ) rsp := &PackagesModulesRsp{} err := c.c.Call(ctx, c.c.NewRequest(c.name, "PkgdashService.PackagesModules", req), rsp, opts...) @@ -237,7 +237,7 @@ func (c *pkgdashServiceClient) CommentsCreate(ctx context.Context, req *Comments ) opts = append(opts, v41.Method(http.MethodPost), - v41.Path("/v1/packages/{package_id}/comments"), + v41.Path("/v1/packages/{package}/comments"), v41.Body("*"), ) rsp := &CommentsCreateRsp{} @@ -274,7 +274,7 @@ func (c *pkgdashServiceClient) CommentsList(ctx context.Context, req *CommentsLi ) opts = append(opts, v41.Method(http.MethodGet), - v41.Path("/v1/packages/{package_id}/comments"), + v41.Path("/v1/packages/{package}/comments"), ) rsp := &CommentsListRsp{} err := c.c.Call(ctx, c.c.NewRequest(c.name, "PkgdashService.CommentsList", req), rsp, opts...) diff --git a/ui/src/app/api/models/module.ts b/ui/src/app/api/models/module.ts index 0318b38..9876943 100644 --- a/ui/src/app/api/models/module.ts +++ b/ui/src/app/api/models/module.ts @@ -1,11 +1,8 @@ /* tslint:disable */ /* eslint-disable */ export interface Module { - created?: string; id?: number; - last_version?: string; + last_check?: string; name?: string; - package?: number; - updated?: string; version?: string; } diff --git a/ui/src/app/api/services/pkgdash-service.service.ts b/ui/src/app/api/services/pkgdash-service.service.ts index 4fc2855..18a6291 100644 --- a/ui/src/app/api/services/pkgdash-service.service.ts +++ b/ui/src/app/api/services/pkgdash-service.service.ts @@ -360,150 +360,6 @@ export class PkgdashServiceService extends BaseService { ); } - /** Path part for operation `packagesModules()` */ - static readonly PackagesModulesPath = '/v1/packages/{id}/modules'; - - /** - * This method provides access to the full `HttpResponse`, allowing access to response headers. - * To access only the response body, use `packagesModules()` instead. - * - * This method doesn't expect any request body. - */ - packagesModules$Response( - params: { - id: number; - }, - context?: HttpContext - ): Observable> { - const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.PackagesModulesPath, 'get'); - if (params) { - rb.path('id', params.id, {}); - } - - return this.http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }) - ); - } - - /** - * This method provides access only to the response body. - * To access the full response (for headers, for example), `packagesModules$Response()` instead. - * - * This method doesn't expect any request body. - */ - packagesModules( - params: { - id: number; - }, - context?: HttpContext - ): Observable { - return this.packagesModules$Response(params, context).pipe( - map((r: StrictHttpResponse): PackagesModulesRsp => r.body) - ); - } - - /** Path part for operation `commentsList()` */ - static readonly CommentsListPath = '/v1/packages/{package_id}/comments'; - - /** - * This method provides access to the full `HttpResponse`, allowing access to response headers. - * To access only the response body, use `commentsList()` instead. - * - * This method doesn't expect any request body. - */ - commentsList$Response( - params: { - package_id: number; - }, - context?: HttpContext - ): Observable> { - const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.CommentsListPath, 'get'); - if (params) { - rb.path('package_id', params.package_id, {}); - } - - return this.http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }) - ); - } - - /** - * This method provides access only to the response body. - * To access the full response (for headers, for example), `commentsList$Response()` instead. - * - * This method doesn't expect any request body. - */ - commentsList( - params: { - package_id: number; - }, - context?: HttpContext - ): Observable { - return this.commentsList$Response(params, context).pipe( - map((r: StrictHttpResponse): CommentsListRsp => r.body) - ); - } - - /** Path part for operation `commentsCreate()` */ - static readonly CommentsCreatePath = '/v1/packages/{package_id}/comments'; - - /** - * This method provides access to the full `HttpResponse`, allowing access to response headers. - * To access only the response body, use `commentsCreate()` instead. - * - * This method sends `application/json` and handles request body of type `application/json`. - */ - commentsCreate$Response( - params: { - package_id: number; - body: CommentsCreateReq - }, - context?: HttpContext - ): Observable> { - const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.CommentsCreatePath, 'post'); - if (params) { - rb.path('package_id', params.package_id, {}); - rb.body(params.body, 'application/json'); - } - - return this.http.request( - rb.build({ responseType: 'json', accept: 'application/json', context }) - ).pipe( - filter((r: any): r is HttpResponse => r instanceof HttpResponse), - map((r: HttpResponse) => { - return r as StrictHttpResponse; - }) - ); - } - - /** - * This method provides access only to the response body. - * To access the full response (for headers, for example), `commentsCreate$Response()` instead. - * - * This method sends `application/json` and handles request body of type `application/json`. - */ - commentsCreate( - params: { - package_id: number; - body: CommentsCreateReq - }, - context?: HttpContext - ): Observable { - return this.commentsCreate$Response(params, context).pipe( - map((r: StrictHttpResponse): CommentsCreateRsp => r.body) - ); - } - /** Path part for operation `commentsDelete()` */ static readonly CommentsDeletePath = '/v1/packages/{package_id}/comments/{id}'; @@ -554,4 +410,151 @@ export class PkgdashServiceService extends BaseService { ); } + /** Path part for operation `commentsList()` */ + static readonly CommentsListPath = '/v1/packages/{package}/comments'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `commentsList()` instead. + * + * This method doesn't expect any request body. + */ + commentsList$Response( + params: { + package: string; + package_id?: number; + }, + context?: HttpContext + ): Observable> { + const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.CommentsListPath, 'get'); + if (params) { + rb.path('package', params.package, {}); + rb.query('package_id', params.package_id, {}); + } + + return this.http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access only to the response body. + * To access the full response (for headers, for example), `commentsList$Response()` instead. + * + * This method doesn't expect any request body. + */ + commentsList( + params: { + package: string; + package_id?: number; + }, + context?: HttpContext + ): Observable { + return this.commentsList$Response(params, context).pipe( + map((r: StrictHttpResponse): CommentsListRsp => r.body) + ); + } + + /** Path part for operation `commentsCreate()` */ + static readonly CommentsCreatePath = '/v1/packages/{package}/comments'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `commentsCreate()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + commentsCreate$Response( + params: { + package: string; + body: CommentsCreateReq + }, + context?: HttpContext + ): Observable> { + const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.CommentsCreatePath, 'post'); + if (params) { + rb.path('package', params.package, {}); + rb.body(params.body, 'application/json'); + } + + return this.http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access only to the response body. + * To access the full response (for headers, for example), `commentsCreate$Response()` instead. + * + * This method sends `application/json` and handles request body of type `application/json`. + */ + commentsCreate( + params: { + package: string; + body: CommentsCreateReq + }, + context?: HttpContext + ): Observable { + return this.commentsCreate$Response(params, context).pipe( + map((r: StrictHttpResponse): CommentsCreateRsp => r.body) + ); + } + + /** Path part for operation `packagesModules()` */ + static readonly PackagesModulesPath = '/v1/packages/{package}/modules'; + + /** + * This method provides access to the full `HttpResponse`, allowing access to response headers. + * To access only the response body, use `packagesModules()` instead. + * + * This method doesn't expect any request body. + */ + packagesModules$Response( + params: { + package: number; + }, + context?: HttpContext + ): Observable> { + const rb = new RequestBuilder(this.rootUrl, PkgdashServiceService.PackagesModulesPath, 'get'); + if (params) { + rb.path('package', params.package, {}); + } + + return this.http.request( + rb.build({ responseType: 'json', accept: 'application/json', context }) + ).pipe( + filter((r: any): r is HttpResponse => r instanceof HttpResponse), + map((r: HttpResponse) => { + return r as StrictHttpResponse; + }) + ); + } + + /** + * This method provides access only to the response body. + * To access the full response (for headers, for example), `packagesModules$Response()` instead. + * + * This method doesn't expect any request body. + */ + packagesModules( + params: { + package: number; + }, + context?: HttpContext + ): Observable { + return this.packagesModules$Response(params, context).pipe( + map((r: StrictHttpResponse): PackagesModulesRsp => r.body) + ); + } + }