From 8fe6874b1bbaa5e5b4ad4c114570d0cb6c0cd45b Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 13 Mar 2024 21:24:16 +0800 Subject: [PATCH 001/101] chore: add description field to user --- server/profile/profile.go | 2 -- store/db/mysql/migration/dev/LATEST__SCHEMA.sql | 3 ++- store/db/mysql/user.go | 6 +++++- .../db/postgres/migration/dev/LATEST__SCHEMA.sql | 3 ++- store/db/postgres/user.go | 15 ++++++++++----- store/db/sqlite/migration/dev/LATEST__SCHEMA.sql | 3 ++- store/db/sqlite/user.go | 11 +++++++++-- store/user.go | 2 ++ test/store/user_test.go | 9 +++++---- 9 files changed, 37 insertions(+), 17 deletions(-) diff --git a/server/profile/profile.go b/server/profile/profile.go index bd22193f8b7a2..74cde1eb5a10d 100644 --- a/server/profile/profile.go +++ b/server/profile/profile.go @@ -51,11 +51,9 @@ func checkDataDir(dataDir string) (string, error) { // Trim trailing \ or / in case user supplies dataDir = strings.TrimRight(dataDir, "\\/") - if _, err := os.Stat(dataDir); err != nil { return "", errors.Wrapf(err, "unable to access data folder %s", dataDir) } - return dataDir, nil } diff --git a/store/db/mysql/migration/dev/LATEST__SCHEMA.sql b/store/db/mysql/migration/dev/LATEST__SCHEMA.sql index f69bbe308b8a7..770fc5560a7cd 100644 --- a/store/db/mysql/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/mysql/migration/dev/LATEST__SCHEMA.sql @@ -22,7 +22,8 @@ CREATE TABLE `user` ( `email` VARCHAR(256) NOT NULL DEFAULT '', `nickname` VARCHAR(256) NOT NULL DEFAULT '', `password_hash` VARCHAR(256) NOT NULL, - `avatar_url` LONGTEXT NOT NULL + `avatar_url` LONGTEXT NOT NULL, + `description` VARCHAR(256) NOT NULL DEFAULT '' ); -- user_setting diff --git a/store/db/mysql/user.go b/store/db/mysql/user.go index 1926213548bcc..764f742755904 100644 --- a/store/db/mysql/user.go +++ b/store/db/mysql/user.go @@ -60,6 +60,9 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { set, args = append(set, "`password_hash` = ?"), append(args, *v) } + if v := update.Description; v != nil { + set, args = append(set, "`description` = ?"), append(args, *v) + } args = append(args, update.ID) query := "UPDATE `user` SET " + strings.Join(set, ", ") + " WHERE `id` = ?" @@ -93,7 +96,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User where, args = append(where, "`nickname` = ?"), append(args, *v) } - query := "SELECT `id`, `username`, `role`, `email`, `nickname`, `password_hash`, `avatar_url`, UNIX_TIMESTAMP(`created_ts`), UNIX_TIMESTAMP(`updated_ts`), `row_status` FROM `user` WHERE " + strings.Join(where, " AND ") + " ORDER BY `created_ts` DESC, `row_status` DESC" + query := "SELECT `id`, `username`, `role`, `email`, `nickname`, `password_hash`, `avatar_url`, `description`, UNIX_TIMESTAMP(`created_ts`), UNIX_TIMESTAMP(`updated_ts`), `row_status` FROM `user` WHERE " + strings.Join(where, " AND ") + " ORDER BY `created_ts` DESC, `row_status` DESC" rows, err := d.db.QueryContext(ctx, query, args...) if err != nil { return nil, err @@ -111,6 +114,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, diff --git a/store/db/postgres/migration/dev/LATEST__SCHEMA.sql b/store/db/postgres/migration/dev/LATEST__SCHEMA.sql index 1ab5f95e4458a..3d611c2b77044 100644 --- a/store/db/postgres/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/postgres/migration/dev/LATEST__SCHEMA.sql @@ -22,7 +22,8 @@ CREATE TABLE "user" ( email TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '', password_hash TEXT NOT NULL, - avatar_url TEXT NOT NULL + avatar_url TEXT NOT NULL, + description TEXT NOT NULL DEFAULT '' ); -- user_setting diff --git a/store/db/postgres/user.go b/store/db/postgres/user.go index 588bbac376630..81602558ff31f 100644 --- a/store/db/postgres/user.go +++ b/store/db/postgres/user.go @@ -10,10 +10,11 @@ import ( func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, error) { fields := []string{"username", "role", "email", "nickname", "password_hash", "avatar_url"} args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash, create.AvatarURL} - stmt := "INSERT INTO \"user\" (" + strings.Join(fields, ", ") + ") VALUES (" + placeholders(len(args)) + ") RETURNING id, avatar_url, created_ts, updated_ts, row_status" + stmt := "INSERT INTO \"user\" (" + strings.Join(fields, ", ") + ") VALUES (" + placeholders(len(args)) + ") RETURNING id, avatar_url, description, created_ts, updated_ts, row_status" if err := d.db.QueryRowContext(ctx, stmt, args...).Scan( &create.ID, &create.AvatarURL, + &create.Description, &create.CreatedTs, &create.UpdatedTs, &create.RowStatus, @@ -47,12 +48,15 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { set, args = append(set, "password_hash = "+placeholder(len(args)+1)), append(args, *v) } + if v := update.Description; v != nil { + set, args = append(set, "description = "+placeholder(len(args)+1)), append(args, *v) + } query := ` UPDATE "user" SET ` + strings.Join(set, ", ") + ` WHERE id = ` + placeholder(len(args)+1) + ` - RETURNING id, username, role, email, nickname, password_hash, avatar_url, created_ts, updated_ts, row_status + RETURNING id, username, role, email, nickname, password_hash, avatar_url, description, created_ts, updated_ts, row_status ` args = append(args, update.ID) user := &store.User{} @@ -64,6 +68,7 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, @@ -102,6 +107,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User nickname, password_hash, avatar_url, + description, created_ts, updated_ts, row_status @@ -126,6 +132,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, @@ -143,9 +150,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User } func (d *DB) DeleteUser(ctx context.Context, delete *store.DeleteUser) error { - result, err := d.db.ExecContext(ctx, ` - DELETE FROM "user" WHERE id = $1 - `, delete.ID) + result, err := d.db.ExecContext(ctx, `DELETE FROM "user" WHERE id = $1`, delete.ID) if err != nil { return err } diff --git a/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql b/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql index b2408ddccc78e..f1114df7ddb63 100644 --- a/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql +++ b/store/db/sqlite/migration/dev/LATEST__SCHEMA.sql @@ -23,7 +23,8 @@ CREATE TABLE user ( email TEXT NOT NULL DEFAULT '', nickname TEXT NOT NULL DEFAULT '', password_hash TEXT NOT NULL, - avatar_url TEXT NOT NULL DEFAULT '' + avatar_url TEXT NOT NULL DEFAULT '', + description TEXT NOT NULL DEFAULT '' ); CREATE INDEX idx_user_username ON user (username); diff --git a/store/db/sqlite/user.go b/store/db/sqlite/user.go index 216d1170c0821..b3f177f5674cc 100644 --- a/store/db/sqlite/user.go +++ b/store/db/sqlite/user.go @@ -11,10 +11,11 @@ func (d *DB) CreateUser(ctx context.Context, create *store.User) (*store.User, e fields := []string{"`username`", "`role`", "`email`", "`nickname`", "`password_hash`"} placeholder := []string{"?", "?", "?", "?", "?"} args := []any{create.Username, create.Role, create.Email, create.Nickname, create.PasswordHash} - stmt := "INSERT INTO user (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING id, avatar_url, created_ts, updated_ts, row_status" + stmt := "INSERT INTO user (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING id, avatar_url, description, created_ts, updated_ts, row_status" if err := d.db.QueryRowContext(ctx, stmt, args...).Scan( &create.ID, &create.AvatarURL, + &create.Description, &create.CreatedTs, &create.UpdatedTs, &create.RowStatus, @@ -48,13 +49,16 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U if v := update.PasswordHash; v != nil { set, args = append(set, "password_hash = ?"), append(args, *v) } + if v := update.Description; v != nil { + set, args = append(set, "description = ?"), append(args, *v) + } args = append(args, update.ID) query := ` UPDATE user SET ` + strings.Join(set, ", ") + ` WHERE id = ? - RETURNING id, username, role, email, nickname, password_hash, avatar_url, created_ts, updated_ts, row_status + RETURNING id, username, role, email, nickname, password_hash, avatar_url, description, created_ts, updated_ts, row_status ` user := &store.User{} if err := d.db.QueryRowContext(ctx, query, args...).Scan( @@ -65,6 +69,7 @@ func (d *DB) UpdateUser(ctx context.Context, update *store.UpdateUser) (*store.U &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, @@ -103,6 +108,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User nickname, password_hash, avatar_url, + description, created_ts, updated_ts, row_status @@ -127,6 +133,7 @@ func (d *DB) ListUsers(ctx context.Context, find *store.FindUser) ([]*store.User &user.Nickname, &user.PasswordHash, &user.AvatarURL, + &user.Description, &user.CreatedTs, &user.UpdatedTs, &user.RowStatus, diff --git a/store/user.go b/store/user.go index 4dcda4f6540ac..cec1c48ac3f4c 100644 --- a/store/user.go +++ b/store/user.go @@ -57,6 +57,7 @@ type User struct { Nickname string PasswordHash string AvatarURL string + Description string } type UpdateUser struct { @@ -71,6 +72,7 @@ type UpdateUser struct { Password *string AvatarURL *string PasswordHash *string + Description *string } type FindUser struct { diff --git a/test/store/user_test.go b/test/store/user_test.go index dde7d156dd445..14131b4aecbdd 100644 --- a/test/store/user_test.go +++ b/test/store/user_test.go @@ -40,10 +40,11 @@ func TestUserStore(t *testing.T) { func createTestingHostUser(ctx context.Context, ts *store.Store) (*store.User, error) { userCreate := &store.User{ - Username: "test", - Role: store.RoleHost, - Email: "test@test.com", - Nickname: "test_nickname", + Username: "test", + Role: store.RoleHost, + Email: "test@test.com", + Nickname: "test_nickname", + Description: "test_description", } passwordHash, err := bcrypt.GenerateFromPassword([]byte("test_password"), bcrypt.DefaultCost) if err != nil { From e795149186ac7c4237900f6224e7be4e691df62d Mon Sep 17 00:00:00 2001 From: Steven Date: Wed, 13 Mar 2024 22:30:59 +0800 Subject: [PATCH 002/101] chore: tweak memo view display --- proto/api/v2/user_service.proto | 10 +- proto/gen/api/v2/README.md | 1 + proto/gen/api/v2/user_service.pb.go | 488 +++++++++--------- server/route/api/v2/apidocs.swagger.yaml | 4 + server/route/api/v2/user_service.go | 23 +- store/db/sqlite/seed/10001__user.sql | 18 +- web/public/full-logo.webp | Bin 0 -> 25152 bytes web/src/components/MemoActionMenu.tsx | 14 +- web/src/components/MemoView.tsx | 64 +-- .../components/Settings/MyAccountSection.tsx | 13 +- web/src/components/UpdateAccountDialog.tsx | 26 +- web/src/components/UserAvatar.tsx | 6 +- web/src/locales/en.json | 3 +- web/src/pages/Explore.tsx | 2 +- web/src/pages/MemoDetail.tsx | 161 +----- 15 files changed, 378 insertions(+), 455 deletions(-) create mode 100644 web/public/full-logo.webp diff --git a/proto/api/v2/user_service.proto b/proto/api/v2/user_service.proto index e5372a2101cea..a8f7118872807 100644 --- a/proto/api/v2/user_service.proto +++ b/proto/api/v2/user_service.proto @@ -98,13 +98,15 @@ message User { string avatar_url = 7; - string password = 8 [(google.api.field_behavior) = INPUT_ONLY]; + string description = 8; - RowStatus row_status = 9; + string password = 9 [(google.api.field_behavior) = INPUT_ONLY]; - google.protobuf.Timestamp create_time = 10; + RowStatus row_status = 10; - google.protobuf.Timestamp update_time = 11; + google.protobuf.Timestamp create_time = 11; + + google.protobuf.Timestamp update_time = 12; } message ListUsersRequest {} diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index ae9bb542aa7eb..dbbcc9478a88a 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -684,6 +684,7 @@ Used internally for obfuscating the page token. | email | [string](#string) | | | | nickname | [string](#string) | | | | avatar_url | [string](#string) | | | +| description | [string](#string) | | | | password | [string](#string) | | | | row_status | [RowStatus](#memos-api-v2-RowStatus) | | | | create_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | diff --git a/proto/gen/api/v2/user_service.pb.go b/proto/gen/api/v2/user_service.pb.go index 58e60e8556767..d4280521cb33d 100644 --- a/proto/gen/api/v2/user_service.pb.go +++ b/proto/gen/api/v2/user_service.pb.go @@ -82,17 +82,18 @@ type User struct { // The name of the user. // Format: users/{username} - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` - Role User_Role `protobuf:"varint,3,opt,name=role,proto3,enum=memos.api.v2.User_Role" json:"role,omitempty"` - Username string `protobuf:"bytes,4,opt,name=username,proto3" json:"username,omitempty"` - Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` - Nickname string `protobuf:"bytes,6,opt,name=nickname,proto3" json:"nickname,omitempty"` - AvatarUrl string `protobuf:"bytes,7,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` - Password string `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"` - RowStatus RowStatus `protobuf:"varint,9,opt,name=row_status,json=rowStatus,proto3,enum=memos.api.v2.RowStatus" json:"row_status,omitempty"` - CreateTime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - UpdateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + Role User_Role `protobuf:"varint,3,opt,name=role,proto3,enum=memos.api.v2.User_Role" json:"role,omitempty"` + Username string `protobuf:"bytes,4,opt,name=username,proto3" json:"username,omitempty"` + Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` + Nickname string `protobuf:"bytes,6,opt,name=nickname,proto3" json:"nickname,omitempty"` + AvatarUrl string `protobuf:"bytes,7,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` + Description string `protobuf:"bytes,8,opt,name=description,proto3" json:"description,omitempty"` + Password string `protobuf:"bytes,9,opt,name=password,proto3" json:"password,omitempty"` + RowStatus RowStatus `protobuf:"varint,10,opt,name=row_status,json=rowStatus,proto3,enum=memos.api.v2.RowStatus" json:"row_status,omitempty"` + CreateTime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + UpdateTime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` } func (x *User) Reset() { @@ -176,6 +177,13 @@ func (x *User) GetAvatarUrl() string { return "" } +func (x *User) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + func (x *User) GetPassword() string { if x != nil { return x.Password @@ -1342,7 +1350,7 @@ var file_api_v2_user_service_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x03, 0x0a, 0x04, 0x55, 0x73, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf6, 0x03, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, @@ -1355,240 +1363,242 @@ var file_api_v2_user_service_proto_rawDesc = []byte{ 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, - 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, - 0x72, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 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, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 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, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x52, - 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x53, 0x45, 0x52, 0x10, 0x03, - 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x3b, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x04, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x09, 0x72, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 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, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 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, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, + 0x10, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x53, 0x45, 0x52, + 0x10, 0x03, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3b, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x22, 0x3c, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x3c, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x7d, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x3c, - 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x27, 0x0a, 0x11, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xac, 0x01, 0x0a, 0x0b, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x65, 0x61, - 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, - 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x6c, 0x65, - 0x67, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x72, 0x22, 0x7d, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, + 0x22, 0x3c, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x27, + 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xac, 0x01, + 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, + 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, + 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x65, 0x6d, + 0x6f, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x6d, 0x6f, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, + 0x6c, 0x65, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x4d, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, - 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x50, 0x0a, 0x19, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xca, 0x01, 0x0a, - 0x0f, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 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, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 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, 0x09, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x31, 0x0a, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x62, 0x0a, 0x1c, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0d, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x22, 0xa3, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x48, 0x00, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x22, 0x61, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x1c, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x1f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x32, 0xb5, 0x0b, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1e, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, - 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, - 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x73, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xda, 0x41, 0x04, 0x75, 0x73, 0x65, 0x72, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0d, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x0a, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0xda, 0x41, - 0x10, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, - 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, 0x1b, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6e, 0x61, 0x6d, - 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x76, 0x0a, 0x0a, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0xda, 0x41, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, - 0x2a, 0x7d, 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x2d, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, - 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0xb3, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, + 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0x91, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0xda, 0x41, 0x13, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0x26, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, - 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x29, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0xda, - 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, - 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xc1, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x50, 0x0a, 0x19, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xca, + 0x01, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x69, 0x73, 0x73, 0x75, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x08, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 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, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0x31, 0x0a, 0x1b, 0x4c, + 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x62, + 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x48, 0x00, 0x52, 0x09, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x22, 0x61, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x65, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x1f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0xb5, 0x0b, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x6d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x25, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, + 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x73, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0xda, 0x41, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0d, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x8d, 0x01, 0x0a, + 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, + 0xda, 0x41, 0x10, 0x75, 0x73, 0x65, 0x72, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, + 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, + 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x76, 0x0a, 0x0a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0xda, 0x41, 0x11, 0x6e, 0x61, 0x6d, - 0x65, 0x2c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x35, 0x2a, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, - 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x7d, 0x42, 0xa8, 0x01, 0x0a, 0x10, 0x63, 0x6f, - 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x42, 0x10, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, - 0x73, 0x65, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x3b, 0x61, - 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, - 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, - 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x70, 0x69, - 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0xda, + 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x8a, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2d, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x20, 0x12, 0x1e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x12, 0xb3, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0xda, 0x41, 0x13, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x07, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, + 0x26, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x12, 0x29, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x12, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xa8, 0x01, 0x0a, + 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x36, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, + 0x2a, 0x22, 0x24, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0xc1, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0xda, 0x41, 0x11, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x2a, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, + 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x7d, 0x42, 0xa8, 0x01, 0x0a, 0x10, + 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x75, 0x73, 0x65, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, + 0x3b, 0x61, 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x4d, 0x65, + 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, + 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, + 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/server/route/api/v2/apidocs.swagger.yaml b/server/route/api/v2/apidocs.swagger.yaml index a495910fa64bd..065e96f97f303 100644 --- a/server/route/api/v2/apidocs.swagger.yaml +++ b/server/route/api/v2/apidocs.swagger.yaml @@ -1500,6 +1500,8 @@ paths: type: string avatarUrl: type: string + description: + type: string password: type: string rowStatus: @@ -2223,6 +2225,8 @@ definitions: type: string avatarUrl: type: string + description: + type: string password: type: string rowStatus: diff --git a/server/route/api/v2/user_service.go b/server/route/api/v2/user_service.go index f9bc6a565107c..dad9acd7a6c3d 100644 --- a/server/route/api/v2/user_service.go +++ b/server/route/api/v2/user_service.go @@ -151,6 +151,8 @@ func (s *APIV2Service) UpdateUser(ctx context.Context, request *apiv2pb.UpdateUs update.Email = &request.User.Email } else if field == "avatar_url" { update.AvatarURL = &request.User.AvatarUrl + } else if field == "description" { + update.Description = &request.User.Description } else if field == "role" { role := convertUserRoleToStore(request.User.Role) update.Role = &role @@ -499,16 +501,17 @@ func (s *APIV2Service) UpsertAccessTokenToStore(ctx context.Context, user *store func convertUserFromStore(user *store.User) *apiv2pb.User { return &apiv2pb.User{ - Name: fmt.Sprintf("%s%s", UserNamePrefix, user.Username), - Id: user.ID, - RowStatus: convertRowStatusFromStore(user.RowStatus), - CreateTime: timestamppb.New(time.Unix(user.CreatedTs, 0)), - UpdateTime: timestamppb.New(time.Unix(user.UpdatedTs, 0)), - Role: convertUserRoleFromStore(user.Role), - Username: user.Username, - Email: user.Email, - Nickname: user.Nickname, - AvatarUrl: user.AvatarURL, + Name: fmt.Sprintf("%s%s", UserNamePrefix, user.Username), + Id: user.ID, + RowStatus: convertRowStatusFromStore(user.RowStatus), + CreateTime: timestamppb.New(time.Unix(user.CreatedTs, 0)), + UpdateTime: timestamppb.New(time.Unix(user.UpdatedTs, 0)), + Role: convertUserRoleFromStore(user.Role), + Username: user.Username, + Email: user.Email, + Nickname: user.Nickname, + AvatarUrl: user.AvatarURL, + Description: user.Description, } } diff --git a/store/db/sqlite/seed/10001__user.sql b/store/db/sqlite/seed/10001__user.sql index 45e88716b3059..4f1644c729bf5 100644 --- a/store/db/sqlite/seed/10001__user.sql +++ b/store/db/sqlite/seed/10001__user.sql @@ -5,7 +5,8 @@ INSERT INTO `role`, `email`, `nickname`, - `password_hash` + `password_hash`, + `description` ) VALUES ( @@ -15,7 +16,8 @@ VALUES 'demo@usememos.com', 'Derobot', -- raw password: secret - '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK' + '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK', + '👋 Welcome to memos.' ); INSERT INTO @@ -25,7 +27,8 @@ INSERT INTO `role`, `email`, `nickname`, - `password_hash` + `password_hash`, + `description` ) VALUES ( @@ -35,7 +38,8 @@ VALUES 'jack@usememos.com', 'Jack', -- raw password: secret - '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK' + '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK', + 'The REAL Jack.' ); INSERT INTO @@ -46,7 +50,8 @@ INSERT INTO `role`, `email`, `nickname`, - `password_hash` + `password_hash`, + `description` ) VALUES ( @@ -57,5 +62,6 @@ VALUES 'bob@usememos.com', 'Bob', -- raw password: secret - '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK' + '$2a$14$ajq8Q7fbtFRQvXpdCq7Jcuy.Rx1h/L4J60Otx.gyNLbAYctGMJ9tK', + 'Sorry, I am busy right now.' ); \ No newline at end of file diff --git a/web/public/full-logo.webp b/web/public/full-logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..f654aae8acb9438aa69440ac323c0b3ba0f42e71 GIT binary patch literal 25152 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 { }); }; - const handleCopyMemoId = () => { - copy(memo.name); - toast.success("Copied to clipboard!"); - }; - return ( @@ -127,12 +121,6 @@ const MemoActionMenu = (props: Props) => { {t("common.delete")} - -
-
- ID: {memo.name} -
-
); diff --git a/web/src/components/MemoView.tsx b/web/src/components/MemoView.tsx index fc61df269b16b..8187c8f7c0217 100644 --- a/web/src/components/MemoView.tsx +++ b/web/src/components/MemoView.tsx @@ -25,7 +25,6 @@ import VisibilityIcon from "./VisibilityIcon"; interface Props { memo: Memo; - showCreator?: boolean; showVisibility?: boolean; showPinned?: boolean; className?: string; @@ -92,43 +91,40 @@ const MemoView: React.FC = (props: Props) => { return (
-
-
- {props.showCreator && creator && ( - <> - - - - - - {creator.nickname || creator.username} - - - +
+
+ {creator && ( +
+ + - - - )} - - {displayTime} - - {props.showPinned && memo.pinned && ( - <> - - - - - +
+ + + {creator.nickname || creator.username} + + + {creator.description} +
+
)}
-
+
{props.showVisibility && memo.visibility !== Visibility.PRIVATE && ( @@ -150,6 +146,11 @@ const MemoView: React.FC = (props: Props) => { {commentAmount > 0 && {commentAmount}} + {props.showPinned && memo.pinned && ( + + + + )} {!readonly && }
@@ -162,6 +163,11 @@ const MemoView: React.FC = (props: Props) => { compact={true} /> +
+ + {displayTime} + +
diff --git a/web/src/components/Settings/MyAccountSection.tsx b/web/src/components/Settings/MyAccountSection.tsx index 5dc4efafc4835..d06a651a7d661 100644 --- a/web/src/components/Settings/MyAccountSection.tsx +++ b/web/src/components/Settings/MyAccountSection.tsx @@ -22,11 +22,14 @@ const MyAccountSection = () => { return (

{t("setting.account-section.title")}

-
- -
- {user.nickname} - ({user.username}) +
+ +
+

+ {user.nickname} + ({user.username}) +

+

{user.description}

diff --git a/web/src/components/UpdateAccountDialog.tsx b/web/src/components/UpdateAccountDialog.tsx index 5101fbc5b0aea..1943f225501e1 100644 --- a/web/src/components/UpdateAccountDialog.tsx +++ b/web/src/components/UpdateAccountDialog.tsx @@ -1,4 +1,4 @@ -import { Button, IconButton, Input } from "@mui/joy"; +import { Button, IconButton, Input, Textarea } from "@mui/joy"; import { isEqual } from "lodash-es"; import { useState } from "react"; import { toast } from "react-hot-toast"; @@ -18,6 +18,7 @@ interface State { username: string; nickname: string; email: string; + description: string; } const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { @@ -29,6 +30,7 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { username: currentUser.name.replace(UserNamePrefix, ""), nickname: currentUser.nickname, email: currentUser.email, + description: currentUser.description, }); const handleCloseBtnClick = () => { @@ -85,6 +87,15 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { }); }; + const handleDescriptionChanged = (e: React.ChangeEvent) => { + setState((state) => { + return { + ...state, + description: e.target.value as string, + }; + }); + }; + const handleSaveBtnClick = async () => { if (state.username === "") { toast.error(t("message.fill-all")); @@ -105,6 +116,9 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { if (!isEqual(currentUser.avatarUrl, state.avatarUrl)) { updateMask.push("avatar_url"); } + if (!isEqual(currentUser.description, state.description)) { + updateMask.push("description"); + } await userStore.updateUser( UserPb.fromPartial({ name: currentUser.name, @@ -112,6 +126,7 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { nickname: state.nickname, email: state.email, avatarUrl: state.avatarUrl, + description: state.description, }), updateMask, ); @@ -164,6 +179,15 @@ const UpdateAccountDialog: React.FC = ({ destroy }: Props) => { ({t("setting.account-section.email-note")})

+

{t("common.description")}

+