From 155c5baf2c7da865f75c337eaacf64fd9170a9f9 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 29 Apr 2024 08:00:37 +0800 Subject: [PATCH] refactor: add markdown service --- bin/memos/main.go | 2 +- docs/apidocs.swagger.yaml | 411 +- plugin/http-getter/html_meta.go | 2 +- proto/api/v1/link_service.proto | 28 - proto/api/v1/markdown_service.proto | 259 ++ proto/api/v1/memo_service.proto | 17 +- proto/gen/api/v1/link_service.pb.go | 315 -- proto/gen/api/v1/link_service.pb.gw.go | 173 - proto/gen/api/v1/link_service_grpc.pb.go | 111 - proto/gen/api/v1/markdown_service.pb.go | 3430 +++++++++++++++++ proto/gen/api/v1/markdown_service.pb.gw.go | 327 ++ proto/gen/api/v1/markdown_service_grpc.pb.go | 189 + proto/gen/api/v1/memo_service.pb.go | 816 ++-- proto/gen/store/workspace_setting.pb.go | 214 +- proto/store/workspace_setting.proto | 3 +- server/route/api/v1/link_service.go | 23 - server/route/api/v1/markdown_service.go | 235 ++ server/route/api/v1/memo_service.go | 8 + server/route/api/v1/v1.go | 6 +- server/server.go | 10 +- web/src/assets/gomark.wasm | Bin 345253 -> 0 bytes web/src/assets/wasm_exec.js | 586 --- web/src/components/MemoContent/Blockquote.tsx | 2 +- web/src/components/MemoContent/Bold.tsx | 2 +- .../EmbeddedContent/EmbeddedMemo.tsx | 9 +- web/src/components/MemoContent/Heading.tsx | 2 +- web/src/components/MemoContent/Link.tsx | 6 +- .../components/MemoContent/OrderedList.tsx | 2 +- web/src/components/MemoContent/Paragraph.tsx | 2 +- web/src/components/MemoContent/Renderer.tsx | 59 +- web/src/components/MemoContent/Table.tsx | 2 +- web/src/components/MemoContent/TaskList.tsx | 11 +- .../components/MemoContent/UnorderedList.tsx | 2 +- web/src/components/MemoContent/index.tsx | 7 +- .../components/MemoContent/types/context.ts | 2 +- .../components/MemoEditor/Editor/index.tsx | 18 +- web/src/components/MemoEditor/index.tsx | 2 +- web/src/components/MemoView.tsx | 2 +- web/src/components/PreviewMarkdownDialog.tsx | 18 +- web/src/components/ShareMemoDialog.tsx | 2 +- web/src/grpcweb.ts | 4 +- web/src/main.tsx | 6 - web/src/pages/Archived.tsx | 2 +- web/src/types/global.d.ts | 21 - web/src/types/node.ts | 202 - web/src/utils/tag.ts | 13 +- 46 files changed, 5479 insertions(+), 2084 deletions(-) delete mode 100644 proto/api/v1/link_service.proto create mode 100644 proto/api/v1/markdown_service.proto delete mode 100644 proto/gen/api/v1/link_service.pb.go delete mode 100644 proto/gen/api/v1/link_service.pb.gw.go delete mode 100644 proto/gen/api/v1/link_service_grpc.pb.go create mode 100644 proto/gen/api/v1/markdown_service.pb.go create mode 100644 proto/gen/api/v1/markdown_service.pb.gw.go create mode 100644 proto/gen/api/v1/markdown_service_grpc.pb.go delete mode 100644 server/route/api/v1/link_service.go create mode 100644 server/route/api/v1/markdown_service.go delete mode 100755 web/src/assets/gomark.wasm delete mode 100644 web/src/assets/wasm_exec.js delete mode 100644 web/src/types/global.d.ts delete mode 100644 web/src/types/node.ts diff --git a/bin/memos/main.go b/bin/memos/main.go index 0feec6b04..b5ad0c7f3 100644 --- a/bin/memos/main.go +++ b/bin/memos/main.go @@ -160,7 +160,7 @@ func initConfig() { var err error instanceProfile, err = profile.GetProfile() if err != nil { - fmt.Printf("failed to get profile, error: %+v\n", err) + slog.Error("failed to get profile", err) return } diff --git a/docs/apidocs.swagger.yaml b/docs/apidocs.swagger.yaml index c5ceb3351..9cd3ae31d 100644 --- a/docs/apidocs.swagger.yaml +++ b/docs/apidocs.swagger.yaml @@ -8,7 +8,7 @@ tags: - name: AuthService - name: IdentityProviderService - name: InboxService - - name: LinkService + - name: MarkdownService - name: ResourceService - name: MemoService - name: TagService @@ -219,15 +219,15 @@ paths: type: string tags: - InboxService - /api/v1/linkMetadata: + /api/v1/markdown/link:metadata: get: summary: GetLinkMetadata returns metadata for a given link. - operationId: LinkService_GetLinkMetadata + operationId: MarkdownService_GetLinkMetadata responses: "200": description: A successful response. schema: - $ref: '#/definitions/v1GetLinkMetadataResponse' + $ref: '#/definitions/v1LinkMetadata' default: description: An unexpected error response. schema: @@ -238,7 +238,49 @@ paths: required: false type: string tags: - - LinkService + - MarkdownService + /api/v1/markdown/parse: + post: + summary: Parses the given markdown content and returns a list of nodes. + operationId: MarkdownService_ParseMarkdown + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1ParseMarkdownResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' + parameters: + - name: body + in: body + required: true + schema: + $ref: '#/definitions/v1ParseMarkdownRequest' + tags: + - MarkdownService + /api/v1/markdown:restore: + post: + summary: Restores the given nodes to markdown content. + operationId: MarkdownService_RestoreMarkdown + responses: + "200": + description: A successful response. + schema: + $ref: '#/definitions/v1RestoreMarkdownResponse' + default: + description: An unexpected error response. + schema: + $ref: '#/definitions/googlerpcStatus' + parameters: + - name: body + in: body + required: true + schema: + $ref: '#/definitions/v1RestoreMarkdownRequest' + tags: + - MarkdownService /api/v1/memos: get: summary: ListMemos lists memos with pagination and filter. @@ -994,6 +1036,12 @@ paths: format: date-time content: type: string + nodes: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + readOnly: true visibility: $ref: '#/definitions/v1Visibility' pinned: @@ -1729,6 +1777,13 @@ definitions: properties: reaction: $ref: '#/definitions/v1Reaction' + TableNodeRow: + type: object + properties: + cells: + type: array + items: + type: string UserRole: type: string enum: @@ -1987,6 +2042,13 @@ definitions: payload: $ref: '#/definitions/apiv1ActivityPayload' description: The payload of the activity. + v1AutoLinkNode: + type: object + properties: + url: + type: string + isRawText: + type: boolean v1BatchUpsertTagRequest: type: object properties: @@ -1995,6 +2057,43 @@ definitions: items: type: object $ref: '#/definitions/v1UpsertTagRequest' + v1BlockquoteNode: + type: object + properties: + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1BoldItalicNode: + type: object + properties: + symbol: + type: string + content: + type: string + v1BoldNode: + type: object + properties: + symbol: + type: string + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1CodeBlockNode: + type: object + properties: + language: + type: string + content: + type: string + v1CodeNode: + type: object + properties: + content: + type: string v1CreateMemoRequest: type: object properties: @@ -2009,6 +2108,18 @@ definitions: type: string url: type: string + v1EmbeddedContentNode: + type: object + properties: + resourceName: + type: string + params: + type: string + v1EscapingCharacterNode: + type: object + properties: + symbol: + type: string v1ExportMemosRequest: type: object properties: @@ -2021,11 +2132,6 @@ definitions: content: type: string format: byte - v1GetLinkMetadataResponse: - type: object - properties: - linkMetadata: - $ref: '#/definitions/v1LinkMetadata' v1GetTagSuggestionsResponse: type: object properties: @@ -2044,6 +2150,34 @@ definitions: description: |- stats is the stats of memo creating/updating activities. key is the year-month-day string. e.g. "2020-01-01". + v1HeadingNode: + type: object + properties: + level: + type: integer + format: int32 + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1HighlightNode: + type: object + properties: + content: + type: string + v1HorizontalRuleNode: + type: object + properties: + symbol: + type: string + v1ImageNode: + type: object + properties: + altText: + type: string + url: + type: string v1Inbox: type: object properties: @@ -2082,6 +2216,15 @@ definitions: - TYPE_MEMO_COMMENT - TYPE_VERSION_UPDATE default: TYPE_UNSPECIFIED + v1ItalicNode: + type: object + properties: + symbol: + type: string + content: + type: string + v1LineBreakNode: + type: object v1LinkMetadata: type: object properties: @@ -2091,6 +2234,13 @@ definitions: type: string image: type: string + v1LinkNode: + type: object + properties: + text: + type: string + url: + type: string v1ListIdentityProvidersResponse: type: object properties: @@ -2200,6 +2350,16 @@ definitions: items: type: object $ref: '#/definitions/apiv1WorkspaceSetting' + v1MathBlockNode: + type: object + properties: + content: + type: string + v1MathNode: + type: object + properties: + content: + type: string v1Memo: type: object properties: @@ -2230,6 +2390,12 @@ definitions: format: date-time content: type: string + nodes: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + readOnly: true visibility: $ref: '#/definitions/v1Visibility' pinned: @@ -2278,6 +2444,137 @@ definitions: - REFERENCE - COMMENT default: TYPE_UNSPECIFIED + v1Node: + type: object + properties: + type: + $ref: '#/definitions/v1NodeType' + lineBreakNode: + $ref: '#/definitions/v1LineBreakNode' + paragraphNode: + $ref: '#/definitions/v1ParagraphNode' + codeBlockNode: + $ref: '#/definitions/v1CodeBlockNode' + headingNode: + $ref: '#/definitions/v1HeadingNode' + horizontalRuleNode: + $ref: '#/definitions/v1HorizontalRuleNode' + blockquoteNode: + $ref: '#/definitions/v1BlockquoteNode' + orderedListNode: + $ref: '#/definitions/v1OrderedListNode' + unorderedListNode: + $ref: '#/definitions/v1UnorderedListNode' + taskListNode: + $ref: '#/definitions/v1TaskListNode' + mathBlockNode: + $ref: '#/definitions/v1MathBlockNode' + tableNode: + $ref: '#/definitions/v1TableNode' + embeddedContentNode: + $ref: '#/definitions/v1EmbeddedContentNode' + textNode: + $ref: '#/definitions/v1TextNode' + boldNode: + $ref: '#/definitions/v1BoldNode' + italicNode: + $ref: '#/definitions/v1ItalicNode' + boldItalicNode: + $ref: '#/definitions/v1BoldItalicNode' + codeNode: + $ref: '#/definitions/v1CodeNode' + imageNode: + $ref: '#/definitions/v1ImageNode' + linkNode: + $ref: '#/definitions/v1LinkNode' + autoLinkNode: + $ref: '#/definitions/v1AutoLinkNode' + tagNode: + $ref: '#/definitions/v1TagNode' + strikethroughNode: + $ref: '#/definitions/v1StrikethroughNode' + escapingCharacterNode: + $ref: '#/definitions/v1EscapingCharacterNode' + mathNode: + $ref: '#/definitions/v1MathNode' + highlightNode: + $ref: '#/definitions/v1HighlightNode' + subscriptNode: + $ref: '#/definitions/v1SubscriptNode' + superscriptNode: + $ref: '#/definitions/v1SuperscriptNode' + referencedContentNode: + $ref: '#/definitions/v1ReferencedContentNode' + spoilerNode: + $ref: '#/definitions/v1SpoilerNode' + v1NodeType: + type: string + enum: + - NODE_UNSPECIFIED + - LINE_BREAK + - PARAGRAPH + - CODE_BLOCK + - HEADING + - HORIZONTAL_RULE + - BLOCKQUOTE + - ORDERED_LIST + - UNORDERED_LIST + - TASK_LIST + - MATH_BLOCK + - TABLE + - EMBEDDED_CONTENT + - TEXT + - BOLD + - ITALIC + - BOLD_ITALIC + - CODE + - IMAGE + - LINK + - AUTO_LINK + - TAG + - STRIKETHROUGH + - ESCAPING_CHARACTER + - MATH + - HIGHLIGHT + - SUBSCRIPT + - SUPERSCRIPT + - REFERENCED_CONTENT + - SPOILER + default: NODE_UNSPECIFIED + v1OrderedListNode: + type: object + properties: + number: + type: string + indent: + type: integer + format: int32 + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1ParagraphNode: + type: object + properties: + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1ParseMarkdownRequest: + type: object + properties: + markdown: + type: string + v1ParseMarkdownResponse: + type: object + properties: + nodes: + type: array + items: + type: object + $ref: '#/definitions/v1Node' v1Reaction: type: object properties: @@ -2310,6 +2607,13 @@ definitions: - CLOWN_FACE - QUESTION_MARK default: TYPE_UNSPECIFIED + v1ReferencedContentNode: + type: object + properties: + resourceName: + type: string + params: + type: string v1RenameTagRequest: type: object properties: @@ -2355,6 +2659,19 @@ definitions: title: |- The related memo. Format: memos/{id} + v1RestoreMarkdownRequest: + type: object + properties: + nodes: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1RestoreMarkdownResponse: + type: object + properties: + markdown: + type: string v1RowStatus: type: string enum: @@ -2386,6 +2703,42 @@ definitions: items: type: object $ref: '#/definitions/v1User' + v1SpoilerNode: + type: object + properties: + content: + type: string + v1StrikethroughNode: + type: object + properties: + content: + type: string + v1SubscriptNode: + type: object + properties: + content: + type: string + v1SuperscriptNode: + type: object + properties: + content: + type: string + v1TableNode: + type: object + properties: + header: + type: array + items: + type: string + delimiter: + type: array + items: + type: string + rows: + type: array + items: + type: object + $ref: '#/definitions/TableNodeRow' v1Tag: type: object properties: @@ -2396,6 +2749,44 @@ definitions: title: |- The creator of tags. Format: users/{id} + v1TagNode: + type: object + properties: + content: + type: string + v1TaskListNode: + type: object + properties: + symbol: + type: string + indent: + type: integer + format: int32 + complete: + type: boolean + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' + v1TextNode: + type: object + properties: + content: + type: string + v1UnorderedListNode: + type: object + properties: + symbol: + type: string + indent: + type: integer + format: int32 + children: + type: array + items: + type: object + $ref: '#/definitions/v1Node' v1UpsertTagRequest: type: object properties: diff --git a/plugin/http-getter/html_meta.go b/plugin/http-getter/html_meta.go index 4105ece04..a4c24ef29 100644 --- a/plugin/http-getter/html_meta.go +++ b/plugin/http-getter/html_meta.go @@ -32,7 +32,7 @@ func GetHTMLMeta(urlStr string) (*HTMLMeta, error) { return nil, err } if mediatype != "text/html" { - return nil, errors.New("Wrong website mediatype") + return nil, errors.New("not a HTML page") } htmlMeta := extractHTMLMeta(response.Body) diff --git a/proto/api/v1/link_service.proto b/proto/api/v1/link_service.proto deleted file mode 100644 index f75baa6e6..000000000 --- a/proto/api/v1/link_service.proto +++ /dev/null @@ -1,28 +0,0 @@ -syntax = "proto3"; - -package memos.api.v1; - -import "google/api/annotations.proto"; - -option go_package = "gen/api/v1"; - -service LinkService { - // GetLinkMetadata returns metadata for a given link. - rpc GetLinkMetadata(GetLinkMetadataRequest) returns (GetLinkMetadataResponse) { - option (google.api.http) = {get: "/api/v1/linkMetadata"}; - } -} - -message GetLinkMetadataRequest { - string link = 1; -} - -message GetLinkMetadataResponse { - LinkMetadata link_metadata = 1; -} - -message LinkMetadata { - string title = 1; - string description = 2; - string image = 3; -} diff --git a/proto/api/v1/markdown_service.proto b/proto/api/v1/markdown_service.proto new file mode 100644 index 000000000..022358918 --- /dev/null +++ b/proto/api/v1/markdown_service.proto @@ -0,0 +1,259 @@ +syntax = "proto3"; + +package memos.api.v1; + +import "google/api/annotations.proto"; + +option go_package = "gen/api/v1"; + +service MarkdownService { + // Parses the given markdown content and returns a list of nodes. + rpc ParseMarkdown(ParseMarkdownRequest) returns (ParseMarkdownResponse) { + option (google.api.http) = { + post: "/api/v1/markdown/parse" + body: "*" + }; + } + // Restores the given nodes to markdown content. + rpc RestoreMarkdown(RestoreMarkdownRequest) returns (RestoreMarkdownResponse) { + option (google.api.http) = { + post: "/api/v1/markdown:restore" + body: "*" + }; + } + // GetLinkMetadata returns metadata for a given link. + rpc GetLinkMetadata(GetLinkMetadataRequest) returns (LinkMetadata) { + option (google.api.http) = {get: "/api/v1/markdown/link:metadata"}; + } +} + +message ParseMarkdownRequest { + string markdown = 1; +} + +message ParseMarkdownResponse { + repeated Node nodes = 1; +} + +message RestoreMarkdownRequest { + repeated Node nodes = 1; +} + +message RestoreMarkdownResponse { + string markdown = 1; +} + +message GetLinkMetadataRequest { + string link = 1; +} + +message LinkMetadata { + string title = 1; + string description = 2; + string image = 3; +} + +enum NodeType { + NODE_UNSPECIFIED = 0; + LINE_BREAK = 1; + PARAGRAPH = 2; + CODE_BLOCK = 3; + HEADING = 4; + HORIZONTAL_RULE = 5; + BLOCKQUOTE = 6; + ORDERED_LIST = 7; + UNORDERED_LIST = 8; + TASK_LIST = 9; + MATH_BLOCK = 10; + TABLE = 11; + EMBEDDED_CONTENT = 12; + TEXT = 13; + BOLD = 14; + ITALIC = 15; + BOLD_ITALIC = 16; + CODE = 17; + IMAGE = 18; + LINK = 19; + AUTO_LINK = 20; + TAG = 21; + STRIKETHROUGH = 22; + ESCAPING_CHARACTER = 23; + MATH = 24; + HIGHLIGHT = 25; + SUBSCRIPT = 26; + SUPERSCRIPT = 27; + REFERENCED_CONTENT = 28; + SPOILER = 29; +} + +message Node { + NodeType type = 1; + oneof node { + LineBreakNode line_break_node = 2; + ParagraphNode paragraph_node = 3; + CodeBlockNode code_block_node = 4; + HeadingNode heading_node = 5; + HorizontalRuleNode horizontal_rule_node = 6; + BlockquoteNode blockquote_node = 7; + OrderedListNode ordered_list_node = 8; + UnorderedListNode unordered_list_node = 9; + TaskListNode task_list_node = 10; + MathBlockNode math_block_node = 11; + TableNode table_node = 12; + EmbeddedContentNode embedded_content_node = 13; + TextNode text_node = 14; + BoldNode bold_node = 15; + ItalicNode italic_node = 16; + BoldItalicNode bold_italic_node = 17; + CodeNode code_node = 18; + ImageNode image_node = 19; + LinkNode link_node = 20; + AutoLinkNode auto_link_node = 21; + TagNode tag_node = 22; + StrikethroughNode strikethrough_node = 23; + EscapingCharacterNode escaping_character_node = 24; + MathNode math_node = 25; + HighlightNode highlight_node = 26; + SubscriptNode subscript_node = 27; + SuperscriptNode superscript_node = 28; + ReferencedContentNode referenced_content_node = 29; + SpoilerNode spoiler_node = 30; + } +} + +message LineBreakNode {} + +message ParagraphNode { + repeated Node children = 1; +} + +message CodeBlockNode { + string language = 1; + string content = 2; +} + +message HeadingNode { + int32 level = 1; + repeated Node children = 2; +} + +message HorizontalRuleNode { + string symbol = 1; +} + +message BlockquoteNode { + repeated Node children = 1; +} + +message OrderedListNode { + string number = 1; + int32 indent = 2; + repeated Node children = 3; +} + +message UnorderedListNode { + string symbol = 1; + int32 indent = 2; + repeated Node children = 3; +} + +message TaskListNode { + string symbol = 1; + int32 indent = 2; + bool complete = 3; + repeated Node children = 4; +} + +message MathBlockNode { + string content = 1; +} + +message TableNode { + repeated string header = 1; + repeated string delimiter = 2; + + message Row { + repeated string cells = 1; + } + repeated Row rows = 3; +} + +message EmbeddedContentNode { + string resource_name = 1; + string params = 2; +} + +message TextNode { + string content = 1; +} + +message BoldNode { + string symbol = 1; + repeated Node children = 2; +} + +message ItalicNode { + string symbol = 1; + string content = 2; +} + +message BoldItalicNode { + string symbol = 1; + string content = 2; +} + +message CodeNode { + string content = 1; +} + +message ImageNode { + string alt_text = 1; + string url = 2; +} + +message LinkNode { + string text = 1; + string url = 2; +} + +message AutoLinkNode { + string url = 1; + bool is_raw_text = 2; +} + +message TagNode { + string content = 1; +} + +message StrikethroughNode { + string content = 1; +} + +message EscapingCharacterNode { + string symbol = 1; +} + +message MathNode { + string content = 1; +} + +message HighlightNode { + string content = 1; +} + +message SubscriptNode { + string content = 1; +} + +message SuperscriptNode { + string content = 1; +} + +message ReferencedContentNode { + string resource_name = 1; + string params = 2; +} + +message SpoilerNode { + string content = 1; +} diff --git a/proto/api/v1/memo_service.proto b/proto/api/v1/memo_service.proto index 318ccae85..92eb226de 100644 --- a/proto/api/v1/memo_service.proto +++ b/proto/api/v1/memo_service.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package memos.api.v1; import "api/v1/common.proto"; +import "api/v1/markdown_service.proto"; import "api/v1/memo_relation_service.proto"; import "api/v1/reaction_service.proto"; import "api/v1/resource_service.proto"; @@ -146,21 +147,23 @@ message Memo { google.protobuf.Timestamp update_time = 6; - google.protobuf.Timestamp display_time = 78; + google.protobuf.Timestamp display_time = 7; string content = 8; - Visibility visibility = 9; + repeated Node nodes = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; - bool pinned = 10; + Visibility visibility = 10; - optional int32 parent_id = 11 [(google.api.field_behavior) = OUTPUT_ONLY]; + bool pinned = 11; - repeated Resource resources = 12 [(google.api.field_behavior) = OUTPUT_ONLY]; + optional int32 parent_id = 12 [(google.api.field_behavior) = OUTPUT_ONLY]; - repeated MemoRelation relations = 13 [(google.api.field_behavior) = OUTPUT_ONLY]; + repeated Resource resources = 13 [(google.api.field_behavior) = OUTPUT_ONLY]; - repeated Reaction reactions = 14 [(google.api.field_behavior) = OUTPUT_ONLY]; + repeated MemoRelation relations = 14 [(google.api.field_behavior) = OUTPUT_ONLY]; + + repeated Reaction reactions = 15 [(google.api.field_behavior) = OUTPUT_ONLY]; } message CreateMemoRequest { diff --git a/proto/gen/api/v1/link_service.pb.go b/proto/gen/api/v1/link_service.pb.go deleted file mode 100644 index c3badb40d..000000000 --- a/proto/gen/api/v1/link_service.pb.go +++ /dev/null @@ -1,315 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.33.0 -// protoc (unknown) -// source: api/v1/link_service.proto - -package apiv1 - -import ( - _ "google.golang.org/genproto/googleapis/api/annotations" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type GetLinkMetadataRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Link string `protobuf:"bytes,1,opt,name=link,proto3" json:"link,omitempty"` -} - -func (x *GetLinkMetadataRequest) Reset() { - *x = GetLinkMetadataRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_link_service_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetLinkMetadataRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetLinkMetadataRequest) ProtoMessage() {} - -func (x *GetLinkMetadataRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_link_service_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetLinkMetadataRequest.ProtoReflect.Descriptor instead. -func (*GetLinkMetadataRequest) Descriptor() ([]byte, []int) { - return file_api_v1_link_service_proto_rawDescGZIP(), []int{0} -} - -func (x *GetLinkMetadataRequest) GetLink() string { - if x != nil { - return x.Link - } - return "" -} - -type GetLinkMetadataResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - LinkMetadata *LinkMetadata `protobuf:"bytes,1,opt,name=link_metadata,json=linkMetadata,proto3" json:"link_metadata,omitempty"` -} - -func (x *GetLinkMetadataResponse) Reset() { - *x = GetLinkMetadataResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_link_service_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetLinkMetadataResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetLinkMetadataResponse) ProtoMessage() {} - -func (x *GetLinkMetadataResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_link_service_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetLinkMetadataResponse.ProtoReflect.Descriptor instead. -func (*GetLinkMetadataResponse) Descriptor() ([]byte, []int) { - return file_api_v1_link_service_proto_rawDescGZIP(), []int{1} -} - -func (x *GetLinkMetadataResponse) GetLinkMetadata() *LinkMetadata { - if x != nil { - return x.LinkMetadata - } - return nil -} - -type LinkMetadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` - Image string `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` -} - -func (x *LinkMetadata) Reset() { - *x = LinkMetadata{} - if protoimpl.UnsafeEnabled { - mi := &file_api_v1_link_service_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LinkMetadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LinkMetadata) ProtoMessage() {} - -func (x *LinkMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_link_service_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LinkMetadata.ProtoReflect.Descriptor instead. -func (*LinkMetadata) Descriptor() ([]byte, []int) { - return file_api_v1_link_service_proto_rawDescGZIP(), []int{2} -} - -func (x *LinkMetadata) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *LinkMetadata) GetDescription() string { - if x != nil { - return x.Description - } - return "" -} - -func (x *LinkMetadata) GetImage() string { - if x != nil { - return x.Image - } - return "" -} - -var File_api_v1_link_service_proto protoreflect.FileDescriptor - -var file_api_v1_link_service_proto_rawDesc = []byte{ - 0x0a, 0x19, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x2c, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c, 0x69, - 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x5a, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3f, 0x0a, 0x0d, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x0c, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x5c, 0x0a, 0x0c, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 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, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x32, - 0x8b, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x7c, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xa8, 0x01, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x42, 0x10, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, - 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, - 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x4d, - 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 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, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_api_v1_link_service_proto_rawDescOnce sync.Once - file_api_v1_link_service_proto_rawDescData = file_api_v1_link_service_proto_rawDesc -) - -func file_api_v1_link_service_proto_rawDescGZIP() []byte { - file_api_v1_link_service_proto_rawDescOnce.Do(func() { - file_api_v1_link_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_link_service_proto_rawDescData) - }) - return file_api_v1_link_service_proto_rawDescData -} - -var file_api_v1_link_service_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_api_v1_link_service_proto_goTypes = []interface{}{ - (*GetLinkMetadataRequest)(nil), // 0: memos.api.v1.GetLinkMetadataRequest - (*GetLinkMetadataResponse)(nil), // 1: memos.api.v1.GetLinkMetadataResponse - (*LinkMetadata)(nil), // 2: memos.api.v1.LinkMetadata -} -var file_api_v1_link_service_proto_depIdxs = []int32{ - 2, // 0: memos.api.v1.GetLinkMetadataResponse.link_metadata:type_name -> memos.api.v1.LinkMetadata - 0, // 1: memos.api.v1.LinkService.GetLinkMetadata:input_type -> memos.api.v1.GetLinkMetadataRequest - 1, // 2: memos.api.v1.LinkService.GetLinkMetadata:output_type -> memos.api.v1.GetLinkMetadataResponse - 2, // [2:3] is the sub-list for method output_type - 1, // [1:2] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_api_v1_link_service_proto_init() } -func file_api_v1_link_service_proto_init() { - if File_api_v1_link_service_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_api_v1_link_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLinkMetadataRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_v1_link_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLinkMetadataResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_api_v1_link_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkMetadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_api_v1_link_service_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_api_v1_link_service_proto_goTypes, - DependencyIndexes: file_api_v1_link_service_proto_depIdxs, - MessageInfos: file_api_v1_link_service_proto_msgTypes, - }.Build() - File_api_v1_link_service_proto = out.File - file_api_v1_link_service_proto_rawDesc = nil - file_api_v1_link_service_proto_goTypes = nil - file_api_v1_link_service_proto_depIdxs = nil -} diff --git a/proto/gen/api/v1/link_service.pb.gw.go b/proto/gen/api/v1/link_service.pb.gw.go deleted file mode 100644 index 56d611962..000000000 --- a/proto/gen/api/v1/link_service.pb.gw.go +++ /dev/null @@ -1,173 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: api/v1/link_service.proto - -/* -Package apiv1 is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package apiv1 - -import ( - "context" - "io" - "net/http" - - "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" - "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" - "google.golang.org/protobuf/proto" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = metadata.Join - -var ( - filter_LinkService_GetLinkMetadata_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_LinkService_GetLinkMetadata_0(ctx context.Context, marshaler runtime.Marshaler, client LinkServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetLinkMetadataRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_LinkService_GetLinkMetadata_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.GetLinkMetadata(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_LinkService_GetLinkMetadata_0(ctx context.Context, marshaler runtime.Marshaler, server LinkServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq GetLinkMetadataRequest - var metadata runtime.ServerMetadata - - if err := req.ParseForm(); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_LinkService_GetLinkMetadata_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.GetLinkMetadata(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterLinkServiceHandlerServer registers the http handlers for service LinkService to "mux". -// UnaryRPC :call LinkServiceServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterLinkServiceHandlerFromEndpoint instead. -func RegisterLinkServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server LinkServiceServer) error { - - mux.Handle("GET", pattern_LinkService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.LinkService/GetLinkMetadata", runtime.WithHTTPPathPattern("/api/v1/linkMetadata")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_LinkService_GetLinkMetadata_0(annotatedContext, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_LinkService_GetLinkMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterLinkServiceHandlerFromEndpoint is same as RegisterLinkServiceHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterLinkServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.DialContext(ctx, endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterLinkServiceHandler(ctx, mux, conn) -} - -// RegisterLinkServiceHandler registers the http handlers for service LinkService to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterLinkServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterLinkServiceHandlerClient(ctx, mux, NewLinkServiceClient(conn)) -} - -// RegisterLinkServiceHandlerClient registers the http handlers for service LinkService -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "LinkServiceClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "LinkServiceClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "LinkServiceClient" to call the correct interceptors. -func RegisterLinkServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client LinkServiceClient) error { - - mux.Handle("GET", pattern_LinkService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - var annotatedContext context.Context - annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.LinkService/GetLinkMetadata", runtime.WithHTTPPathPattern("/api/v1/linkMetadata")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_LinkService_GetLinkMetadata_0(annotatedContext, inboundMarshaler, client, req, pathParams) - annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) - if err != nil { - runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) - return - } - - forward_LinkService_GetLinkMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_LinkService_GetLinkMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "linkMetadata"}, "")) -) - -var ( - forward_LinkService_GetLinkMetadata_0 = runtime.ForwardResponseMessage -) diff --git a/proto/gen/api/v1/link_service_grpc.pb.go b/proto/gen/api/v1/link_service_grpc.pb.go deleted file mode 100644 index e225baa67..000000000 --- a/proto/gen/api/v1/link_service_grpc.pb.go +++ /dev/null @@ -1,111 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc (unknown) -// source: api/v1/link_service.proto - -package apiv1 - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -const ( - LinkService_GetLinkMetadata_FullMethodName = "/memos.api.v1.LinkService/GetLinkMetadata" -) - -// LinkServiceClient is the client API for LinkService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type LinkServiceClient interface { - // GetLinkMetadata returns metadata for a given link. - GetLinkMetadata(ctx context.Context, in *GetLinkMetadataRequest, opts ...grpc.CallOption) (*GetLinkMetadataResponse, error) -} - -type linkServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewLinkServiceClient(cc grpc.ClientConnInterface) LinkServiceClient { - return &linkServiceClient{cc} -} - -func (c *linkServiceClient) GetLinkMetadata(ctx context.Context, in *GetLinkMetadataRequest, opts ...grpc.CallOption) (*GetLinkMetadataResponse, error) { - out := new(GetLinkMetadataResponse) - err := c.cc.Invoke(ctx, LinkService_GetLinkMetadata_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// LinkServiceServer is the server API for LinkService service. -// All implementations must embed UnimplementedLinkServiceServer -// for forward compatibility -type LinkServiceServer interface { - // GetLinkMetadata returns metadata for a given link. - GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*GetLinkMetadataResponse, error) - mustEmbedUnimplementedLinkServiceServer() -} - -// UnimplementedLinkServiceServer must be embedded to have forward compatible implementations. -type UnimplementedLinkServiceServer struct { -} - -func (UnimplementedLinkServiceServer) GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*GetLinkMetadataResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetLinkMetadata not implemented") -} -func (UnimplementedLinkServiceServer) mustEmbedUnimplementedLinkServiceServer() {} - -// UnsafeLinkServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to LinkServiceServer will -// result in compilation errors. -type UnsafeLinkServiceServer interface { - mustEmbedUnimplementedLinkServiceServer() -} - -func RegisterLinkServiceServer(s grpc.ServiceRegistrar, srv LinkServiceServer) { - s.RegisterService(&LinkService_ServiceDesc, srv) -} - -func _LinkService_GetLinkMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetLinkMetadataRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LinkServiceServer).GetLinkMetadata(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: LinkService_GetLinkMetadata_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LinkServiceServer).GetLinkMetadata(ctx, req.(*GetLinkMetadataRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// LinkService_ServiceDesc is the grpc.ServiceDesc for LinkService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var LinkService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "memos.api.v1.LinkService", - HandlerType: (*LinkServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetLinkMetadata", - Handler: _LinkService_GetLinkMetadata_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "api/v1/link_service.proto", -} diff --git a/proto/gen/api/v1/markdown_service.pb.go b/proto/gen/api/v1/markdown_service.pb.go new file mode 100644 index 000000000..e92947e38 --- /dev/null +++ b/proto/gen/api/v1/markdown_service.pb.go @@ -0,0 +1,3430 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.33.0 +// protoc (unknown) +// source: api/v1/markdown_service.proto + +package apiv1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type NodeType int32 + +const ( + NodeType_NODE_UNSPECIFIED NodeType = 0 + NodeType_LINE_BREAK NodeType = 1 + NodeType_PARAGRAPH NodeType = 2 + NodeType_CODE_BLOCK NodeType = 3 + NodeType_HEADING NodeType = 4 + NodeType_HORIZONTAL_RULE NodeType = 5 + NodeType_BLOCKQUOTE NodeType = 6 + NodeType_ORDERED_LIST NodeType = 7 + NodeType_UNORDERED_LIST NodeType = 8 + NodeType_TASK_LIST NodeType = 9 + NodeType_MATH_BLOCK NodeType = 10 + NodeType_TABLE NodeType = 11 + NodeType_EMBEDDED_CONTENT NodeType = 12 + NodeType_TEXT NodeType = 13 + NodeType_BOLD NodeType = 14 + NodeType_ITALIC NodeType = 15 + NodeType_BOLD_ITALIC NodeType = 16 + NodeType_CODE NodeType = 17 + NodeType_IMAGE NodeType = 18 + NodeType_LINK NodeType = 19 + NodeType_AUTO_LINK NodeType = 20 + NodeType_TAG NodeType = 21 + NodeType_STRIKETHROUGH NodeType = 22 + NodeType_ESCAPING_CHARACTER NodeType = 23 + NodeType_MATH NodeType = 24 + NodeType_HIGHLIGHT NodeType = 25 + NodeType_SUBSCRIPT NodeType = 26 + NodeType_SUPERSCRIPT NodeType = 27 + NodeType_REFERENCED_CONTENT NodeType = 28 + NodeType_SPOILER NodeType = 29 +) + +// Enum value maps for NodeType. +var ( + NodeType_name = map[int32]string{ + 0: "NODE_UNSPECIFIED", + 1: "LINE_BREAK", + 2: "PARAGRAPH", + 3: "CODE_BLOCK", + 4: "HEADING", + 5: "HORIZONTAL_RULE", + 6: "BLOCKQUOTE", + 7: "ORDERED_LIST", + 8: "UNORDERED_LIST", + 9: "TASK_LIST", + 10: "MATH_BLOCK", + 11: "TABLE", + 12: "EMBEDDED_CONTENT", + 13: "TEXT", + 14: "BOLD", + 15: "ITALIC", + 16: "BOLD_ITALIC", + 17: "CODE", + 18: "IMAGE", + 19: "LINK", + 20: "AUTO_LINK", + 21: "TAG", + 22: "STRIKETHROUGH", + 23: "ESCAPING_CHARACTER", + 24: "MATH", + 25: "HIGHLIGHT", + 26: "SUBSCRIPT", + 27: "SUPERSCRIPT", + 28: "REFERENCED_CONTENT", + 29: "SPOILER", + } + NodeType_value = map[string]int32{ + "NODE_UNSPECIFIED": 0, + "LINE_BREAK": 1, + "PARAGRAPH": 2, + "CODE_BLOCK": 3, + "HEADING": 4, + "HORIZONTAL_RULE": 5, + "BLOCKQUOTE": 6, + "ORDERED_LIST": 7, + "UNORDERED_LIST": 8, + "TASK_LIST": 9, + "MATH_BLOCK": 10, + "TABLE": 11, + "EMBEDDED_CONTENT": 12, + "TEXT": 13, + "BOLD": 14, + "ITALIC": 15, + "BOLD_ITALIC": 16, + "CODE": 17, + "IMAGE": 18, + "LINK": 19, + "AUTO_LINK": 20, + "TAG": 21, + "STRIKETHROUGH": 22, + "ESCAPING_CHARACTER": 23, + "MATH": 24, + "HIGHLIGHT": 25, + "SUBSCRIPT": 26, + "SUPERSCRIPT": 27, + "REFERENCED_CONTENT": 28, + "SPOILER": 29, + } +) + +func (x NodeType) Enum() *NodeType { + p := new(NodeType) + *p = x + return p +} + +func (x NodeType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NodeType) Descriptor() protoreflect.EnumDescriptor { + return file_api_v1_markdown_service_proto_enumTypes[0].Descriptor() +} + +func (NodeType) Type() protoreflect.EnumType { + return &file_api_v1_markdown_service_proto_enumTypes[0] +} + +func (x NodeType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NodeType.Descriptor instead. +func (NodeType) EnumDescriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{0} +} + +type ParseMarkdownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Markdown string `protobuf:"bytes,1,opt,name=markdown,proto3" json:"markdown,omitempty"` +} + +func (x *ParseMarkdownRequest) Reset() { + *x = ParseMarkdownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParseMarkdownRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParseMarkdownRequest) ProtoMessage() {} + +func (x *ParseMarkdownRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParseMarkdownRequest.ProtoReflect.Descriptor instead. +func (*ParseMarkdownRequest) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{0} +} + +func (x *ParseMarkdownRequest) GetMarkdown() string { + if x != nil { + return x.Markdown + } + return "" +} + +type ParseMarkdownResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodes []*Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` +} + +func (x *ParseMarkdownResponse) Reset() { + *x = ParseMarkdownResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParseMarkdownResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParseMarkdownResponse) ProtoMessage() {} + +func (x *ParseMarkdownResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParseMarkdownResponse.ProtoReflect.Descriptor instead. +func (*ParseMarkdownResponse) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{1} +} + +func (x *ParseMarkdownResponse) GetNodes() []*Node { + if x != nil { + return x.Nodes + } + return nil +} + +type RestoreMarkdownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Nodes []*Node `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` +} + +func (x *RestoreMarkdownRequest) Reset() { + *x = RestoreMarkdownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreMarkdownRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreMarkdownRequest) ProtoMessage() {} + +func (x *RestoreMarkdownRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreMarkdownRequest.ProtoReflect.Descriptor instead. +func (*RestoreMarkdownRequest) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{2} +} + +func (x *RestoreMarkdownRequest) GetNodes() []*Node { + if x != nil { + return x.Nodes + } + return nil +} + +type RestoreMarkdownResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Markdown string `protobuf:"bytes,1,opt,name=markdown,proto3" json:"markdown,omitempty"` +} + +func (x *RestoreMarkdownResponse) Reset() { + *x = RestoreMarkdownResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RestoreMarkdownResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreMarkdownResponse) ProtoMessage() {} + +func (x *RestoreMarkdownResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreMarkdownResponse.ProtoReflect.Descriptor instead. +func (*RestoreMarkdownResponse) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{3} +} + +func (x *RestoreMarkdownResponse) GetMarkdown() string { + if x != nil { + return x.Markdown + } + return "" +} + +type GetLinkMetadataRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Link string `protobuf:"bytes,1,opt,name=link,proto3" json:"link,omitempty"` +} + +func (x *GetLinkMetadataRequest) Reset() { + *x = GetLinkMetadataRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLinkMetadataRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLinkMetadataRequest) ProtoMessage() {} + +func (x *GetLinkMetadataRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLinkMetadataRequest.ProtoReflect.Descriptor instead. +func (*GetLinkMetadataRequest) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{4} +} + +func (x *GetLinkMetadataRequest) GetLink() string { + if x != nil { + return x.Link + } + return "" +} + +type LinkMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Image string `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"` +} + +func (x *LinkMetadata) Reset() { + *x = LinkMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinkMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinkMetadata) ProtoMessage() {} + +func (x *LinkMetadata) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinkMetadata.ProtoReflect.Descriptor instead. +func (*LinkMetadata) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{5} +} + +func (x *LinkMetadata) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *LinkMetadata) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *LinkMetadata) GetImage() string { + if x != nil { + return x.Image + } + return "" +} + +type Node struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type NodeType `protobuf:"varint,1,opt,name=type,proto3,enum=memos.api.v1.NodeType" json:"type,omitempty"` + // Types that are assignable to Node: + // + // *Node_LineBreakNode + // *Node_ParagraphNode + // *Node_CodeBlockNode + // *Node_HeadingNode + // *Node_HorizontalRuleNode + // *Node_BlockquoteNode + // *Node_OrderedListNode + // *Node_UnorderedListNode + // *Node_TaskListNode + // *Node_MathBlockNode + // *Node_TableNode + // *Node_EmbeddedContentNode + // *Node_TextNode + // *Node_BoldNode + // *Node_ItalicNode + // *Node_BoldItalicNode + // *Node_CodeNode + // *Node_ImageNode + // *Node_LinkNode + // *Node_AutoLinkNode + // *Node_TagNode + // *Node_StrikethroughNode + // *Node_EscapingCharacterNode + // *Node_MathNode + // *Node_HighlightNode + // *Node_SubscriptNode + // *Node_SuperscriptNode + // *Node_ReferencedContentNode + // *Node_SpoilerNode + Node isNode_Node `protobuf_oneof:"node"` +} + +func (x *Node) Reset() { + *x = Node{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Node) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Node) ProtoMessage() {} + +func (x *Node) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Node.ProtoReflect.Descriptor instead. +func (*Node) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{6} +} + +func (x *Node) GetType() NodeType { + if x != nil { + return x.Type + } + return NodeType_NODE_UNSPECIFIED +} + +func (m *Node) GetNode() isNode_Node { + if m != nil { + return m.Node + } + return nil +} + +func (x *Node) GetLineBreakNode() *LineBreakNode { + if x, ok := x.GetNode().(*Node_LineBreakNode); ok { + return x.LineBreakNode + } + return nil +} + +func (x *Node) GetParagraphNode() *ParagraphNode { + if x, ok := x.GetNode().(*Node_ParagraphNode); ok { + return x.ParagraphNode + } + return nil +} + +func (x *Node) GetCodeBlockNode() *CodeBlockNode { + if x, ok := x.GetNode().(*Node_CodeBlockNode); ok { + return x.CodeBlockNode + } + return nil +} + +func (x *Node) GetHeadingNode() *HeadingNode { + if x, ok := x.GetNode().(*Node_HeadingNode); ok { + return x.HeadingNode + } + return nil +} + +func (x *Node) GetHorizontalRuleNode() *HorizontalRuleNode { + if x, ok := x.GetNode().(*Node_HorizontalRuleNode); ok { + return x.HorizontalRuleNode + } + return nil +} + +func (x *Node) GetBlockquoteNode() *BlockquoteNode { + if x, ok := x.GetNode().(*Node_BlockquoteNode); ok { + return x.BlockquoteNode + } + return nil +} + +func (x *Node) GetOrderedListNode() *OrderedListNode { + if x, ok := x.GetNode().(*Node_OrderedListNode); ok { + return x.OrderedListNode + } + return nil +} + +func (x *Node) GetUnorderedListNode() *UnorderedListNode { + if x, ok := x.GetNode().(*Node_UnorderedListNode); ok { + return x.UnorderedListNode + } + return nil +} + +func (x *Node) GetTaskListNode() *TaskListNode { + if x, ok := x.GetNode().(*Node_TaskListNode); ok { + return x.TaskListNode + } + return nil +} + +func (x *Node) GetMathBlockNode() *MathBlockNode { + if x, ok := x.GetNode().(*Node_MathBlockNode); ok { + return x.MathBlockNode + } + return nil +} + +func (x *Node) GetTableNode() *TableNode { + if x, ok := x.GetNode().(*Node_TableNode); ok { + return x.TableNode + } + return nil +} + +func (x *Node) GetEmbeddedContentNode() *EmbeddedContentNode { + if x, ok := x.GetNode().(*Node_EmbeddedContentNode); ok { + return x.EmbeddedContentNode + } + return nil +} + +func (x *Node) GetTextNode() *TextNode { + if x, ok := x.GetNode().(*Node_TextNode); ok { + return x.TextNode + } + return nil +} + +func (x *Node) GetBoldNode() *BoldNode { + if x, ok := x.GetNode().(*Node_BoldNode); ok { + return x.BoldNode + } + return nil +} + +func (x *Node) GetItalicNode() *ItalicNode { + if x, ok := x.GetNode().(*Node_ItalicNode); ok { + return x.ItalicNode + } + return nil +} + +func (x *Node) GetBoldItalicNode() *BoldItalicNode { + if x, ok := x.GetNode().(*Node_BoldItalicNode); ok { + return x.BoldItalicNode + } + return nil +} + +func (x *Node) GetCodeNode() *CodeNode { + if x, ok := x.GetNode().(*Node_CodeNode); ok { + return x.CodeNode + } + return nil +} + +func (x *Node) GetImageNode() *ImageNode { + if x, ok := x.GetNode().(*Node_ImageNode); ok { + return x.ImageNode + } + return nil +} + +func (x *Node) GetLinkNode() *LinkNode { + if x, ok := x.GetNode().(*Node_LinkNode); ok { + return x.LinkNode + } + return nil +} + +func (x *Node) GetAutoLinkNode() *AutoLinkNode { + if x, ok := x.GetNode().(*Node_AutoLinkNode); ok { + return x.AutoLinkNode + } + return nil +} + +func (x *Node) GetTagNode() *TagNode { + if x, ok := x.GetNode().(*Node_TagNode); ok { + return x.TagNode + } + return nil +} + +func (x *Node) GetStrikethroughNode() *StrikethroughNode { + if x, ok := x.GetNode().(*Node_StrikethroughNode); ok { + return x.StrikethroughNode + } + return nil +} + +func (x *Node) GetEscapingCharacterNode() *EscapingCharacterNode { + if x, ok := x.GetNode().(*Node_EscapingCharacterNode); ok { + return x.EscapingCharacterNode + } + return nil +} + +func (x *Node) GetMathNode() *MathNode { + if x, ok := x.GetNode().(*Node_MathNode); ok { + return x.MathNode + } + return nil +} + +func (x *Node) GetHighlightNode() *HighlightNode { + if x, ok := x.GetNode().(*Node_HighlightNode); ok { + return x.HighlightNode + } + return nil +} + +func (x *Node) GetSubscriptNode() *SubscriptNode { + if x, ok := x.GetNode().(*Node_SubscriptNode); ok { + return x.SubscriptNode + } + return nil +} + +func (x *Node) GetSuperscriptNode() *SuperscriptNode { + if x, ok := x.GetNode().(*Node_SuperscriptNode); ok { + return x.SuperscriptNode + } + return nil +} + +func (x *Node) GetReferencedContentNode() *ReferencedContentNode { + if x, ok := x.GetNode().(*Node_ReferencedContentNode); ok { + return x.ReferencedContentNode + } + return nil +} + +func (x *Node) GetSpoilerNode() *SpoilerNode { + if x, ok := x.GetNode().(*Node_SpoilerNode); ok { + return x.SpoilerNode + } + return nil +} + +type isNode_Node interface { + isNode_Node() +} + +type Node_LineBreakNode struct { + LineBreakNode *LineBreakNode `protobuf:"bytes,2,opt,name=line_break_node,json=lineBreakNode,proto3,oneof"` +} + +type Node_ParagraphNode struct { + ParagraphNode *ParagraphNode `protobuf:"bytes,3,opt,name=paragraph_node,json=paragraphNode,proto3,oneof"` +} + +type Node_CodeBlockNode struct { + CodeBlockNode *CodeBlockNode `protobuf:"bytes,4,opt,name=code_block_node,json=codeBlockNode,proto3,oneof"` +} + +type Node_HeadingNode struct { + HeadingNode *HeadingNode `protobuf:"bytes,5,opt,name=heading_node,json=headingNode,proto3,oneof"` +} + +type Node_HorizontalRuleNode struct { + HorizontalRuleNode *HorizontalRuleNode `protobuf:"bytes,6,opt,name=horizontal_rule_node,json=horizontalRuleNode,proto3,oneof"` +} + +type Node_BlockquoteNode struct { + BlockquoteNode *BlockquoteNode `protobuf:"bytes,7,opt,name=blockquote_node,json=blockquoteNode,proto3,oneof"` +} + +type Node_OrderedListNode struct { + OrderedListNode *OrderedListNode `protobuf:"bytes,8,opt,name=ordered_list_node,json=orderedListNode,proto3,oneof"` +} + +type Node_UnorderedListNode struct { + UnorderedListNode *UnorderedListNode `protobuf:"bytes,9,opt,name=unordered_list_node,json=unorderedListNode,proto3,oneof"` +} + +type Node_TaskListNode struct { + TaskListNode *TaskListNode `protobuf:"bytes,10,opt,name=task_list_node,json=taskListNode,proto3,oneof"` +} + +type Node_MathBlockNode struct { + MathBlockNode *MathBlockNode `protobuf:"bytes,11,opt,name=math_block_node,json=mathBlockNode,proto3,oneof"` +} + +type Node_TableNode struct { + TableNode *TableNode `protobuf:"bytes,12,opt,name=table_node,json=tableNode,proto3,oneof"` +} + +type Node_EmbeddedContentNode struct { + EmbeddedContentNode *EmbeddedContentNode `protobuf:"bytes,13,opt,name=embedded_content_node,json=embeddedContentNode,proto3,oneof"` +} + +type Node_TextNode struct { + TextNode *TextNode `protobuf:"bytes,14,opt,name=text_node,json=textNode,proto3,oneof"` +} + +type Node_BoldNode struct { + BoldNode *BoldNode `protobuf:"bytes,15,opt,name=bold_node,json=boldNode,proto3,oneof"` +} + +type Node_ItalicNode struct { + ItalicNode *ItalicNode `protobuf:"bytes,16,opt,name=italic_node,json=italicNode,proto3,oneof"` +} + +type Node_BoldItalicNode struct { + BoldItalicNode *BoldItalicNode `protobuf:"bytes,17,opt,name=bold_italic_node,json=boldItalicNode,proto3,oneof"` +} + +type Node_CodeNode struct { + CodeNode *CodeNode `protobuf:"bytes,18,opt,name=code_node,json=codeNode,proto3,oneof"` +} + +type Node_ImageNode struct { + ImageNode *ImageNode `protobuf:"bytes,19,opt,name=image_node,json=imageNode,proto3,oneof"` +} + +type Node_LinkNode struct { + LinkNode *LinkNode `protobuf:"bytes,20,opt,name=link_node,json=linkNode,proto3,oneof"` +} + +type Node_AutoLinkNode struct { + AutoLinkNode *AutoLinkNode `protobuf:"bytes,21,opt,name=auto_link_node,json=autoLinkNode,proto3,oneof"` +} + +type Node_TagNode struct { + TagNode *TagNode `protobuf:"bytes,22,opt,name=tag_node,json=tagNode,proto3,oneof"` +} + +type Node_StrikethroughNode struct { + StrikethroughNode *StrikethroughNode `protobuf:"bytes,23,opt,name=strikethrough_node,json=strikethroughNode,proto3,oneof"` +} + +type Node_EscapingCharacterNode struct { + EscapingCharacterNode *EscapingCharacterNode `protobuf:"bytes,24,opt,name=escaping_character_node,json=escapingCharacterNode,proto3,oneof"` +} + +type Node_MathNode struct { + MathNode *MathNode `protobuf:"bytes,25,opt,name=math_node,json=mathNode,proto3,oneof"` +} + +type Node_HighlightNode struct { + HighlightNode *HighlightNode `protobuf:"bytes,26,opt,name=highlight_node,json=highlightNode,proto3,oneof"` +} + +type Node_SubscriptNode struct { + SubscriptNode *SubscriptNode `protobuf:"bytes,27,opt,name=subscript_node,json=subscriptNode,proto3,oneof"` +} + +type Node_SuperscriptNode struct { + SuperscriptNode *SuperscriptNode `protobuf:"bytes,28,opt,name=superscript_node,json=superscriptNode,proto3,oneof"` +} + +type Node_ReferencedContentNode struct { + ReferencedContentNode *ReferencedContentNode `protobuf:"bytes,29,opt,name=referenced_content_node,json=referencedContentNode,proto3,oneof"` +} + +type Node_SpoilerNode struct { + SpoilerNode *SpoilerNode `protobuf:"bytes,30,opt,name=spoiler_node,json=spoilerNode,proto3,oneof"` +} + +func (*Node_LineBreakNode) isNode_Node() {} + +func (*Node_ParagraphNode) isNode_Node() {} + +func (*Node_CodeBlockNode) isNode_Node() {} + +func (*Node_HeadingNode) isNode_Node() {} + +func (*Node_HorizontalRuleNode) isNode_Node() {} + +func (*Node_BlockquoteNode) isNode_Node() {} + +func (*Node_OrderedListNode) isNode_Node() {} + +func (*Node_UnorderedListNode) isNode_Node() {} + +func (*Node_TaskListNode) isNode_Node() {} + +func (*Node_MathBlockNode) isNode_Node() {} + +func (*Node_TableNode) isNode_Node() {} + +func (*Node_EmbeddedContentNode) isNode_Node() {} + +func (*Node_TextNode) isNode_Node() {} + +func (*Node_BoldNode) isNode_Node() {} + +func (*Node_ItalicNode) isNode_Node() {} + +func (*Node_BoldItalicNode) isNode_Node() {} + +func (*Node_CodeNode) isNode_Node() {} + +func (*Node_ImageNode) isNode_Node() {} + +func (*Node_LinkNode) isNode_Node() {} + +func (*Node_AutoLinkNode) isNode_Node() {} + +func (*Node_TagNode) isNode_Node() {} + +func (*Node_StrikethroughNode) isNode_Node() {} + +func (*Node_EscapingCharacterNode) isNode_Node() {} + +func (*Node_MathNode) isNode_Node() {} + +func (*Node_HighlightNode) isNode_Node() {} + +func (*Node_SubscriptNode) isNode_Node() {} + +func (*Node_SuperscriptNode) isNode_Node() {} + +func (*Node_ReferencedContentNode) isNode_Node() {} + +func (*Node_SpoilerNode) isNode_Node() {} + +type LineBreakNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *LineBreakNode) Reset() { + *x = LineBreakNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LineBreakNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LineBreakNode) ProtoMessage() {} + +func (x *LineBreakNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LineBreakNode.ProtoReflect.Descriptor instead. +func (*LineBreakNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{7} +} + +type ParagraphNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Children []*Node `protobuf:"bytes,1,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *ParagraphNode) Reset() { + *x = ParagraphNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ParagraphNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ParagraphNode) ProtoMessage() {} + +func (x *ParagraphNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ParagraphNode.ProtoReflect.Descriptor instead. +func (*ParagraphNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{8} +} + +func (x *ParagraphNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type CodeBlockNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Language string `protobuf:"bytes,1,opt,name=language,proto3" json:"language,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *CodeBlockNode) Reset() { + *x = CodeBlockNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeBlockNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeBlockNode) ProtoMessage() {} + +func (x *CodeBlockNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeBlockNode.ProtoReflect.Descriptor instead. +func (*CodeBlockNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{9} +} + +func (x *CodeBlockNode) GetLanguage() string { + if x != nil { + return x.Language + } + return "" +} + +func (x *CodeBlockNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type HeadingNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Level int32 `protobuf:"varint,1,opt,name=level,proto3" json:"level,omitempty"` + Children []*Node `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *HeadingNode) Reset() { + *x = HeadingNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeadingNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeadingNode) ProtoMessage() {} + +func (x *HeadingNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HeadingNode.ProtoReflect.Descriptor instead. +func (*HeadingNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{10} +} + +func (x *HeadingNode) GetLevel() int32 { + if x != nil { + return x.Level + } + return 0 +} + +func (x *HeadingNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type HorizontalRuleNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` +} + +func (x *HorizontalRuleNode) Reset() { + *x = HorizontalRuleNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HorizontalRuleNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HorizontalRuleNode) ProtoMessage() {} + +func (x *HorizontalRuleNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HorizontalRuleNode.ProtoReflect.Descriptor instead. +func (*HorizontalRuleNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{11} +} + +func (x *HorizontalRuleNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +type BlockquoteNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Children []*Node `protobuf:"bytes,1,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *BlockquoteNode) Reset() { + *x = BlockquoteNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BlockquoteNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BlockquoteNode) ProtoMessage() {} + +func (x *BlockquoteNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BlockquoteNode.ProtoReflect.Descriptor instead. +func (*BlockquoteNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{12} +} + +func (x *BlockquoteNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type OrderedListNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number string `protobuf:"bytes,1,opt,name=number,proto3" json:"number,omitempty"` + Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` + Children []*Node `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *OrderedListNode) Reset() { + *x = OrderedListNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OrderedListNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OrderedListNode) ProtoMessage() {} + +func (x *OrderedListNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OrderedListNode.ProtoReflect.Descriptor instead. +func (*OrderedListNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{13} +} + +func (x *OrderedListNode) GetNumber() string { + if x != nil { + return x.Number + } + return "" +} + +func (x *OrderedListNode) GetIndent() int32 { + if x != nil { + return x.Indent + } + return 0 +} + +func (x *OrderedListNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type UnorderedListNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` + Children []*Node `protobuf:"bytes,3,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *UnorderedListNode) Reset() { + *x = UnorderedListNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnorderedListNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnorderedListNode) ProtoMessage() {} + +func (x *UnorderedListNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnorderedListNode.ProtoReflect.Descriptor instead. +func (*UnorderedListNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{14} +} + +func (x *UnorderedListNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *UnorderedListNode) GetIndent() int32 { + if x != nil { + return x.Indent + } + return 0 +} + +func (x *UnorderedListNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type TaskListNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Indent int32 `protobuf:"varint,2,opt,name=indent,proto3" json:"indent,omitempty"` + Complete bool `protobuf:"varint,3,opt,name=complete,proto3" json:"complete,omitempty"` + Children []*Node `protobuf:"bytes,4,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *TaskListNode) Reset() { + *x = TaskListNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TaskListNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskListNode) ProtoMessage() {} + +func (x *TaskListNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskListNode.ProtoReflect.Descriptor instead. +func (*TaskListNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{15} +} + +func (x *TaskListNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *TaskListNode) GetIndent() int32 { + if x != nil { + return x.Indent + } + return 0 +} + +func (x *TaskListNode) GetComplete() bool { + if x != nil { + return x.Complete + } + return false +} + +func (x *TaskListNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type MathBlockNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *MathBlockNode) Reset() { + *x = MathBlockNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MathBlockNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MathBlockNode) ProtoMessage() {} + +func (x *MathBlockNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MathBlockNode.ProtoReflect.Descriptor instead. +func (*MathBlockNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{16} +} + +func (x *MathBlockNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type TableNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Header []string `protobuf:"bytes,1,rep,name=header,proto3" json:"header,omitempty"` + Delimiter []string `protobuf:"bytes,2,rep,name=delimiter,proto3" json:"delimiter,omitempty"` + Rows []*TableNode_Row `protobuf:"bytes,3,rep,name=rows,proto3" json:"rows,omitempty"` +} + +func (x *TableNode) Reset() { + *x = TableNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TableNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TableNode) ProtoMessage() {} + +func (x *TableNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TableNode.ProtoReflect.Descriptor instead. +func (*TableNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{17} +} + +func (x *TableNode) GetHeader() []string { + if x != nil { + return x.Header + } + return nil +} + +func (x *TableNode) GetDelimiter() []string { + if x != nil { + return x.Delimiter + } + return nil +} + +func (x *TableNode) GetRows() []*TableNode_Row { + if x != nil { + return x.Rows + } + return nil +} + +type EmbeddedContentNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + Params string `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *EmbeddedContentNode) Reset() { + *x = EmbeddedContentNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EmbeddedContentNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EmbeddedContentNode) ProtoMessage() {} + +func (x *EmbeddedContentNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EmbeddedContentNode.ProtoReflect.Descriptor instead. +func (*EmbeddedContentNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{18} +} + +func (x *EmbeddedContentNode) GetResourceName() string { + if x != nil { + return x.ResourceName + } + return "" +} + +func (x *EmbeddedContentNode) GetParams() string { + if x != nil { + return x.Params + } + return "" +} + +type TextNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *TextNode) Reset() { + *x = TextNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TextNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TextNode) ProtoMessage() {} + +func (x *TextNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TextNode.ProtoReflect.Descriptor instead. +func (*TextNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{19} +} + +func (x *TextNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type BoldNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Children []*Node `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *BoldNode) Reset() { + *x = BoldNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BoldNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BoldNode) ProtoMessage() {} + +func (x *BoldNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BoldNode.ProtoReflect.Descriptor instead. +func (*BoldNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{20} +} + +func (x *BoldNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *BoldNode) GetChildren() []*Node { + if x != nil { + return x.Children + } + return nil +} + +type ItalicNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *ItalicNode) Reset() { + *x = ItalicNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ItalicNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ItalicNode) ProtoMessage() {} + +func (x *ItalicNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ItalicNode.ProtoReflect.Descriptor instead. +func (*ItalicNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{21} +} + +func (x *ItalicNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *ItalicNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type BoldItalicNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` + Content string `protobuf:"bytes,2,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *BoldItalicNode) Reset() { + *x = BoldItalicNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BoldItalicNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BoldItalicNode) ProtoMessage() {} + +func (x *BoldItalicNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BoldItalicNode.ProtoReflect.Descriptor instead. +func (*BoldItalicNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{22} +} + +func (x *BoldItalicNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +func (x *BoldItalicNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type CodeNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *CodeNode) Reset() { + *x = CodeNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CodeNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CodeNode) ProtoMessage() {} + +func (x *CodeNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CodeNode.ProtoReflect.Descriptor instead. +func (*CodeNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{23} +} + +func (x *CodeNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type ImageNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AltText string `protobuf:"bytes,1,opt,name=alt_text,json=altText,proto3" json:"alt_text,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *ImageNode) Reset() { + *x = ImageNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImageNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImageNode) ProtoMessage() {} + +func (x *ImageNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImageNode.ProtoReflect.Descriptor instead. +func (*ImageNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{24} +} + +func (x *ImageNode) GetAltText() string { + if x != nil { + return x.AltText + } + return "" +} + +func (x *ImageNode) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +type LinkNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Text string `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"` + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *LinkNode) Reset() { + *x = LinkNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinkNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinkNode) ProtoMessage() {} + +func (x *LinkNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinkNode.ProtoReflect.Descriptor instead. +func (*LinkNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{25} +} + +func (x *LinkNode) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +func (x *LinkNode) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +type AutoLinkNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + IsRawText bool `protobuf:"varint,2,opt,name=is_raw_text,json=isRawText,proto3" json:"is_raw_text,omitempty"` +} + +func (x *AutoLinkNode) Reset() { + *x = AutoLinkNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AutoLinkNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoLinkNode) ProtoMessage() {} + +func (x *AutoLinkNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoLinkNode.ProtoReflect.Descriptor instead. +func (*AutoLinkNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{26} +} + +func (x *AutoLinkNode) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *AutoLinkNode) GetIsRawText() bool { + if x != nil { + return x.IsRawText + } + return false +} + +type TagNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *TagNode) Reset() { + *x = TagNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TagNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TagNode) ProtoMessage() {} + +func (x *TagNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TagNode.ProtoReflect.Descriptor instead. +func (*TagNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{27} +} + +func (x *TagNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type StrikethroughNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *StrikethroughNode) Reset() { + *x = StrikethroughNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StrikethroughNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StrikethroughNode) ProtoMessage() {} + +func (x *StrikethroughNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StrikethroughNode.ProtoReflect.Descriptor instead. +func (*StrikethroughNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{28} +} + +func (x *StrikethroughNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type EscapingCharacterNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Symbol string `protobuf:"bytes,1,opt,name=symbol,proto3" json:"symbol,omitempty"` +} + +func (x *EscapingCharacterNode) Reset() { + *x = EscapingCharacterNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EscapingCharacterNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EscapingCharacterNode) ProtoMessage() {} + +func (x *EscapingCharacterNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EscapingCharacterNode.ProtoReflect.Descriptor instead. +func (*EscapingCharacterNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{29} +} + +func (x *EscapingCharacterNode) GetSymbol() string { + if x != nil { + return x.Symbol + } + return "" +} + +type MathNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *MathNode) Reset() { + *x = MathNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MathNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MathNode) ProtoMessage() {} + +func (x *MathNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MathNode.ProtoReflect.Descriptor instead. +func (*MathNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{30} +} + +func (x *MathNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type HighlightNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *HighlightNode) Reset() { + *x = HighlightNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HighlightNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HighlightNode) ProtoMessage() {} + +func (x *HighlightNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HighlightNode.ProtoReflect.Descriptor instead. +func (*HighlightNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{31} +} + +func (x *HighlightNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type SubscriptNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *SubscriptNode) Reset() { + *x = SubscriptNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscriptNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscriptNode) ProtoMessage() {} + +func (x *SubscriptNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscriptNode.ProtoReflect.Descriptor instead. +func (*SubscriptNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{32} +} + +func (x *SubscriptNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type SuperscriptNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *SuperscriptNode) Reset() { + *x = SuperscriptNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SuperscriptNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SuperscriptNode) ProtoMessage() {} + +func (x *SuperscriptNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SuperscriptNode.ProtoReflect.Descriptor instead. +func (*SuperscriptNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{33} +} + +func (x *SuperscriptNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type ReferencedContentNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"` + Params string `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *ReferencedContentNode) Reset() { + *x = ReferencedContentNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReferencedContentNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReferencedContentNode) ProtoMessage() {} + +func (x *ReferencedContentNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReferencedContentNode.ProtoReflect.Descriptor instead. +func (*ReferencedContentNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{34} +} + +func (x *ReferencedContentNode) GetResourceName() string { + if x != nil { + return x.ResourceName + } + return "" +} + +func (x *ReferencedContentNode) GetParams() string { + if x != nil { + return x.Params + } + return "" +} + +type SpoilerNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"` +} + +func (x *SpoilerNode) Reset() { + *x = SpoilerNode{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SpoilerNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SpoilerNode) ProtoMessage() {} + +func (x *SpoilerNode) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SpoilerNode.ProtoReflect.Descriptor instead. +func (*SpoilerNode) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{35} +} + +func (x *SpoilerNode) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +type TableNode_Row struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cells []string `protobuf:"bytes,1,rep,name=cells,proto3" json:"cells,omitempty"` +} + +func (x *TableNode_Row) Reset() { + *x = TableNode_Row{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_markdown_service_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TableNode_Row) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TableNode_Row) ProtoMessage() {} + +func (x *TableNode_Row) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_markdown_service_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TableNode_Row.ProtoReflect.Descriptor instead. +func (*TableNode_Row) Descriptor() ([]byte, []int) { + return file_api_v1_markdown_service_proto_rawDescGZIP(), []int{17, 0} +} + +func (x *TableNode_Row) GetCells() []string { + if x != nil { + return x.Cells + } + return nil +} + +var File_api_v1_markdown_service_proto protoreflect.FileDescriptor + +var file_api_v1_markdown_service_proto_rawDesc = []byte{ + 0x0a, 0x1d, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, + 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x32, 0x0a, 0x14, 0x50, + 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, + 0x41, 0x0a, 0x15, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x22, 0x42, 0x0a, 0x16, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, + 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x17, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x5c, 0x0a, 0x0c, 0x4c, + 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, + 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, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x9f, 0x10, 0x0a, 0x04, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, + 0x0a, 0x0f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6c, 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, + 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x63, + 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4e, + 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x54, 0x0a, 0x14, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x48, 0x00, 0x52, 0x12, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, + 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x0e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x51, + 0x0a, 0x13, 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x11, + 0x75, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, + 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x6d, + 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x38, 0x0a, 0x0a, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x57, 0x0a, 0x15, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x13, 0x65, 0x6d, 0x62, 0x65, + 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x35, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x08, 0x74, 0x65, + 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x62, 0x6f, 0x6c, 0x64, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x62, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0a, + 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x48, 0x0a, 0x10, 0x62, 0x6f, + 0x6c, 0x64, 0x5f, 0x69, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, + 0x64, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x62, 0x6f, 0x6c, 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x08, 0x63, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x42, 0x0a, 0x0e, + 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x0c, 0x61, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x67, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x16, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x07, 0x74, 0x61, 0x67, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x73, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, + 0x72, 0x6f, 0x75, 0x67, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x72, 0x69, 0x6b, 0x65, 0x74, 0x68, 0x72, 0x6f, 0x75, + 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, + 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, + 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x15, + 0x65, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x35, 0x0a, 0x09, 0x6d, 0x61, 0x74, 0x68, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x64, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x74, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, + 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x44, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x4a, 0x0a, 0x10, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x1c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x5d, 0x0a, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x15, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x4c, + 0x69, 0x6e, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x3f, 0x0a, 0x0d, + 0x50, 0x61, 0x72, 0x61, 0x67, 0x72, 0x61, 0x70, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x45, 0x0a, + 0x0d, 0x43, 0x6f, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x22, 0x53, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x12, 0x48, 0x6f, 0x72, + 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x75, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x40, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x71, 0x0a, 0x0f, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x08, + 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x73, 0x0a, 0x11, + 0x55, 0x6e, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x22, 0x8a, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x29, + 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x09, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, + 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x1a, 0x1b, + 0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x63, 0x65, 0x6c, 0x6c, 0x73, 0x22, 0x52, 0x0a, 0x13, 0x45, + 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, + 0x24, 0x0a, 0x08, 0x54, 0x65, 0x78, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x52, 0x0a, 0x08, 0x42, 0x6f, 0x6c, 0x64, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x2e, 0x0a, 0x08, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x3e, 0x0a, 0x0a, 0x49, 0x74, 0x61, + 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x42, 0x0a, 0x0e, 0x42, 0x6f, 0x6c, + 0x64, 0x49, 0x74, 0x61, 0x6c, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, + 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, + 0x08, 0x43, 0x6f, 0x64, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0x38, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x74, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x74, 0x54, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x30, 0x0a, + 0x08, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, + 0x40, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x1e, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x52, 0x61, 0x77, 0x54, 0x65, 0x78, + 0x74, 0x22, 0x23, 0x0a, 0x07, 0x54, 0x61, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x69, 0x6b, 0x65, + 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x0a, 0x15, 0x45, 0x73, 0x63, 0x61, 0x70, 0x69, 0x6e, + 0x67, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x22, 0x24, 0x0a, 0x08, 0x4d, 0x61, 0x74, 0x68, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0d, + 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x2b, 0x0a, 0x0f, 0x53, 0x75, 0x70, 0x65, 0x72, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, + 0x54, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x0b, 0x53, 0x70, 0x6f, 0x69, 0x6c, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2a, 0xd8, + 0x03, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4e, + 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x52, 0x45, 0x41, 0x4b, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x41, 0x52, 0x41, 0x47, 0x52, 0x41, 0x50, 0x48, 0x10, 0x02, + 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x03, + 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x13, 0x0a, + 0x0f, 0x48, 0x4f, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x54, 0x41, 0x4c, 0x5f, 0x52, 0x55, 0x4c, 0x45, + 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x51, 0x55, 0x4f, 0x54, 0x45, + 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, + 0x53, 0x54, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x45, + 0x44, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x41, 0x53, 0x4b, + 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x09, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x41, 0x54, 0x48, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x0a, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x41, 0x42, 0x4c, 0x45, + 0x10, 0x0b, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x4d, 0x42, 0x45, 0x44, 0x44, 0x45, 0x44, 0x5f, 0x43, + 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x0c, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, + 0x10, 0x0d, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x4f, 0x4c, 0x44, 0x10, 0x0e, 0x12, 0x0a, 0x0a, 0x06, + 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x0f, 0x0a, 0x0b, 0x42, 0x4f, 0x4c, 0x44, + 0x5f, 0x49, 0x54, 0x41, 0x4c, 0x49, 0x43, 0x10, 0x10, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0x11, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x10, 0x12, 0x12, 0x08, + 0x0a, 0x04, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x13, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x55, 0x54, 0x4f, + 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x10, 0x14, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x41, 0x47, 0x10, 0x15, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x52, 0x49, 0x4b, 0x45, 0x54, 0x48, 0x52, 0x4f, 0x55, 0x47, + 0x48, 0x10, 0x16, 0x12, 0x16, 0x0a, 0x12, 0x45, 0x53, 0x43, 0x41, 0x50, 0x49, 0x4e, 0x47, 0x5f, + 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x10, 0x17, 0x12, 0x08, 0x0a, 0x04, 0x4d, + 0x41, 0x54, 0x48, 0x10, 0x18, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x47, 0x48, 0x4c, 0x49, 0x47, + 0x48, 0x54, 0x10, 0x19, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, + 0x54, 0x10, 0x1a, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x43, 0x52, 0x49, + 0x50, 0x54, 0x10, 0x1b, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, + 0x45, 0x44, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x4e, 0x54, 0x10, 0x1c, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x50, 0x4f, 0x49, 0x4c, 0x45, 0x52, 0x10, 0x1d, 0x32, 0x91, 0x03, 0x0a, 0x0f, 0x4d, 0x61, + 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x7b, 0x0a, + 0x0d, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x22, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x72, 0x73, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, + 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, + 0x64, 0x6f, 0x77, 0x6e, 0x2f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x12, 0x83, 0x01, 0x0a, 0x0f, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x24, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, + 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x3a, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x24, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x2f, + 0x6c, 0x69, 0x6e, 0x6b, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0xac, 0x01, + 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x42, 0x14, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 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, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, + 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, + 0x31, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 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, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v1_markdown_service_proto_rawDescOnce sync.Once + file_api_v1_markdown_service_proto_rawDescData = file_api_v1_markdown_service_proto_rawDesc +) + +func file_api_v1_markdown_service_proto_rawDescGZIP() []byte { + file_api_v1_markdown_service_proto_rawDescOnce.Do(func() { + file_api_v1_markdown_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_markdown_service_proto_rawDescData) + }) + return file_api_v1_markdown_service_proto_rawDescData +} + +var file_api_v1_markdown_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_api_v1_markdown_service_proto_msgTypes = make([]protoimpl.MessageInfo, 37) +var file_api_v1_markdown_service_proto_goTypes = []interface{}{ + (NodeType)(0), // 0: memos.api.v1.NodeType + (*ParseMarkdownRequest)(nil), // 1: memos.api.v1.ParseMarkdownRequest + (*ParseMarkdownResponse)(nil), // 2: memos.api.v1.ParseMarkdownResponse + (*RestoreMarkdownRequest)(nil), // 3: memos.api.v1.RestoreMarkdownRequest + (*RestoreMarkdownResponse)(nil), // 4: memos.api.v1.RestoreMarkdownResponse + (*GetLinkMetadataRequest)(nil), // 5: memos.api.v1.GetLinkMetadataRequest + (*LinkMetadata)(nil), // 6: memos.api.v1.LinkMetadata + (*Node)(nil), // 7: memos.api.v1.Node + (*LineBreakNode)(nil), // 8: memos.api.v1.LineBreakNode + (*ParagraphNode)(nil), // 9: memos.api.v1.ParagraphNode + (*CodeBlockNode)(nil), // 10: memos.api.v1.CodeBlockNode + (*HeadingNode)(nil), // 11: memos.api.v1.HeadingNode + (*HorizontalRuleNode)(nil), // 12: memos.api.v1.HorizontalRuleNode + (*BlockquoteNode)(nil), // 13: memos.api.v1.BlockquoteNode + (*OrderedListNode)(nil), // 14: memos.api.v1.OrderedListNode + (*UnorderedListNode)(nil), // 15: memos.api.v1.UnorderedListNode + (*TaskListNode)(nil), // 16: memos.api.v1.TaskListNode + (*MathBlockNode)(nil), // 17: memos.api.v1.MathBlockNode + (*TableNode)(nil), // 18: memos.api.v1.TableNode + (*EmbeddedContentNode)(nil), // 19: memos.api.v1.EmbeddedContentNode + (*TextNode)(nil), // 20: memos.api.v1.TextNode + (*BoldNode)(nil), // 21: memos.api.v1.BoldNode + (*ItalicNode)(nil), // 22: memos.api.v1.ItalicNode + (*BoldItalicNode)(nil), // 23: memos.api.v1.BoldItalicNode + (*CodeNode)(nil), // 24: memos.api.v1.CodeNode + (*ImageNode)(nil), // 25: memos.api.v1.ImageNode + (*LinkNode)(nil), // 26: memos.api.v1.LinkNode + (*AutoLinkNode)(nil), // 27: memos.api.v1.AutoLinkNode + (*TagNode)(nil), // 28: memos.api.v1.TagNode + (*StrikethroughNode)(nil), // 29: memos.api.v1.StrikethroughNode + (*EscapingCharacterNode)(nil), // 30: memos.api.v1.EscapingCharacterNode + (*MathNode)(nil), // 31: memos.api.v1.MathNode + (*HighlightNode)(nil), // 32: memos.api.v1.HighlightNode + (*SubscriptNode)(nil), // 33: memos.api.v1.SubscriptNode + (*SuperscriptNode)(nil), // 34: memos.api.v1.SuperscriptNode + (*ReferencedContentNode)(nil), // 35: memos.api.v1.ReferencedContentNode + (*SpoilerNode)(nil), // 36: memos.api.v1.SpoilerNode + (*TableNode_Row)(nil), // 37: memos.api.v1.TableNode.Row +} +var file_api_v1_markdown_service_proto_depIdxs = []int32{ + 7, // 0: memos.api.v1.ParseMarkdownResponse.nodes:type_name -> memos.api.v1.Node + 7, // 1: memos.api.v1.RestoreMarkdownRequest.nodes:type_name -> memos.api.v1.Node + 0, // 2: memos.api.v1.Node.type:type_name -> memos.api.v1.NodeType + 8, // 3: memos.api.v1.Node.line_break_node:type_name -> memos.api.v1.LineBreakNode + 9, // 4: memos.api.v1.Node.paragraph_node:type_name -> memos.api.v1.ParagraphNode + 10, // 5: memos.api.v1.Node.code_block_node:type_name -> memos.api.v1.CodeBlockNode + 11, // 6: memos.api.v1.Node.heading_node:type_name -> memos.api.v1.HeadingNode + 12, // 7: memos.api.v1.Node.horizontal_rule_node:type_name -> memos.api.v1.HorizontalRuleNode + 13, // 8: memos.api.v1.Node.blockquote_node:type_name -> memos.api.v1.BlockquoteNode + 14, // 9: memos.api.v1.Node.ordered_list_node:type_name -> memos.api.v1.OrderedListNode + 15, // 10: memos.api.v1.Node.unordered_list_node:type_name -> memos.api.v1.UnorderedListNode + 16, // 11: memos.api.v1.Node.task_list_node:type_name -> memos.api.v1.TaskListNode + 17, // 12: memos.api.v1.Node.math_block_node:type_name -> memos.api.v1.MathBlockNode + 18, // 13: memos.api.v1.Node.table_node:type_name -> memos.api.v1.TableNode + 19, // 14: memos.api.v1.Node.embedded_content_node:type_name -> memos.api.v1.EmbeddedContentNode + 20, // 15: memos.api.v1.Node.text_node:type_name -> memos.api.v1.TextNode + 21, // 16: memos.api.v1.Node.bold_node:type_name -> memos.api.v1.BoldNode + 22, // 17: memos.api.v1.Node.italic_node:type_name -> memos.api.v1.ItalicNode + 23, // 18: memos.api.v1.Node.bold_italic_node:type_name -> memos.api.v1.BoldItalicNode + 24, // 19: memos.api.v1.Node.code_node:type_name -> memos.api.v1.CodeNode + 25, // 20: memos.api.v1.Node.image_node:type_name -> memos.api.v1.ImageNode + 26, // 21: memos.api.v1.Node.link_node:type_name -> memos.api.v1.LinkNode + 27, // 22: memos.api.v1.Node.auto_link_node:type_name -> memos.api.v1.AutoLinkNode + 28, // 23: memos.api.v1.Node.tag_node:type_name -> memos.api.v1.TagNode + 29, // 24: memos.api.v1.Node.strikethrough_node:type_name -> memos.api.v1.StrikethroughNode + 30, // 25: memos.api.v1.Node.escaping_character_node:type_name -> memos.api.v1.EscapingCharacterNode + 31, // 26: memos.api.v1.Node.math_node:type_name -> memos.api.v1.MathNode + 32, // 27: memos.api.v1.Node.highlight_node:type_name -> memos.api.v1.HighlightNode + 33, // 28: memos.api.v1.Node.subscript_node:type_name -> memos.api.v1.SubscriptNode + 34, // 29: memos.api.v1.Node.superscript_node:type_name -> memos.api.v1.SuperscriptNode + 35, // 30: memos.api.v1.Node.referenced_content_node:type_name -> memos.api.v1.ReferencedContentNode + 36, // 31: memos.api.v1.Node.spoiler_node:type_name -> memos.api.v1.SpoilerNode + 7, // 32: memos.api.v1.ParagraphNode.children:type_name -> memos.api.v1.Node + 7, // 33: memos.api.v1.HeadingNode.children:type_name -> memos.api.v1.Node + 7, // 34: memos.api.v1.BlockquoteNode.children:type_name -> memos.api.v1.Node + 7, // 35: memos.api.v1.OrderedListNode.children:type_name -> memos.api.v1.Node + 7, // 36: memos.api.v1.UnorderedListNode.children:type_name -> memos.api.v1.Node + 7, // 37: memos.api.v1.TaskListNode.children:type_name -> memos.api.v1.Node + 37, // 38: memos.api.v1.TableNode.rows:type_name -> memos.api.v1.TableNode.Row + 7, // 39: memos.api.v1.BoldNode.children:type_name -> memos.api.v1.Node + 1, // 40: memos.api.v1.MarkdownService.ParseMarkdown:input_type -> memos.api.v1.ParseMarkdownRequest + 3, // 41: memos.api.v1.MarkdownService.RestoreMarkdown:input_type -> memos.api.v1.RestoreMarkdownRequest + 5, // 42: memos.api.v1.MarkdownService.GetLinkMetadata:input_type -> memos.api.v1.GetLinkMetadataRequest + 2, // 43: memos.api.v1.MarkdownService.ParseMarkdown:output_type -> memos.api.v1.ParseMarkdownResponse + 4, // 44: memos.api.v1.MarkdownService.RestoreMarkdown:output_type -> memos.api.v1.RestoreMarkdownResponse + 6, // 45: memos.api.v1.MarkdownService.GetLinkMetadata:output_type -> memos.api.v1.LinkMetadata + 43, // [43:46] is the sub-list for method output_type + 40, // [40:43] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name +} + +func init() { file_api_v1_markdown_service_proto_init() } +func file_api_v1_markdown_service_proto_init() { + if File_api_v1_markdown_service_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_api_v1_markdown_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParseMarkdownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParseMarkdownResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreMarkdownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RestoreMarkdownResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLinkMetadataRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Node); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LineBreakNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ParagraphNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeBlockNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HeadingNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HorizontalRuleNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BlockquoteNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OrderedListNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnorderedListNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskListNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MathBlockNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TableNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EmbeddedContentNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TextNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BoldNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ItalicNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BoldItalicNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CodeNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImageNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AutoLinkNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TagNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StrikethroughNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EscapingCharacterNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MathNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HighlightNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscriptNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SuperscriptNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReferencedContentNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SpoilerNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_markdown_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TableNode_Row); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_api_v1_markdown_service_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*Node_LineBreakNode)(nil), + (*Node_ParagraphNode)(nil), + (*Node_CodeBlockNode)(nil), + (*Node_HeadingNode)(nil), + (*Node_HorizontalRuleNode)(nil), + (*Node_BlockquoteNode)(nil), + (*Node_OrderedListNode)(nil), + (*Node_UnorderedListNode)(nil), + (*Node_TaskListNode)(nil), + (*Node_MathBlockNode)(nil), + (*Node_TableNode)(nil), + (*Node_EmbeddedContentNode)(nil), + (*Node_TextNode)(nil), + (*Node_BoldNode)(nil), + (*Node_ItalicNode)(nil), + (*Node_BoldItalicNode)(nil), + (*Node_CodeNode)(nil), + (*Node_ImageNode)(nil), + (*Node_LinkNode)(nil), + (*Node_AutoLinkNode)(nil), + (*Node_TagNode)(nil), + (*Node_StrikethroughNode)(nil), + (*Node_EscapingCharacterNode)(nil), + (*Node_MathNode)(nil), + (*Node_HighlightNode)(nil), + (*Node_SubscriptNode)(nil), + (*Node_SuperscriptNode)(nil), + (*Node_ReferencedContentNode)(nil), + (*Node_SpoilerNode)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v1_markdown_service_proto_rawDesc, + NumEnums: 1, + NumMessages: 37, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v1_markdown_service_proto_goTypes, + DependencyIndexes: file_api_v1_markdown_service_proto_depIdxs, + EnumInfos: file_api_v1_markdown_service_proto_enumTypes, + MessageInfos: file_api_v1_markdown_service_proto_msgTypes, + }.Build() + File_api_v1_markdown_service_proto = out.File + file_api_v1_markdown_service_proto_rawDesc = nil + file_api_v1_markdown_service_proto_goTypes = nil + file_api_v1_markdown_service_proto_depIdxs = nil +} diff --git a/proto/gen/api/v1/markdown_service.pb.gw.go b/proto/gen/api/v1/markdown_service.pb.gw.go new file mode 100644 index 000000000..ee5f04e27 --- /dev/null +++ b/proto/gen/api/v1/markdown_service.pb.gw.go @@ -0,0 +1,327 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: api/v1/markdown_service.proto + +/* +Package apiv1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package apiv1 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_MarkdownService_ParseMarkdown_0(ctx context.Context, marshaler runtime.Marshaler, client MarkdownServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ParseMarkdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ParseMarkdown(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MarkdownService_ParseMarkdown_0(ctx context.Context, marshaler runtime.Marshaler, server MarkdownServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ParseMarkdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ParseMarkdown(ctx, &protoReq) + return msg, metadata, err + +} + +func request_MarkdownService_RestoreMarkdown_0(ctx context.Context, marshaler runtime.Marshaler, client MarkdownServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreMarkdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RestoreMarkdown(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MarkdownService_RestoreMarkdown_0(ctx context.Context, marshaler runtime.Marshaler, server MarkdownServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreMarkdownRequest + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RestoreMarkdown(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_MarkdownService_GetLinkMetadata_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_MarkdownService_GetLinkMetadata_0(ctx context.Context, marshaler runtime.Marshaler, client MarkdownServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetLinkMetadataRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MarkdownService_GetLinkMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetLinkMetadata(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_MarkdownService_GetLinkMetadata_0(ctx context.Context, marshaler runtime.Marshaler, server MarkdownServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetLinkMetadataRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MarkdownService_GetLinkMetadata_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetLinkMetadata(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterMarkdownServiceHandlerServer registers the http handlers for service MarkdownService to "mux". +// UnaryRPC :call MarkdownServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMarkdownServiceHandlerFromEndpoint instead. +func RegisterMarkdownServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server MarkdownServiceServer) error { + + mux.Handle("POST", pattern_MarkdownService_ParseMarkdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MarkdownService/ParseMarkdown", runtime.WithHTTPPathPattern("/api/v1/markdown/parse")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MarkdownService_ParseMarkdown_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_ParseMarkdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MarkdownService_RestoreMarkdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MarkdownService/RestoreMarkdown", runtime.WithHTTPPathPattern("/api/v1/markdown:restore")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MarkdownService_RestoreMarkdown_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_RestoreMarkdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_MarkdownService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MarkdownService/GetLinkMetadata", runtime.WithHTTPPathPattern("/api/v1/markdown/link:metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_MarkdownService_GetLinkMetadata_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_GetLinkMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterMarkdownServiceHandlerFromEndpoint is same as RegisterMarkdownServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterMarkdownServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterMarkdownServiceHandler(ctx, mux, conn) +} + +// RegisterMarkdownServiceHandler registers the http handlers for service MarkdownService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterMarkdownServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterMarkdownServiceHandlerClient(ctx, mux, NewMarkdownServiceClient(conn)) +} + +// RegisterMarkdownServiceHandlerClient registers the http handlers for service MarkdownService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MarkdownServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MarkdownServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "MarkdownServiceClient" to call the correct interceptors. +func RegisterMarkdownServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MarkdownServiceClient) error { + + mux.Handle("POST", pattern_MarkdownService_ParseMarkdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MarkdownService/ParseMarkdown", runtime.WithHTTPPathPattern("/api/v1/markdown/parse")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MarkdownService_ParseMarkdown_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_ParseMarkdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_MarkdownService_RestoreMarkdown_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MarkdownService/RestoreMarkdown", runtime.WithHTTPPathPattern("/api/v1/markdown:restore")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MarkdownService_RestoreMarkdown_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_RestoreMarkdown_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_MarkdownService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MarkdownService/GetLinkMetadata", runtime.WithHTTPPathPattern("/api/v1/markdown/link:metadata")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_MarkdownService_GetLinkMetadata_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_MarkdownService_GetLinkMetadata_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_MarkdownService_ParseMarkdown_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "markdown", "parse"}, "")) + + pattern_MarkdownService_RestoreMarkdown_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "markdown"}, "restore")) + + pattern_MarkdownService_GetLinkMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v1", "markdown", "link"}, "metadata")) +) + +var ( + forward_MarkdownService_ParseMarkdown_0 = runtime.ForwardResponseMessage + + forward_MarkdownService_RestoreMarkdown_0 = runtime.ForwardResponseMessage + + forward_MarkdownService_GetLinkMetadata_0 = runtime.ForwardResponseMessage +) diff --git a/proto/gen/api/v1/markdown_service_grpc.pb.go b/proto/gen/api/v1/markdown_service_grpc.pb.go new file mode 100644 index 000000000..daa72a64d --- /dev/null +++ b/proto/gen/api/v1/markdown_service_grpc.pb.go @@ -0,0 +1,189 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: api/v1/markdown_service.proto + +package apiv1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + MarkdownService_ParseMarkdown_FullMethodName = "/memos.api.v1.MarkdownService/ParseMarkdown" + MarkdownService_RestoreMarkdown_FullMethodName = "/memos.api.v1.MarkdownService/RestoreMarkdown" + MarkdownService_GetLinkMetadata_FullMethodName = "/memos.api.v1.MarkdownService/GetLinkMetadata" +) + +// MarkdownServiceClient is the client API for MarkdownService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MarkdownServiceClient interface { + // Parses the given markdown content and returns a list of nodes. + ParseMarkdown(ctx context.Context, in *ParseMarkdownRequest, opts ...grpc.CallOption) (*ParseMarkdownResponse, error) + // Restores the given nodes to markdown content. + RestoreMarkdown(ctx context.Context, in *RestoreMarkdownRequest, opts ...grpc.CallOption) (*RestoreMarkdownResponse, error) + // GetLinkMetadata returns metadata for a given link. + GetLinkMetadata(ctx context.Context, in *GetLinkMetadataRequest, opts ...grpc.CallOption) (*LinkMetadata, error) +} + +type markdownServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMarkdownServiceClient(cc grpc.ClientConnInterface) MarkdownServiceClient { + return &markdownServiceClient{cc} +} + +func (c *markdownServiceClient) ParseMarkdown(ctx context.Context, in *ParseMarkdownRequest, opts ...grpc.CallOption) (*ParseMarkdownResponse, error) { + out := new(ParseMarkdownResponse) + err := c.cc.Invoke(ctx, MarkdownService_ParseMarkdown_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *markdownServiceClient) RestoreMarkdown(ctx context.Context, in *RestoreMarkdownRequest, opts ...grpc.CallOption) (*RestoreMarkdownResponse, error) { + out := new(RestoreMarkdownResponse) + err := c.cc.Invoke(ctx, MarkdownService_RestoreMarkdown_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *markdownServiceClient) GetLinkMetadata(ctx context.Context, in *GetLinkMetadataRequest, opts ...grpc.CallOption) (*LinkMetadata, error) { + out := new(LinkMetadata) + err := c.cc.Invoke(ctx, MarkdownService_GetLinkMetadata_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MarkdownServiceServer is the server API for MarkdownService service. +// All implementations must embed UnimplementedMarkdownServiceServer +// for forward compatibility +type MarkdownServiceServer interface { + // Parses the given markdown content and returns a list of nodes. + ParseMarkdown(context.Context, *ParseMarkdownRequest) (*ParseMarkdownResponse, error) + // Restores the given nodes to markdown content. + RestoreMarkdown(context.Context, *RestoreMarkdownRequest) (*RestoreMarkdownResponse, error) + // GetLinkMetadata returns metadata for a given link. + GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*LinkMetadata, error) + mustEmbedUnimplementedMarkdownServiceServer() +} + +// UnimplementedMarkdownServiceServer must be embedded to have forward compatible implementations. +type UnimplementedMarkdownServiceServer struct { +} + +func (UnimplementedMarkdownServiceServer) ParseMarkdown(context.Context, *ParseMarkdownRequest) (*ParseMarkdownResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ParseMarkdown not implemented") +} +func (UnimplementedMarkdownServiceServer) RestoreMarkdown(context.Context, *RestoreMarkdownRequest) (*RestoreMarkdownResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreMarkdown not implemented") +} +func (UnimplementedMarkdownServiceServer) GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*LinkMetadata, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLinkMetadata not implemented") +} +func (UnimplementedMarkdownServiceServer) mustEmbedUnimplementedMarkdownServiceServer() {} + +// UnsafeMarkdownServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MarkdownServiceServer will +// result in compilation errors. +type UnsafeMarkdownServiceServer interface { + mustEmbedUnimplementedMarkdownServiceServer() +} + +func RegisterMarkdownServiceServer(s grpc.ServiceRegistrar, srv MarkdownServiceServer) { + s.RegisterService(&MarkdownService_ServiceDesc, srv) +} + +func _MarkdownService_ParseMarkdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ParseMarkdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarkdownServiceServer).ParseMarkdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MarkdownService_ParseMarkdown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarkdownServiceServer).ParseMarkdown(ctx, req.(*ParseMarkdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MarkdownService_RestoreMarkdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RestoreMarkdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarkdownServiceServer).RestoreMarkdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MarkdownService_RestoreMarkdown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarkdownServiceServer).RestoreMarkdown(ctx, req.(*RestoreMarkdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _MarkdownService_GetLinkMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetLinkMetadataRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MarkdownServiceServer).GetLinkMetadata(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: MarkdownService_GetLinkMetadata_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MarkdownServiceServer).GetLinkMetadata(ctx, req.(*GetLinkMetadataRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// MarkdownService_ServiceDesc is the grpc.ServiceDesc for MarkdownService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MarkdownService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "memos.api.v1.MarkdownService", + HandlerType: (*MarkdownServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ParseMarkdown", + Handler: _MarkdownService_ParseMarkdown_Handler, + }, + { + MethodName: "RestoreMarkdown", + Handler: _MarkdownService_RestoreMarkdown_Handler, + }, + { + MethodName: "GetLinkMetadata", + Handler: _MarkdownService_GetLinkMetadata_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api/v1/markdown_service.proto", +} diff --git a/proto/gen/api/v1/memo_service.pb.go b/proto/gen/api/v1/memo_service.pb.go index 6fdc9c94e..2cb40b930 100644 --- a/proto/gen/api/v1/memo_service.pb.go +++ b/proto/gen/api/v1/memo_service.pb.go @@ -93,14 +93,15 @@ type Memo struct { Creator string `protobuf:"bytes,4,opt,name=creator,proto3" json:"creator,omitempty"` CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` - DisplayTime *timestamppb.Timestamp `protobuf:"bytes,78,opt,name=display_time,json=displayTime,proto3" json:"display_time,omitempty"` + DisplayTime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=display_time,json=displayTime,proto3" json:"display_time,omitempty"` Content string `protobuf:"bytes,8,opt,name=content,proto3" json:"content,omitempty"` - Visibility Visibility `protobuf:"varint,9,opt,name=visibility,proto3,enum=memos.api.v1.Visibility" json:"visibility,omitempty"` - Pinned bool `protobuf:"varint,10,opt,name=pinned,proto3" json:"pinned,omitempty"` - ParentId *int32 `protobuf:"varint,11,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` - Resources []*Resource `protobuf:"bytes,12,rep,name=resources,proto3" json:"resources,omitempty"` - Relations []*MemoRelation `protobuf:"bytes,13,rep,name=relations,proto3" json:"relations,omitempty"` - Reactions []*Reaction `protobuf:"bytes,14,rep,name=reactions,proto3" json:"reactions,omitempty"` + Nodes []*Node `protobuf:"bytes,9,rep,name=nodes,proto3" json:"nodes,omitempty"` + Visibility Visibility `protobuf:"varint,10,opt,name=visibility,proto3,enum=memos.api.v1.Visibility" json:"visibility,omitempty"` + Pinned bool `protobuf:"varint,11,opt,name=pinned,proto3" json:"pinned,omitempty"` + ParentId *int32 `protobuf:"varint,12,opt,name=parent_id,json=parentId,proto3,oneof" json:"parent_id,omitempty"` + Resources []*Resource `protobuf:"bytes,13,rep,name=resources,proto3" json:"resources,omitempty"` + Relations []*MemoRelation `protobuf:"bytes,14,rep,name=relations,proto3" json:"relations,omitempty"` + Reactions []*Reaction `protobuf:"bytes,15,rep,name=reactions,proto3" json:"reactions,omitempty"` } func (x *Memo) Reset() { @@ -191,6 +192,13 @@ func (x *Memo) GetContent() string { return "" } +func (x *Memo) GetNodes() []*Node { + if x != nil { + return x.Nodes + } + return nil +} + func (x *Memo) GetVisibility() Visibility { if x != nil { return x.Visibility @@ -1540,344 +1548,349 @@ var file_api_v1_memo_service_proto_rawDesc = []byte{ 0x0a, 0x19, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1d, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, + 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1d, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, - 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 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, 0x8d, 0x05, 0x0a, 0x04, 0x4d, 0x65, 0x6d, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x77, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 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, 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, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x4e, 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, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x25, - 0x0a, 0x09, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x3d, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x39, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, - 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x22, 0x66, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x65, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, - 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, - 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0x2c, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x3f, - 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x22, - 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x78, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x65, - 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x04, 0x6d, 0x65, - 0x6d, 0x6f, 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, - 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x2c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2e, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 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, 0x51, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, - 0x67, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 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, 0x12, 0x38, - 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x6f, 0x1a, 0x1d, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1d, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 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, 0xbc, 0x05, 0x0a, 0x04, 0x4d, 0x65, 0x6d, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x77, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x09, 0x72, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 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, 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, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 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, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, + 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x09, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x08, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x03, + 0xe0, 0x41, 0x03, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3d, + 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 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, 0x55, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x69, 0x0a, 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x74, 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, - 0x39, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 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, 0x44, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x22, - 0x62, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, - 0x74, 0x61, 0x74, 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, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, - 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x48, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2e, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 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, 0x51, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, 0x0a, 0x19, 0x55, 0x70, 0x73, 0x65, - 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 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, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3c, 0x0a, - 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x50, 0x0a, 0x0a, 0x56, - 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x49, 0x53, - 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x4f, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x03, 0x32, 0xaa, 0x11, - 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, - 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, - 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, - 0x70, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x20, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, + 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x72, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, + 0x66, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x65, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, + 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2c, + 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x3f, 0x0a, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x12, 0x62, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x1c, 0x2e, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, - 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x25, - 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x7f, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x3c, 0xda, 0x41, 0x10, 0x6d, 0x65, 0x6d, - 0x6f, 0x2c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x23, 0x3a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x32, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, - 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x6c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0xda, - 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x73, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, - 0x6d, 0x6f, 0x73, 0x12, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, - 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x3a, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x53, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x25, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0xda, - 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x32, - 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x53, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0xda, - 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x32, - 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, - 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x37, 0xda, 0x41, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, - 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, - 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, - 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x22, 0x24, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x78, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x6f, + 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, 0x27, 0x0a, + 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x2c, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x22, 0x2f, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x63, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, + 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x51, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x67, 0x0a, + 0x17, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 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, 0x12, 0x38, 0x0a, 0x09, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2e, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 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, 0x55, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x69, 0x0a, + 0x18, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 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, 0x39, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 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, 0x44, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x05, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x22, 0x62, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, + 0x74, 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, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x22, 0x9f, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, + 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x48, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, - 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x26, 0xda, 0x41, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, - 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2e, - 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, - 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x38, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x2e, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 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, 0x51, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, 0x0a, 0x19, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 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, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x08, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3c, 0x0a, 0x19, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, + 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x50, 0x0a, 0x0a, 0x56, 0x69, 0x73, + 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1a, 0x0a, 0x16, 0x56, 0x49, 0x53, 0x49, 0x42, + 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x4f, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, + 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x03, 0x32, 0xaa, 0x11, 0x0a, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x18, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a, 0x22, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x63, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x70, 0x0a, + 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x12, 0x20, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, + 0x62, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x12, 0x1c, 0x2e, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x25, 0xda, 0x41, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2f, 0x2a, 0x7d, 0x12, 0x7f, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, + 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x3c, 0xda, 0x41, 0x10, 0x6d, 0x65, 0x6d, 0x6f, 0x2c, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x23, 0x3a, 0x04, 0x6d, 0x65, 0x6d, 0x6f, 0x32, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2f, 0x2a, 0x7d, 0x12, 0x6c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, + 0x6d, 0x6f, 0x12, 0x1f, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x25, 0xda, 0x41, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x2a, 0x16, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, + 0x2a, 0x7d, 0x12, 0x73, 0x0a, 0x0b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, + 0x73, 0x12, 0x20, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, + 0x2a, 0x22, 0x14, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x3a, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0xda, 0x41, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x32, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x89, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, - 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, - 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x12, + 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x32, 0xda, 0x41, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x32, 0x20, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, + 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x88, 0x01, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x26, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x6f, 0x22, 0x37, 0xda, 0x41, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4d, 0x65, 0x6d, 0x6f, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x26, 0xda, + 0x41, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, + 0x12, 0x13, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0xda, 0x41, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, + 0x2f, 0x2a, 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x89, 0x01, + 0x0a, 0x12, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0xda, 0x41, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x2a, 0x7d, 0x2f, + 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x12, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x35, 0xda, 0x41, 0x0b, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x31, 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x72, 0x65, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa8, 0x01, 0x0a, 0x10, 0x63, - 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, - 0x10, 0x4d, 0x65, 0x6d, 0x6f, 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, 0x31, 0x3b, - 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, - 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, - 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, - 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 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, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x35, 0xda, 0x41, 0x0b, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x2a, 0x1f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, + 0x2f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x72, 0x65, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa8, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, + 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x4d, + 0x65, 0x6d, 0x6f, 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, 0x31, 0x3b, 0x61, 0x70, + 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, + 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, + 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 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, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1925,74 +1938,76 @@ var file_api_v1_memo_service_proto_goTypes = []interface{}{ nil, // 27: memos.api.v1.GetUserMemosStatsResponse.StatsEntry (RowStatus)(0), // 28: memos.api.v1.RowStatus (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp - (*Resource)(nil), // 30: memos.api.v1.Resource - (*MemoRelation)(nil), // 31: memos.api.v1.MemoRelation - (*Reaction)(nil), // 32: memos.api.v1.Reaction - (*fieldmaskpb.FieldMask)(nil), // 33: google.protobuf.FieldMask - (*emptypb.Empty)(nil), // 34: google.protobuf.Empty + (*Node)(nil), // 30: memos.api.v1.Node + (*Resource)(nil), // 31: memos.api.v1.Resource + (*MemoRelation)(nil), // 32: memos.api.v1.MemoRelation + (*Reaction)(nil), // 33: memos.api.v1.Reaction + (*fieldmaskpb.FieldMask)(nil), // 34: google.protobuf.FieldMask + (*emptypb.Empty)(nil), // 35: google.protobuf.Empty } var file_api_v1_memo_service_proto_depIdxs = []int32{ 28, // 0: memos.api.v1.Memo.row_status:type_name -> memos.api.v1.RowStatus 29, // 1: memos.api.v1.Memo.create_time:type_name -> google.protobuf.Timestamp 29, // 2: memos.api.v1.Memo.update_time:type_name -> google.protobuf.Timestamp 29, // 3: memos.api.v1.Memo.display_time:type_name -> google.protobuf.Timestamp - 0, // 4: memos.api.v1.Memo.visibility:type_name -> memos.api.v1.Visibility - 30, // 5: memos.api.v1.Memo.resources:type_name -> memos.api.v1.Resource - 31, // 6: memos.api.v1.Memo.relations:type_name -> memos.api.v1.MemoRelation - 32, // 7: memos.api.v1.Memo.reactions:type_name -> memos.api.v1.Reaction - 0, // 8: memos.api.v1.CreateMemoRequest.visibility:type_name -> memos.api.v1.Visibility - 1, // 9: memos.api.v1.ListMemosResponse.memos:type_name -> memos.api.v1.Memo - 1, // 10: memos.api.v1.SearchMemosResponse.memos:type_name -> memos.api.v1.Memo - 1, // 11: memos.api.v1.UpdateMemoRequest.memo:type_name -> memos.api.v1.Memo - 33, // 12: memos.api.v1.UpdateMemoRequest.update_mask:type_name -> google.protobuf.FieldMask - 30, // 13: memos.api.v1.SetMemoResourcesRequest.resources:type_name -> memos.api.v1.Resource - 30, // 14: memos.api.v1.ListMemoResourcesResponse.resources:type_name -> memos.api.v1.Resource - 31, // 15: memos.api.v1.SetMemoRelationsRequest.relations:type_name -> memos.api.v1.MemoRelation - 31, // 16: memos.api.v1.ListMemoRelationsResponse.relations:type_name -> memos.api.v1.MemoRelation - 2, // 17: memos.api.v1.CreateMemoCommentRequest.comment:type_name -> memos.api.v1.CreateMemoRequest - 1, // 18: memos.api.v1.ListMemoCommentsResponse.memos:type_name -> memos.api.v1.Memo - 27, // 19: memos.api.v1.GetUserMemosStatsResponse.stats:type_name -> memos.api.v1.GetUserMemosStatsResponse.StatsEntry - 32, // 20: memos.api.v1.ListMemoReactionsResponse.reactions:type_name -> memos.api.v1.Reaction - 32, // 21: memos.api.v1.UpsertMemoReactionRequest.reaction:type_name -> memos.api.v1.Reaction - 2, // 22: memos.api.v1.MemoService.CreateMemo:input_type -> memos.api.v1.CreateMemoRequest - 3, // 23: memos.api.v1.MemoService.ListMemos:input_type -> memos.api.v1.ListMemosRequest - 5, // 24: memos.api.v1.MemoService.SearchMemos:input_type -> memos.api.v1.SearchMemosRequest - 7, // 25: memos.api.v1.MemoService.GetMemo:input_type -> memos.api.v1.GetMemoRequest - 8, // 26: memos.api.v1.MemoService.UpdateMemo:input_type -> memos.api.v1.UpdateMemoRequest - 9, // 27: memos.api.v1.MemoService.DeleteMemo:input_type -> memos.api.v1.DeleteMemoRequest - 10, // 28: memos.api.v1.MemoService.ExportMemos:input_type -> memos.api.v1.ExportMemosRequest - 12, // 29: memos.api.v1.MemoService.SetMemoResources:input_type -> memos.api.v1.SetMemoResourcesRequest - 13, // 30: memos.api.v1.MemoService.ListMemoResources:input_type -> memos.api.v1.ListMemoResourcesRequest - 15, // 31: memos.api.v1.MemoService.SetMemoRelations:input_type -> memos.api.v1.SetMemoRelationsRequest - 16, // 32: memos.api.v1.MemoService.ListMemoRelations:input_type -> memos.api.v1.ListMemoRelationsRequest - 18, // 33: memos.api.v1.MemoService.CreateMemoComment:input_type -> memos.api.v1.CreateMemoCommentRequest - 19, // 34: memos.api.v1.MemoService.ListMemoComments:input_type -> memos.api.v1.ListMemoCommentsRequest - 21, // 35: memos.api.v1.MemoService.GetUserMemosStats:input_type -> memos.api.v1.GetUserMemosStatsRequest - 23, // 36: memos.api.v1.MemoService.ListMemoReactions:input_type -> memos.api.v1.ListMemoReactionsRequest - 25, // 37: memos.api.v1.MemoService.UpsertMemoReaction:input_type -> memos.api.v1.UpsertMemoReactionRequest - 26, // 38: memos.api.v1.MemoService.DeleteMemoReaction:input_type -> memos.api.v1.DeleteMemoReactionRequest - 1, // 39: memos.api.v1.MemoService.CreateMemo:output_type -> memos.api.v1.Memo - 4, // 40: memos.api.v1.MemoService.ListMemos:output_type -> memos.api.v1.ListMemosResponse - 6, // 41: memos.api.v1.MemoService.SearchMemos:output_type -> memos.api.v1.SearchMemosResponse - 1, // 42: memos.api.v1.MemoService.GetMemo:output_type -> memos.api.v1.Memo - 1, // 43: memos.api.v1.MemoService.UpdateMemo:output_type -> memos.api.v1.Memo - 34, // 44: memos.api.v1.MemoService.DeleteMemo:output_type -> google.protobuf.Empty - 11, // 45: memos.api.v1.MemoService.ExportMemos:output_type -> memos.api.v1.ExportMemosResponse - 34, // 46: memos.api.v1.MemoService.SetMemoResources:output_type -> google.protobuf.Empty - 14, // 47: memos.api.v1.MemoService.ListMemoResources:output_type -> memos.api.v1.ListMemoResourcesResponse - 34, // 48: memos.api.v1.MemoService.SetMemoRelations:output_type -> google.protobuf.Empty - 17, // 49: memos.api.v1.MemoService.ListMemoRelations:output_type -> memos.api.v1.ListMemoRelationsResponse - 1, // 50: memos.api.v1.MemoService.CreateMemoComment:output_type -> memos.api.v1.Memo - 20, // 51: memos.api.v1.MemoService.ListMemoComments:output_type -> memos.api.v1.ListMemoCommentsResponse - 22, // 52: memos.api.v1.MemoService.GetUserMemosStats:output_type -> memos.api.v1.GetUserMemosStatsResponse - 24, // 53: memos.api.v1.MemoService.ListMemoReactions:output_type -> memos.api.v1.ListMemoReactionsResponse - 32, // 54: memos.api.v1.MemoService.UpsertMemoReaction:output_type -> memos.api.v1.Reaction - 34, // 55: memos.api.v1.MemoService.DeleteMemoReaction:output_type -> google.protobuf.Empty - 39, // [39:56] is the sub-list for method output_type - 22, // [22:39] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 30, // 4: memos.api.v1.Memo.nodes:type_name -> memos.api.v1.Node + 0, // 5: memos.api.v1.Memo.visibility:type_name -> memos.api.v1.Visibility + 31, // 6: memos.api.v1.Memo.resources:type_name -> memos.api.v1.Resource + 32, // 7: memos.api.v1.Memo.relations:type_name -> memos.api.v1.MemoRelation + 33, // 8: memos.api.v1.Memo.reactions:type_name -> memos.api.v1.Reaction + 0, // 9: memos.api.v1.CreateMemoRequest.visibility:type_name -> memos.api.v1.Visibility + 1, // 10: memos.api.v1.ListMemosResponse.memos:type_name -> memos.api.v1.Memo + 1, // 11: memos.api.v1.SearchMemosResponse.memos:type_name -> memos.api.v1.Memo + 1, // 12: memos.api.v1.UpdateMemoRequest.memo:type_name -> memos.api.v1.Memo + 34, // 13: memos.api.v1.UpdateMemoRequest.update_mask:type_name -> google.protobuf.FieldMask + 31, // 14: memos.api.v1.SetMemoResourcesRequest.resources:type_name -> memos.api.v1.Resource + 31, // 15: memos.api.v1.ListMemoResourcesResponse.resources:type_name -> memos.api.v1.Resource + 32, // 16: memos.api.v1.SetMemoRelationsRequest.relations:type_name -> memos.api.v1.MemoRelation + 32, // 17: memos.api.v1.ListMemoRelationsResponse.relations:type_name -> memos.api.v1.MemoRelation + 2, // 18: memos.api.v1.CreateMemoCommentRequest.comment:type_name -> memos.api.v1.CreateMemoRequest + 1, // 19: memos.api.v1.ListMemoCommentsResponse.memos:type_name -> memos.api.v1.Memo + 27, // 20: memos.api.v1.GetUserMemosStatsResponse.stats:type_name -> memos.api.v1.GetUserMemosStatsResponse.StatsEntry + 33, // 21: memos.api.v1.ListMemoReactionsResponse.reactions:type_name -> memos.api.v1.Reaction + 33, // 22: memos.api.v1.UpsertMemoReactionRequest.reaction:type_name -> memos.api.v1.Reaction + 2, // 23: memos.api.v1.MemoService.CreateMemo:input_type -> memos.api.v1.CreateMemoRequest + 3, // 24: memos.api.v1.MemoService.ListMemos:input_type -> memos.api.v1.ListMemosRequest + 5, // 25: memos.api.v1.MemoService.SearchMemos:input_type -> memos.api.v1.SearchMemosRequest + 7, // 26: memos.api.v1.MemoService.GetMemo:input_type -> memos.api.v1.GetMemoRequest + 8, // 27: memos.api.v1.MemoService.UpdateMemo:input_type -> memos.api.v1.UpdateMemoRequest + 9, // 28: memos.api.v1.MemoService.DeleteMemo:input_type -> memos.api.v1.DeleteMemoRequest + 10, // 29: memos.api.v1.MemoService.ExportMemos:input_type -> memos.api.v1.ExportMemosRequest + 12, // 30: memos.api.v1.MemoService.SetMemoResources:input_type -> memos.api.v1.SetMemoResourcesRequest + 13, // 31: memos.api.v1.MemoService.ListMemoResources:input_type -> memos.api.v1.ListMemoResourcesRequest + 15, // 32: memos.api.v1.MemoService.SetMemoRelations:input_type -> memos.api.v1.SetMemoRelationsRequest + 16, // 33: memos.api.v1.MemoService.ListMemoRelations:input_type -> memos.api.v1.ListMemoRelationsRequest + 18, // 34: memos.api.v1.MemoService.CreateMemoComment:input_type -> memos.api.v1.CreateMemoCommentRequest + 19, // 35: memos.api.v1.MemoService.ListMemoComments:input_type -> memos.api.v1.ListMemoCommentsRequest + 21, // 36: memos.api.v1.MemoService.GetUserMemosStats:input_type -> memos.api.v1.GetUserMemosStatsRequest + 23, // 37: memos.api.v1.MemoService.ListMemoReactions:input_type -> memos.api.v1.ListMemoReactionsRequest + 25, // 38: memos.api.v1.MemoService.UpsertMemoReaction:input_type -> memos.api.v1.UpsertMemoReactionRequest + 26, // 39: memos.api.v1.MemoService.DeleteMemoReaction:input_type -> memos.api.v1.DeleteMemoReactionRequest + 1, // 40: memos.api.v1.MemoService.CreateMemo:output_type -> memos.api.v1.Memo + 4, // 41: memos.api.v1.MemoService.ListMemos:output_type -> memos.api.v1.ListMemosResponse + 6, // 42: memos.api.v1.MemoService.SearchMemos:output_type -> memos.api.v1.SearchMemosResponse + 1, // 43: memos.api.v1.MemoService.GetMemo:output_type -> memos.api.v1.Memo + 1, // 44: memos.api.v1.MemoService.UpdateMemo:output_type -> memos.api.v1.Memo + 35, // 45: memos.api.v1.MemoService.DeleteMemo:output_type -> google.protobuf.Empty + 11, // 46: memos.api.v1.MemoService.ExportMemos:output_type -> memos.api.v1.ExportMemosResponse + 35, // 47: memos.api.v1.MemoService.SetMemoResources:output_type -> google.protobuf.Empty + 14, // 48: memos.api.v1.MemoService.ListMemoResources:output_type -> memos.api.v1.ListMemoResourcesResponse + 35, // 49: memos.api.v1.MemoService.SetMemoRelations:output_type -> google.protobuf.Empty + 17, // 50: memos.api.v1.MemoService.ListMemoRelations:output_type -> memos.api.v1.ListMemoRelationsResponse + 1, // 51: memos.api.v1.MemoService.CreateMemoComment:output_type -> memos.api.v1.Memo + 20, // 52: memos.api.v1.MemoService.ListMemoComments:output_type -> memos.api.v1.ListMemoCommentsResponse + 22, // 53: memos.api.v1.MemoService.GetUserMemosStats:output_type -> memos.api.v1.GetUserMemosStatsResponse + 24, // 54: memos.api.v1.MemoService.ListMemoReactions:output_type -> memos.api.v1.ListMemoReactionsResponse + 33, // 55: memos.api.v1.MemoService.UpsertMemoReaction:output_type -> memos.api.v1.Reaction + 35, // 56: memos.api.v1.MemoService.DeleteMemoReaction:output_type -> google.protobuf.Empty + 40, // [40:57] is the sub-list for method output_type + 23, // [23:40] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_api_v1_memo_service_proto_init() } @@ -2001,6 +2016,7 @@ func file_api_v1_memo_service_proto_init() { return } file_api_v1_common_proto_init() + file_api_v1_markdown_service_proto_init() file_api_v1_memo_relation_service_proto_init() file_api_v1_reaction_service_proto_init() file_api_v1_resource_service_proto_init() diff --git a/proto/gen/store/workspace_setting.pb.go b/proto/gen/store/workspace_setting.pb.go index 17e22d158..a8a296cf2 100644 --- a/proto/gen/store/workspace_setting.pb.go +++ b/proto/gen/store/workspace_setting.pb.go @@ -256,8 +256,7 @@ type WorkspaceBasicSetting struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ServerId string `protobuf:"bytes,1,opt,name=server_id,json=serverId,proto3" json:"server_id,omitempty"` - SecretKey string `protobuf:"bytes,2,opt,name=secret_key,json=secretKey,proto3" json:"secret_key,omitempty"` + SecretKey string `protobuf:"bytes,1,opt,name=secret_key,json=secretKey,proto3" json:"secret_key,omitempty"` } func (x *WorkspaceBasicSetting) Reset() { @@ -292,13 +291,6 @@ func (*WorkspaceBasicSetting) Descriptor() ([]byte, []int) { return file_store_workspace_setting_proto_rawDescGZIP(), []int{1} } -func (x *WorkspaceBasicSetting) GetServerId() string { - if x != nil { - return x.ServerId - } - return "" -} - func (x *WorkspaceBasicSetting) GetSecretKey() string { if x != nil { return x.SecretKey @@ -722,110 +714,108 @@ var file_store_workspace_setting_proto_rawDesc = []byte{ 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x53, 0x0a, 0x15, 0x57, 0x6f, 0x72, + 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x36, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x22, 0xc1, - 0x02, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x27, 0x0a, - 0x0f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2b, - 0x0a, 0x11, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, - 0x74, 0x6c, 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, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, 0x55, 0x72, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, - 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x12, 0x53, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x69, 0x6c, - 0x65, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, 0x62, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x69, 0x7a, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x62, 0x12, 0x4a, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6d, 0x65, 0x6d, - 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x2e, 0x53, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0xa6, 0x01, 0x0a, 0x08, 0x53, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, - 0x65, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, - 0x65, 0x79, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x73, 0x0a, 0x0b, - 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x53, - 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x54, 0x4f, - 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, - 0x53, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x33, 0x10, - 0x03, 0x22, 0x8e, 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, - 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x79, 0x57, 0x69, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x2a, 0xbb, 0x01, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x57, 0x4f, - 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, - 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, - 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x1d, - 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, - 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x1d, 0x0a, - 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, - 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, - 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, - 0x47, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x10, 0x04, - 0x42, 0xa0, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 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, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x4d, 0x53, 0x58, 0xaa, 0x02, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x4d, 0x65, 0x6d, - 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, + 0x79, 0x22, 0xc1, 0x02, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x55, 0x72, 0x6c, + 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x67, + 0x6e, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x29, + 0x0a, 0x10, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x4a, 0x0a, 0x0e, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0xa3, 0x01, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x69, 0x74, 0x6c, 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, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x6f, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x6f, + 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0xb6, 0x04, 0x0a, 0x17, + 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x53, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, + 0x68, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x6d, + 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x69, 0x7a, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4d, 0x62, 0x12, 0x4a, 0x0a, 0x09, 0x73, 0x33, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x73, 0x33, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa6, 0x01, 0x0a, 0x08, 0x53, 0x33, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, + 0x73, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, + 0x0a, 0x18, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, + 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x4f, 0x52, 0x41, + 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, + 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x53, 0x33, 0x10, 0x03, 0x22, 0x8e, 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x18, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, + 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x57, 0x69, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0xbb, 0x01, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, + 0x21, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, + 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, + 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, + 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, + 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x02, + 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, + 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x03, 0x12, + 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, + 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x04, 0x42, 0xa0, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x29, 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, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x4d, 0x53, + 0x58, 0xaa, 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, + 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, + 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, + 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/store/workspace_setting.proto b/proto/store/workspace_setting.proto index 9061a0e34..092f1f8c1 100644 --- a/proto/store/workspace_setting.proto +++ b/proto/store/workspace_setting.proto @@ -27,8 +27,7 @@ message WorkspaceSetting { } message WorkspaceBasicSetting { - string server_id = 1; - string secret_key = 2; + string secret_key = 1; } message WorkspaceGeneralSetting { diff --git a/server/route/api/v1/link_service.go b/server/route/api/v1/link_service.go deleted file mode 100644 index 6f0448e80..000000000 --- a/server/route/api/v1/link_service.go +++ /dev/null @@ -1,23 +0,0 @@ -package v1 - -import ( - "context" - - getter "github.com/usememos/memos/plugin/http-getter" - v1pb "github.com/usememos/memos/proto/gen/api/v1" -) - -func (*APIV1Service) GetLinkMetadata(_ context.Context, request *v1pb.GetLinkMetadataRequest) (*v1pb.GetLinkMetadataResponse, error) { - htmlMeta, err := getter.GetHTMLMeta(request.Link) - if err != nil { - return nil, err - } - - return &v1pb.GetLinkMetadataResponse{ - LinkMetadata: &v1pb.LinkMetadata{ - Title: htmlMeta.Title, - Description: htmlMeta.Description, - Image: htmlMeta.Image, - }, - }, nil -} diff --git a/server/route/api/v1/markdown_service.go b/server/route/api/v1/markdown_service.go new file mode 100644 index 000000000..2b6bfc27b --- /dev/null +++ b/server/route/api/v1/markdown_service.go @@ -0,0 +1,235 @@ +package v1 + +import ( + "context" + + "github.com/pkg/errors" + "github.com/yourselfhosted/gomark/ast" + "github.com/yourselfhosted/gomark/parser" + "github.com/yourselfhosted/gomark/parser/tokenizer" + "github.com/yourselfhosted/gomark/restore" + + getter "github.com/usememos/memos/plugin/http-getter" + v1pb "github.com/usememos/memos/proto/gen/api/v1" +) + +func (*APIV1Service) ParseMarkdown(_ context.Context, request *v1pb.ParseMarkdownRequest) (*v1pb.ParseMarkdownResponse, error) { + rawNodes, err := parser.Parse(tokenizer.Tokenize(request.Markdown)) + if err != nil { + return nil, errors.Wrap(err, "failed to parse memo content") + } + + nodes := convertFromASTNodes(rawNodes) + return &v1pb.ParseMarkdownResponse{ + Nodes: nodes, + }, nil +} + +func (*APIV1Service) RestoreMarkdown(_ context.Context, request *v1pb.RestoreMarkdownRequest) (*v1pb.RestoreMarkdownResponse, error) { + markdown := restore.Restore(convertToASTNodes(request.Nodes)) + return &v1pb.RestoreMarkdownResponse{ + Markdown: markdown, + }, nil +} + +func (*APIV1Service) GetLinkMetadata(_ context.Context, request *v1pb.GetLinkMetadataRequest) (*v1pb.LinkMetadata, error) { + htmlMeta, err := getter.GetHTMLMeta(request.Link) + if err != nil { + return nil, err + } + + return &v1pb.LinkMetadata{ + Title: htmlMeta.Title, + Description: htmlMeta.Description, + Image: htmlMeta.Image, + }, nil +} + +func convertFromASTNode(rawNode ast.Node) *v1pb.Node { + node := &v1pb.Node{ + Type: v1pb.NodeType(v1pb.NodeType_value[string(rawNode.Type())]), + } + + switch n := rawNode.(type) { + case *ast.LineBreak: + node.Node = &v1pb.Node_LineBreakNode{} + case *ast.Paragraph: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_ParagraphNode{ParagraphNode: &v1pb.ParagraphNode{Children: children}} + case *ast.CodeBlock: + node.Node = &v1pb.Node_CodeBlockNode{CodeBlockNode: &v1pb.CodeBlockNode{Language: n.Language, Content: n.Content}} + case *ast.Heading: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_HeadingNode{HeadingNode: &v1pb.HeadingNode{Level: int32(n.Level), Children: children}} + case *ast.HorizontalRule: + node.Node = &v1pb.Node_HorizontalRuleNode{HorizontalRuleNode: &v1pb.HorizontalRuleNode{Symbol: n.Symbol}} + case *ast.Blockquote: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_BlockquoteNode{BlockquoteNode: &v1pb.BlockquoteNode{Children: children}} + case *ast.OrderedList: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_OrderedListNode{OrderedListNode: &v1pb.OrderedListNode{Number: n.Number, Indent: int32(n.Indent), Children: children}} + case *ast.UnorderedList: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_UnorderedListNode{UnorderedListNode: &v1pb.UnorderedListNode{Symbol: n.Symbol, Indent: int32(n.Indent), Children: children}} + case *ast.TaskList: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_TaskListNode{TaskListNode: &v1pb.TaskListNode{Symbol: n.Symbol, Indent: int32(n.Indent), Complete: n.Complete, Children: children}} + case *ast.MathBlock: + node.Node = &v1pb.Node_MathBlockNode{MathBlockNode: &v1pb.MathBlockNode{Content: n.Content}} + case *ast.Table: + node.Node = &v1pb.Node_TableNode{TableNode: convertTableFromASTNode(n)} + case *ast.EmbeddedContent: + node.Node = &v1pb.Node_EmbeddedContentNode{EmbeddedContentNode: &v1pb.EmbeddedContentNode{ResourceName: n.ResourceName, Params: n.Params}} + case *ast.Text: + node.Node = &v1pb.Node_TextNode{TextNode: &v1pb.TextNode{Content: n.Content}} + case *ast.Bold: + children := convertFromASTNodes(n.Children) + node.Node = &v1pb.Node_BoldNode{BoldNode: &v1pb.BoldNode{Symbol: n.Symbol, Children: children}} + case *ast.Italic: + node.Node = &v1pb.Node_ItalicNode{ItalicNode: &v1pb.ItalicNode{Symbol: n.Symbol, Content: n.Content}} + case *ast.BoldItalic: + node.Node = &v1pb.Node_BoldItalicNode{BoldItalicNode: &v1pb.BoldItalicNode{Symbol: n.Symbol, Content: n.Content}} + case *ast.Code: + node.Node = &v1pb.Node_CodeNode{CodeNode: &v1pb.CodeNode{Content: n.Content}} + case *ast.Image: + node.Node = &v1pb.Node_ImageNode{ImageNode: &v1pb.ImageNode{AltText: n.AltText, Url: n.URL}} + case *ast.Link: + node.Node = &v1pb.Node_LinkNode{LinkNode: &v1pb.LinkNode{Text: n.Text, Url: n.URL}} + case *ast.AutoLink: + node.Node = &v1pb.Node_AutoLinkNode{AutoLinkNode: &v1pb.AutoLinkNode{Url: n.URL, IsRawText: n.IsRawText}} + case *ast.Tag: + node.Node = &v1pb.Node_TagNode{TagNode: &v1pb.TagNode{Content: n.Content}} + case *ast.Strikethrough: + node.Node = &v1pb.Node_StrikethroughNode{StrikethroughNode: &v1pb.StrikethroughNode{Content: n.Content}} + case *ast.EscapingCharacter: + node.Node = &v1pb.Node_EscapingCharacterNode{EscapingCharacterNode: &v1pb.EscapingCharacterNode{Symbol: n.Symbol}} + case *ast.Math: + node.Node = &v1pb.Node_MathNode{MathNode: &v1pb.MathNode{Content: n.Content}} + case *ast.Highlight: + node.Node = &v1pb.Node_HighlightNode{HighlightNode: &v1pb.HighlightNode{Content: n.Content}} + case *ast.Subscript: + node.Node = &v1pb.Node_SubscriptNode{SubscriptNode: &v1pb.SubscriptNode{Content: n.Content}} + case *ast.Superscript: + node.Node = &v1pb.Node_SuperscriptNode{SuperscriptNode: &v1pb.SuperscriptNode{Content: n.Content}} + case *ast.ReferencedContent: + node.Node = &v1pb.Node_ReferencedContentNode{ReferencedContentNode: &v1pb.ReferencedContentNode{ResourceName: n.ResourceName, Params: n.Params}} + case *ast.Spoiler: + node.Node = &v1pb.Node_SpoilerNode{SpoilerNode: &v1pb.SpoilerNode{Content: n.Content}} + default: + node.Node = &v1pb.Node_TextNode{TextNode: &v1pb.TextNode{}} + } + return node +} + +func convertFromASTNodes(rawNodes []ast.Node) []*v1pb.Node { + nodes := []*v1pb.Node{} + for _, rawNode := range rawNodes { + node := convertFromASTNode(rawNode) + nodes = append(nodes, node) + } + return nodes +} + +func convertTableFromASTNode(node *ast.Table) *v1pb.TableNode { + table := &v1pb.TableNode{ + Header: node.Header, + Delimiter: node.Delimiter, + } + for _, row := range node.Rows { + table.Rows = append(table.Rows, &v1pb.TableNode_Row{Cells: row}) + } + return table +} + +func convertToASTNode(node *v1pb.Node) ast.Node { + switch n := node.Node.(type) { + case *v1pb.Node_LineBreakNode: + return &ast.LineBreak{} + case *v1pb.Node_ParagraphNode: + children := convertToASTNodes(n.ParagraphNode.Children) + return &ast.Paragraph{Children: children} + case *v1pb.Node_CodeBlockNode: + return &ast.CodeBlock{Language: n.CodeBlockNode.Language, Content: n.CodeBlockNode.Content} + case *v1pb.Node_HeadingNode: + children := convertToASTNodes(n.HeadingNode.Children) + return &ast.Heading{Level: int(n.HeadingNode.Level), Children: children} + case *v1pb.Node_HorizontalRuleNode: + return &ast.HorizontalRule{Symbol: n.HorizontalRuleNode.Symbol} + case *v1pb.Node_BlockquoteNode: + children := convertToASTNodes(n.BlockquoteNode.Children) + return &ast.Blockquote{Children: children} + case *v1pb.Node_OrderedListNode: + children := convertToASTNodes(n.OrderedListNode.Children) + return &ast.OrderedList{Number: n.OrderedListNode.Number, Indent: int(n.OrderedListNode.Indent), Children: children} + case *v1pb.Node_UnorderedListNode: + children := convertToASTNodes(n.UnorderedListNode.Children) + return &ast.UnorderedList{Symbol: n.UnorderedListNode.Symbol, Indent: int(n.UnorderedListNode.Indent), Children: children} + case *v1pb.Node_TaskListNode: + children := convertToASTNodes(n.TaskListNode.Children) + return &ast.TaskList{Symbol: n.TaskListNode.Symbol, Indent: int(n.TaskListNode.Indent), Complete: n.TaskListNode.Complete, Children: children} + case *v1pb.Node_MathBlockNode: + return &ast.MathBlock{Content: n.MathBlockNode.Content} + case *v1pb.Node_TableNode: + return convertTableToASTNode(n.TableNode) + case *v1pb.Node_EmbeddedContentNode: + return &ast.EmbeddedContent{ResourceName: n.EmbeddedContentNode.ResourceName, Params: n.EmbeddedContentNode.Params} + case *v1pb.Node_TextNode: + return &ast.Text{Content: n.TextNode.Content} + case *v1pb.Node_BoldNode: + children := convertToASTNodes(n.BoldNode.Children) + return &ast.Bold{Symbol: n.BoldNode.Symbol, Children: children} + case *v1pb.Node_ItalicNode: + return &ast.Italic{Symbol: n.ItalicNode.Symbol, Content: n.ItalicNode.Content} + case *v1pb.Node_BoldItalicNode: + return &ast.BoldItalic{Symbol: n.BoldItalicNode.Symbol, Content: n.BoldItalicNode.Content} + case *v1pb.Node_CodeNode: + return &ast.Code{Content: n.CodeNode.Content} + case *v1pb.Node_ImageNode: + return &ast.Image{AltText: n.ImageNode.AltText, URL: n.ImageNode.Url} + case *v1pb.Node_LinkNode: + return &ast.Link{Text: n.LinkNode.Text, URL: n.LinkNode.Url} + case *v1pb.Node_AutoLinkNode: + return &ast.AutoLink{URL: n.AutoLinkNode.Url, IsRawText: n.AutoLinkNode.IsRawText} + case *v1pb.Node_TagNode: + return &ast.Tag{Content: n.TagNode.Content} + case *v1pb.Node_StrikethroughNode: + return &ast.Strikethrough{Content: n.StrikethroughNode.Content} + case *v1pb.Node_EscapingCharacterNode: + return &ast.EscapingCharacter{Symbol: n.EscapingCharacterNode.Symbol} + case *v1pb.Node_MathNode: + return &ast.Math{Content: n.MathNode.Content} + case *v1pb.Node_HighlightNode: + return &ast.Highlight{Content: n.HighlightNode.Content} + case *v1pb.Node_SubscriptNode: + return &ast.Subscript{Content: n.SubscriptNode.Content} + case *v1pb.Node_SuperscriptNode: + return &ast.Superscript{Content: n.SuperscriptNode.Content} + case *v1pb.Node_ReferencedContentNode: + return &ast.ReferencedContent{ResourceName: n.ReferencedContentNode.ResourceName, Params: n.ReferencedContentNode.Params} + case *v1pb.Node_SpoilerNode: + return &ast.Spoiler{Content: n.SpoilerNode.Content} + default: + return &ast.Text{} + } +} + +func convertToASTNodes(nodes []*v1pb.Node) []ast.Node { + rawNodes := []ast.Node{} + for _, node := range nodes { + rawNode := convertToASTNode(node) + rawNodes = append(rawNodes, rawNode) + } + return rawNodes +} + +func convertTableToASTNode(node *v1pb.TableNode) *ast.Table { + table := &ast.Table{ + Header: node.Header, + Delimiter: node.Delimiter, + } + for _, row := range node.Rows { + table.Rows = append(table.Rows, row.Cells) + } + return table +} diff --git a/server/route/api/v1/memo_service.go b/server/route/api/v1/memo_service.go index 990f1e93c..915b2322c 100644 --- a/server/route/api/v1/memo_service.go +++ b/server/route/api/v1/memo_service.go @@ -11,6 +11,8 @@ import ( "github.com/google/cel-go/cel" "github.com/lithammer/shortuuid/v4" "github.com/pkg/errors" + "github.com/yourselfhosted/gomark/parser" + "github.com/yourselfhosted/gomark/parser/tokenizer" expr "google.golang.org/genproto/googleapis/api/expr/v1alpha1" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -543,6 +545,11 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem return nil, errors.Wrap(err, "failed to list memo reactions") } + nodes, err := parser.Parse(tokenizer.Tokenize(memo.Content)) + if err != nil { + return nil, errors.Wrap(err, "failed to parse content") + } + return &v1pb.Memo{ Name: name, Uid: memo.UID, @@ -552,6 +559,7 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem UpdateTime: timestamppb.New(time.Unix(memo.UpdatedTs, 0)), DisplayTime: timestamppb.New(time.Unix(displayTs, 0)), Content: memo.Content, + Nodes: convertFromASTNodes(nodes), Visibility: convertVisibilityFromStore(memo.Visibility), Pinned: memo.Pinned, ParentId: memo.ParentID, diff --git a/server/route/api/v1/v1.go b/server/route/api/v1/v1.go index 77a7ec8f1..03e4d5ec8 100644 --- a/server/route/api/v1/v1.go +++ b/server/route/api/v1/v1.go @@ -27,7 +27,7 @@ type APIV1Service struct { v1pb.UnimplementedInboxServiceServer v1pb.UnimplementedActivityServiceServer v1pb.UnimplementedWebhookServiceServer - v1pb.UnimplementedLinkServiceServer + v1pb.UnimplementedMarkdownServiceServer v1pb.UnimplementedIdentityProviderServiceServer Secret string @@ -55,7 +55,7 @@ func NewAPIV1Service(secret string, profile *profile.Profile, store *store.Store v1pb.RegisterInboxServiceServer(grpcServer, apiv1Service) v1pb.RegisterActivityServiceServer(grpcServer, apiv1Service) v1pb.RegisterWebhookServiceServer(grpcServer, apiv1Service) - v1pb.RegisterLinkServiceServer(grpcServer, apiv1Service) + v1pb.RegisterMarkdownServiceServer(grpcServer, apiv1Service) v1pb.RegisterIdentityProviderServiceServer(grpcServer, apiv1Service) reflection.Register(grpcServer) return apiv1Service @@ -105,7 +105,7 @@ func (s *APIV1Service) RegisterGateway(ctx context.Context, echoServer *echo.Ech if err := v1pb.RegisterWebhookServiceHandler(context.Background(), gwMux, conn); err != nil { return err } - if err := v1pb.RegisterLinkServiceHandler(context.Background(), gwMux, conn); err != nil { + if err := v1pb.RegisterMarkdownServiceHandler(context.Background(), gwMux, conn); err != nil { return err } if err := v1pb.RegisterIdentityProviderServiceHandler(context.Background(), gwMux, conn); err != nil { diff --git a/server/server.go b/server/server.go index 24faa8906..94eab97b8 100644 --- a/server/server.go +++ b/server/server.go @@ -27,7 +27,6 @@ import ( ) type Server struct { - ID string Secret string Profile *profile.Profile Store *store.Store @@ -60,7 +59,6 @@ func NewServer(ctx context.Context, profile *profile.Profile, store *store.Store if profile.Mode == "prod" { secret = workspaceBasicSetting.SecretKey } - s.ID = workspaceBasicSetting.ServerId s.Secret = secret // Register healthz endpoint. @@ -133,12 +131,12 @@ func (s *Server) Shutdown(ctx context.Context) { ctx, cancel := context.WithTimeout(ctx, 10*time.Second) defer cancel() - // Shutdown echo server + // Shutdown echo server. if err := s.echoServer.Shutdown(ctx); err != nil { fmt.Printf("failed to shutdown server, error: %v\n", err) } - // Close database connection + // Close database connection. if err := s.Store.Close(); err != nil { fmt.Printf("failed to close database, error: %v\n", err) } @@ -156,10 +154,6 @@ func (s *Server) getOrUpsertWorkspaceBasicSetting(ctx context.Context) (*storepb return nil, errors.Wrap(err, "failed to get workspace basic setting") } modified := false - if workspaceBasicSetting.ServerId == "" { - workspaceBasicSetting.ServerId = uuid.NewString() - modified = true - } if workspaceBasicSetting.SecretKey == "" { workspaceBasicSetting.SecretKey = uuid.NewString() modified = true diff --git a/web/src/assets/gomark.wasm b/web/src/assets/gomark.wasm deleted file mode 100755 index aa876e5db6f32ff8b355df21733429f13d900324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345253 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%0D# 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

G&vzeTfGdgXkHM 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 iubw%5 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 diff --git a/web/src/assets/wasm_exec.js b/web/src/assets/wasm_exec.js deleted file mode 100644 index 216bc868a..000000000 --- a/web/src/assets/wasm_exec.js +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// -// This file has been modified for use by the TinyGo compiler. - -(() => { - // Map multiple JavaScript environments to a single common API, - // preferring web standards over Node.js API. - // - // Environments considered: - // - Browsers - // - Node.js - // - Electron - // - Parcel - - if (typeof global !== "undefined") { - // global already exists - } else if (typeof window !== "undefined") { - window.global = window; - } else if (typeof self !== "undefined") { - self.global = self; - } else { - throw new Error("cannot export Go (neither global, window nor self is defined)"); - } - - if (!global.require && typeof require !== "undefined") { - global.require = require; - } - - if (!global.fs && global.require) { - global.fs = require("fs"); - } - - const enosys = () => { - const err = new Error("not implemented"); - err.code = "ENOSYS"; - return err; - }; - - if (!global.fs) { - let outputBuf = ""; - global.fs = { - constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused - writeSync(fd, buf) { - outputBuf += decoder.decode(buf); - const nl = outputBuf.lastIndexOf("\n"); - if (nl != -1) { - console.log(outputBuf.substr(0, nl)); - outputBuf = outputBuf.substr(nl + 1); - } - return buf.length; - }, - write(fd, buf, offset, length, position, callback) { - if (offset !== 0 || length !== buf.length || position !== null) { - callback(enosys()); - return; - } - const n = this.writeSync(fd, buf); - callback(null, n); - }, - chmod(path, mode, callback) { - callback(enosys()); - }, - chown(path, uid, gid, callback) { - callback(enosys()); - }, - close(fd, callback) { - callback(enosys()); - }, - fchmod(fd, mode, callback) { - callback(enosys()); - }, - fchown(fd, uid, gid, callback) { - callback(enosys()); - }, - fstat(fd, callback) { - callback(enosys()); - }, - fsync(fd, callback) { - callback(null); - }, - ftruncate(fd, length, callback) { - callback(enosys()); - }, - lchown(path, uid, gid, callback) { - callback(enosys()); - }, - link(path, link, callback) { - callback(enosys()); - }, - lstat(path, callback) { - callback(enosys()); - }, - mkdir(path, perm, callback) { - callback(enosys()); - }, - open(path, flags, mode, callback) { - callback(enosys()); - }, - read(fd, buffer, offset, length, position, callback) { - callback(enosys()); - }, - readdir(path, callback) { - callback(enosys()); - }, - readlink(path, callback) { - callback(enosys()); - }, - rename(from, to, callback) { - callback(enosys()); - }, - rmdir(path, callback) { - callback(enosys()); - }, - stat(path, callback) { - callback(enosys()); - }, - symlink(path, link, callback) { - callback(enosys()); - }, - truncate(path, length, callback) { - callback(enosys()); - }, - unlink(path, callback) { - callback(enosys()); - }, - utimes(path, atime, mtime, callback) { - callback(enosys()); - }, - }; - } - - if (!global.process) { - global.process = { - getuid() { - return -1; - }, - getgid() { - return -1; - }, - geteuid() { - return -1; - }, - getegid() { - return -1; - }, - getgroups() { - throw enosys(); - }, - pid: -1, - ppid: -1, - umask() { - throw enosys(); - }, - cwd() { - throw enosys(); - }, - chdir() { - throw enosys(); - }, - }; - } - - if (!global.crypto) { - const nodeCrypto = require("crypto"); - global.crypto = { - getRandomValues(b) { - nodeCrypto.randomFillSync(b); - }, - }; - } - - if (!global.performance) { - global.performance = { - now() { - const [sec, nsec] = process.hrtime(); - return sec * 1000 + nsec / 1000000; - }, - }; - } - - if (!global.TextEncoder) { - global.TextEncoder = require("util").TextEncoder; - } - - if (!global.TextDecoder) { - global.TextDecoder = require("util").TextDecoder; - } - - // End of polyfills for common API. - - const encoder = new TextEncoder("utf-8"); - const decoder = new TextDecoder("utf-8"); - let reinterpretBuf = new DataView(new ArrayBuffer(8)); - var logLine = []; - - global.Go = class { - constructor() { - this._callbackTimeouts = new Map(); - this._nextCallbackTimeoutID = 1; - - const mem = () => { - // The buffer may change when requesting more memory. - return new DataView(this._inst.exports.memory.buffer); - }; - - const unboxValue = (v_ref) => { - reinterpretBuf.setBigInt64(0, v_ref, true); - const f = reinterpretBuf.getFloat64(0, true); - if (f === 0) { - return undefined; - } - if (!isNaN(f)) { - return f; - } - - const id = v_ref & 0xffffffffn; - return this._values[id]; - }; - - const loadValue = (addr) => { - let v_ref = mem().getBigUint64(addr, true); - return unboxValue(v_ref); - }; - - const boxValue = (v) => { - const nanHead = 0x7ff80000n; - - if (typeof v === "number") { - if (isNaN(v)) { - return nanHead << 32n; - } - if (v === 0) { - return (nanHead << 32n) | 1n; - } - reinterpretBuf.setFloat64(0, v, true); - return reinterpretBuf.getBigInt64(0, true); - } - - switch (v) { - case undefined: - return 0n; - case null: - return (nanHead << 32n) | 2n; - case true: - return (nanHead << 32n) | 3n; - case false: - return (nanHead << 32n) | 4n; - } - - let id = this._ids.get(v); - if (id === undefined) { - id = this._idPool.pop(); - if (id === undefined) { - id = BigInt(this._values.length); - } - this._values[id] = v; - this._goRefCounts[id] = 0; - this._ids.set(v, id); - } - this._goRefCounts[id]++; - let typeFlag = 1n; - switch (typeof v) { - case "string": - typeFlag = 2n; - break; - case "symbol": - typeFlag = 3n; - break; - case "function": - typeFlag = 4n; - break; - } - return id | ((nanHead | typeFlag) << 32n); - }; - - const storeValue = (addr, v) => { - let v_ref = boxValue(v); - mem().setBigUint64(addr, v_ref, true); - }; - - const loadSlice = (array, len, cap) => { - return new Uint8Array(this._inst.exports.memory.buffer, array, len); - }; - - const loadSliceOfValues = (array, len, cap) => { - const a = new Array(len); - for (let i = 0; i < len; i++) { - a[i] = loadValue(array + i * 8); - } - return a; - }; - - const loadString = (ptr, len) => { - return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len)); - }; - - const timeOrigin = Date.now() - performance.now(); - this.importObject = { - wasi_snapshot_preview1: { - // https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write - fd_write: function (fd, iovs_ptr, iovs_len, nwritten_ptr) { - let nwritten = 0; - if (fd == 1) { - for (let iovs_i = 0; iovs_i < iovs_len; iovs_i++) { - let iov_ptr = iovs_ptr + iovs_i * 8; // assuming wasm32 - let ptr = mem().getUint32(iov_ptr + 0, true); - let len = mem().getUint32(iov_ptr + 4, true); - nwritten += len; - for (let i = 0; i < len; i++) { - let c = mem().getUint8(ptr + i); - if (c == 13) { - // CR - // ignore - } else if (c == 10) { - // LF - // write line - let line = decoder.decode(new Uint8Array(logLine)); - logLine = []; - console.log(line); - } else { - logLine.push(c); - } - } - } - } else { - console.error("invalid file descriptor:", fd); - } - mem().setUint32(nwritten_ptr, nwritten, true); - return 0; - }, - fd_close: () => 0, // dummy - fd_fdstat_get: () => 0, // dummy - fd_seek: () => 0, // dummy - proc_exit: (code) => { - if (global.process) { - // Node.js - process.exit(code); - } else { - // Can't exit in a browser. - throw "trying to exit with code " + code; - } - }, - random_get: (bufPtr, bufLen) => { - crypto.getRandomValues(loadSlice(bufPtr, bufLen)); - return 0; - }, - }, - gojs: { - // func ticks() float64 - "runtime.ticks": () => { - return timeOrigin + performance.now(); - }, - - // func sleepTicks(timeout float64) - "runtime.sleepTicks": (timeout) => { - // Do not sleep, only reactivate scheduler after the given timeout. - setTimeout(this._inst.exports.go_scheduler, timeout); - }, - - // func finalizeRef(v ref) - "syscall/js.finalizeRef": (v_ref) => { - // Note: TinyGo does not support finalizers so this should never be - // called. - }, - - // func stringVal(value string) ref - "syscall/js.stringVal": (value_ptr, value_len) => { - const s = loadString(value_ptr, value_len); - return boxValue(s); - }, - - // func valueGet(v ref, p string) ref - "syscall/js.valueGet": (v_ref, p_ptr, p_len) => { - let prop = loadString(p_ptr, p_len); - let v = unboxValue(v_ref); - let result = Reflect.get(v, prop); - return boxValue(result); - }, - - // func valueSet(v ref, p string, x ref) - "syscall/js.valueSet": (v_ref, p_ptr, p_len, x_ref) => { - const v = unboxValue(v_ref); - const p = loadString(p_ptr, p_len); - const x = unboxValue(x_ref); - Reflect.set(v, p, x); - }, - - // func valueDelete(v ref, p string) - "syscall/js.valueDelete": (v_ref, p_ptr, p_len) => { - const v = unboxValue(v_ref); - const p = loadString(p_ptr, p_len); - Reflect.deleteProperty(v, p); - }, - - // func valueIndex(v ref, i int) ref - "syscall/js.valueIndex": (v_ref, i) => { - return boxValue(Reflect.get(unboxValue(v_ref), i)); - }, - - // valueSetIndex(v ref, i int, x ref) - "syscall/js.valueSetIndex": (v_ref, i, x_ref) => { - Reflect.set(unboxValue(v_ref), i, unboxValue(x_ref)); - }, - - // func valueCall(v ref, m string, args []ref) (ref, bool) - "syscall/js.valueCall": (ret_addr, v_ref, m_ptr, m_len, args_ptr, args_len, args_cap) => { - const v = unboxValue(v_ref); - const name = loadString(m_ptr, m_len); - const args = loadSliceOfValues(args_ptr, args_len, args_cap); - try { - const m = Reflect.get(v, name); - storeValue(ret_addr, Reflect.apply(m, v, args)); - mem().setUint8(ret_addr + 8, 1); - } catch (err) { - storeValue(ret_addr, err); - mem().setUint8(ret_addr + 8, 0); - } - }, - - // func valueInvoke(v ref, args []ref) (ref, bool) - "syscall/js.valueInvoke": (ret_addr, v_ref, args_ptr, args_len, args_cap) => { - try { - const v = unboxValue(v_ref); - const args = loadSliceOfValues(args_ptr, args_len, args_cap); - storeValue(ret_addr, Reflect.apply(v, undefined, args)); - mem().setUint8(ret_addr + 8, 1); - } catch (err) { - storeValue(ret_addr, err); - mem().setUint8(ret_addr + 8, 0); - } - }, - - // func valueNew(v ref, args []ref) (ref, bool) - "syscall/js.valueNew": (ret_addr, v_ref, args_ptr, args_len, args_cap) => { - const v = unboxValue(v_ref); - const args = loadSliceOfValues(args_ptr, args_len, args_cap); - try { - storeValue(ret_addr, Reflect.construct(v, args)); - mem().setUint8(ret_addr + 8, 1); - } catch (err) { - storeValue(ret_addr, err); - mem().setUint8(ret_addr + 8, 0); - } - }, - - // func valueLength(v ref) int - "syscall/js.valueLength": (v_ref) => { - return unboxValue(v_ref).length; - }, - - // valuePrepareString(v ref) (ref, int) - "syscall/js.valuePrepareString": (ret_addr, v_ref) => { - const s = String(unboxValue(v_ref)); - const str = encoder.encode(s); - storeValue(ret_addr, str); - mem().setInt32(ret_addr + 8, str.length, true); - }, - - // valueLoadString(v ref, b []byte) - "syscall/js.valueLoadString": (v_ref, slice_ptr, slice_len, slice_cap) => { - const str = unboxValue(v_ref); - loadSlice(slice_ptr, slice_len, slice_cap).set(str); - }, - - // func valueInstanceOf(v ref, t ref) bool - "syscall/js.valueInstanceOf": (v_ref, t_ref) => { - return unboxValue(v_ref) instanceof unboxValue(t_ref); - }, - - // func copyBytesToGo(dst []byte, src ref) (int, bool) - "syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => { - let num_bytes_copied_addr = ret_addr; - let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable - - const dst = loadSlice(dest_addr, dest_len); - const src = unboxValue(src_ref); - if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) { - mem().setUint8(returned_status_addr, 0); // Return "not ok" status - return; - } - const toCopy = src.subarray(0, dst.length); - dst.set(toCopy); - mem().setUint32(num_bytes_copied_addr, toCopy.length, true); - mem().setUint8(returned_status_addr, 1); // Return "ok" status - }, - - // copyBytesToJS(dst ref, src []byte) (int, bool) - // Originally copied from upstream Go project, then modified: - // https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416 - "syscall/js.copyBytesToJS": (ret_addr, dst_ref, src_addr, src_len, src_cap) => { - let num_bytes_copied_addr = ret_addr; - let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable - - const dst = unboxValue(dst_ref); - const src = loadSlice(src_addr, src_len); - if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) { - mem().setUint8(returned_status_addr, 0); // Return "not ok" status - return; - } - const toCopy = src.subarray(0, dst.length); - dst.set(toCopy); - mem().setUint32(num_bytes_copied_addr, toCopy.length, true); - mem().setUint8(returned_status_addr, 1); // Return "ok" status - }, - }, - }; - - // Go 1.20 uses 'env'. Go 1.21 uses 'gojs'. - // For compatibility, we use both as long as Go 1.20 is supported. - this.importObject.env = this.importObject.gojs; - } - - async run(instance) { - this._inst = instance; - this._values = [ - // JS values that Go currently has references to, indexed by reference id - NaN, - 0, - null, - true, - false, - global, - this, - ]; - this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id - this._ids = new Map(); // mapping from JS values to reference ids - this._idPool = []; // unused ids that have been garbage collected - this.exited = false; // whether the Go program has exited - - while (true) { - const callbackPromise = new Promise((resolve) => { - this._resolveCallbackPromise = () => { - if (this.exited) { - throw new Error("bad callback: Go program has already exited"); - } - setTimeout(resolve, 0); // make sure it is asynchronous - }; - }); - this._inst.exports._start(); - if (this.exited) { - break; - } - await callbackPromise; - } - } - - _resume() { - if (this.exited) { - throw new Error("Go program has already exited"); - } - this._inst.exports.resume(); - if (this.exited) { - this._resolveExitPromise(); - } - } - - _makeFuncWrapper(id) { - const go = this; - return function () { - const event = { id: id, this: this, args: arguments }; - go._pendingEvent = event; - go._resume(); - return event.result; - }; - } - }; - - if (global.require && global.require.main === module && global.process && global.process.versions && !global.process.versions.electron) { - if (process.argv.length != 3) { - console.error("usage: go_js_wasm_exec [wasm binary] [arguments]"); - process.exit(1); - } - - const go = new Go(); - WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject) - .then((result) => { - return go.run(result.instance); - }) - .catch((err) => { - console.error(err); - process.exit(1); - }); - } -})(); diff --git a/web/src/components/MemoContent/Blockquote.tsx b/web/src/components/MemoContent/Blockquote.tsx index c895446f5..943867824 100644 --- a/web/src/components/MemoContent/Blockquote.tsx +++ b/web/src/components/MemoContent/Blockquote.tsx @@ -1,4 +1,4 @@ -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; import { BaseProps } from "./types"; diff --git a/web/src/components/MemoContent/Bold.tsx b/web/src/components/MemoContent/Bold.tsx index b7651d11e..20259a136 100644 --- a/web/src/components/MemoContent/Bold.tsx +++ b/web/src/components/MemoContent/Bold.tsx @@ -1,4 +1,4 @@ -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; interface Props { diff --git a/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx b/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx index 2a3d12705..53a42f142 100644 --- a/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx +++ b/web/src/components/MemoContent/EmbeddedContent/EmbeddedMemo.tsx @@ -44,7 +44,7 @@ const EmbeddedMemo = ({ resourceId, params: paramsStr }: Props) => { @@ -62,12 +62,7 @@ const EmbeddedMemo = ({ resourceId, params: paramsStr }: Props) => { - + ); diff --git a/web/src/components/MemoContent/Heading.tsx b/web/src/components/MemoContent/Heading.tsx index a1fbe1a9d..1417c0aa5 100644 --- a/web/src/components/MemoContent/Heading.tsx +++ b/web/src/components/MemoContent/Heading.tsx @@ -1,4 +1,4 @@ -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; import { BaseProps } from "./types"; diff --git a/web/src/components/MemoContent/Link.tsx b/web/src/components/MemoContent/Link.tsx index 8dd455efe..339727999 100644 --- a/web/src/components/MemoContent/Link.tsx +++ b/web/src/components/MemoContent/Link.tsx @@ -1,7 +1,7 @@ import { Link as MLink, Tooltip } from "@mui/joy"; import { useState } from "react"; -import { linkServiceClient } from "@/grpcweb"; -import { LinkMetadata } from "@/types/proto/api/v1/link_service"; +import { markdownServiceClient } from "@/grpcweb"; +import { LinkMetadata } from "@/types/proto/api/v1/markdown_service"; interface Props { url: string; @@ -25,7 +25,7 @@ const Link: React.FC = ({ text, url }: Props) => { const handleMouseEnter = async () => { if (!initialized) { try { - const { linkMetadata } = await linkServiceClient.getLinkMetadata({ link: url }, {}); + const linkMetadata = await markdownServiceClient.getLinkMetadata({ link: url }); setLinkMetadata(linkMetadata); } catch (error) { console.error("Error fetching URL metadata:", error); diff --git a/web/src/components/MemoContent/OrderedList.tsx b/web/src/components/MemoContent/OrderedList.tsx index 75d5f99b6..347716dd5 100644 --- a/web/src/components/MemoContent/OrderedList.tsx +++ b/web/src/components/MemoContent/OrderedList.tsx @@ -1,5 +1,5 @@ import { repeat } from "lodash-es"; -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; import { BaseProps } from "./types"; diff --git a/web/src/components/MemoContent/Paragraph.tsx b/web/src/components/MemoContent/Paragraph.tsx index a0565fce2..93ce5af8f 100644 --- a/web/src/components/MemoContent/Paragraph.tsx +++ b/web/src/components/MemoContent/Paragraph.tsx @@ -1,4 +1,4 @@ -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; import { BaseProps } from "./types"; diff --git a/web/src/components/MemoContent/Renderer.tsx b/web/src/components/MemoContent/Renderer.tsx index 7667e8416..0a957e507 100644 --- a/web/src/components/MemoContent/Renderer.tsx +++ b/web/src/components/MemoContent/Renderer.tsx @@ -13,6 +13,7 @@ import { ImageNode, ItalicNode, LinkNode, + MathBlockNode, MathNode, Node, NodeType, @@ -28,7 +29,7 @@ import { TaskListNode, TextNode, UnorderedListNode, -} from "@/types/node"; +} from "@/types/proto/api/v1/markdown_service"; import Blockquote from "./Blockquote"; import Bold from "./Bold"; import BoldItalic from "./BoldItalic"; @@ -67,61 +68,61 @@ const Renderer: React.FC = ({ index, node }: Props) => { case NodeType.LINE_BREAK: return ; case NodeType.PARAGRAPH: - return ; + return ; case NodeType.CODE_BLOCK: - return ; + return ; case NodeType.HEADING: - return ; + return ; case NodeType.HORIZONTAL_RULE: - return ; + return ; case NodeType.BLOCKQUOTE: - return

; + return
; case NodeType.ORDERED_LIST: - return ; + return ; case NodeType.UNORDERED_LIST: - return ; + return ; case NodeType.TASK_LIST: - return ; + return ; case NodeType.MATH_BLOCK: - return ; + return ; case NodeType.TABLE: - return ; + return
; case NodeType.EMBEDDED_CONTENT: - return ; + return ; case NodeType.TEXT: - return ; + return ; case NodeType.BOLD: - return ; + return ; case NodeType.ITALIC: - return ; + return ; case NodeType.BOLD_ITALIC: - return ; + return ; case NodeType.CODE: - return ; + return ; case NodeType.IMAGE: - return ; + return ; case NodeType.LINK: - return ; + return ; case NodeType.AUTO_LINK: - return ; + return ; case NodeType.TAG: - return ; + return ; case NodeType.STRIKETHROUGH: - return ; + return ; case NodeType.MATH: - return ; + return ; case NodeType.HIGHLIGHT: - return ; + return ; case NodeType.ESCAPING_CHARACTER: - return ; + return ; case NodeType.SUBSCRIPT: - return ; + return ; case NodeType.SUPERSCRIPT: - return ; + return ; case NodeType.REFERENCED_CONTENT: - return ; + return ; case NodeType.SPOILER: - return ; + return ; default: return null; } diff --git a/web/src/components/MemoContent/Table.tsx b/web/src/components/MemoContent/Table.tsx index 093a7e9c8..3ba184e64 100644 --- a/web/src/components/MemoContent/Table.tsx +++ b/web/src/components/MemoContent/Table.tsx @@ -1,4 +1,4 @@ -import { TableNode_Row } from "@/types/node"; +import { TableNode_Row } from "@/types/proto/api/v1/markdown_service"; interface Props { header: string[]; diff --git a/web/src/components/MemoContent/TaskList.tsx b/web/src/components/MemoContent/TaskList.tsx index 13642c2d8..1e95e9d2b 100644 --- a/web/src/components/MemoContent/TaskList.tsx +++ b/web/src/components/MemoContent/TaskList.tsx @@ -2,8 +2,9 @@ import { Checkbox } from "@mui/joy"; import clsx from "clsx"; import { repeat } from "lodash-es"; import { useContext, useState } from "react"; +import { markdownServiceClient } from "@/grpcweb"; import { useMemoStore } from "@/store/v1"; -import { Node, NodeType, TaskListNode } from "@/types/node"; +import { Node, NodeType, TaskListNode } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; import { RendererContext } from "./types"; @@ -31,16 +32,16 @@ const TaskList: React.FC = ({ index, indent, complete, children }: Props) } const node = context.nodes[nodeIndex]; - if (node.type !== NodeType.TASK_LIST || !node.value) { + if (node.type !== NodeType.TASK_LIST) { return; } - (node.value as TaskListNode)!.complete = on; - const content = window.restore(context.nodes); + (node.taskListNode as TaskListNode)!.complete = on; + const { markdown } = await markdownServiceClient.restoreMarkdown({ nodes: context.nodes }); await memoStore.updateMemo( { name: context.memoName, - content, + content: markdown, }, ["content"], ); diff --git a/web/src/components/MemoContent/UnorderedList.tsx b/web/src/components/MemoContent/UnorderedList.tsx index a83d85691..acefce3e1 100644 --- a/web/src/components/MemoContent/UnorderedList.tsx +++ b/web/src/components/MemoContent/UnorderedList.tsx @@ -1,5 +1,5 @@ import { repeat } from "lodash-es"; -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; import Renderer from "./Renderer"; interface Props { diff --git a/web/src/components/MemoContent/index.tsx b/web/src/components/MemoContent/index.tsx index c02c08987..cbc8311ec 100644 --- a/web/src/components/MemoContent/index.tsx +++ b/web/src/components/MemoContent/index.tsx @@ -2,7 +2,7 @@ import clsx from "clsx"; import { memo, useEffect, useRef, useState } from "react"; import useCurrentUser from "@/hooks/useCurrentUser"; import { useMemoStore } from "@/store/v1"; -import { Node, NodeType } from "@/types/node"; +import { Node, NodeType } from "@/types/proto/api/v1/markdown_service"; import { useTranslate } from "@/utils/i18n"; import Renderer from "./Renderer"; import { RendererContext } from "./types"; @@ -11,7 +11,7 @@ import { RendererContext } from "./types"; const MAX_DISPLAY_HEIGHT = 256; interface Props { - content: string; + nodes: Node[]; memoName?: string; compact?: boolean; readonly?: boolean; @@ -24,14 +24,13 @@ interface Props { } const MemoContent: React.FC = (props: Props) => { - const { className, content, memoName, embeddedMemos, onClick } = props; + const { className, nodes, memoName, embeddedMemos, onClick } = props; const t = useTranslate(); const currentUser = useCurrentUser(); const memoStore = useMemoStore(); const memoContentContainerRef = useRef(null); const [showCompactMode, setShowCompactMode] = useState(false); const memo = memoName ? memoStore.getMemoByName(memoName) : null; - const nodes = window.parse(content); const allowEdit = !props.readonly && memo && currentUser?.name === memo.creator; // Initial compact mode. diff --git a/web/src/components/MemoContent/types/context.ts b/web/src/components/MemoContent/types/context.ts index 3ed174b9a..e54d5e6a9 100644 --- a/web/src/components/MemoContent/types/context.ts +++ b/web/src/components/MemoContent/types/context.ts @@ -1,5 +1,5 @@ import { createContext } from "react"; -import { Node } from "@/types/node"; +import { Node } from "@/types/proto/api/v1/markdown_service"; interface Context { nodes: Node[]; diff --git a/web/src/components/MemoEditor/Editor/index.tsx b/web/src/components/MemoEditor/Editor/index.tsx index ca1281d03..01baa10a6 100644 --- a/web/src/components/MemoEditor/Editor/index.tsx +++ b/web/src/components/MemoEditor/Editor/index.tsx @@ -1,7 +1,8 @@ import clsx from "clsx"; import { last } from "lodash-es"; import { forwardRef, ReactNode, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react"; -import { NodeType, OrderedListNode, TaskListNode, UnorderedListNode } from "@/types/node"; +import { markdownServiceClient } from "@/grpcweb"; +import { NodeType, OrderedListNode, TaskListNode, UnorderedListNode } from "@/types/proto/api/v1/markdown_service"; import TagSuggestions from "./TagSuggestions"; export interface EditorRefActions { @@ -149,24 +150,29 @@ const Editor = forwardRef(function Editor(props: Props, ref: React.ForwardedRef< updateEditorHeight(); }, []); - const handleEditorKeyDown = (event: React.KeyboardEvent) => { + const handleEditorKeyDown = async (event: React.KeyboardEvent) => { if (event.key === "Enter" && !isInIME) { + if (event.shiftKey || event.ctrlKey || event.metaKey || event.altKey) { + return; + } + const cursorPosition = editorActions.getCursorPosition(); const prevContent = editorActions.getContent().substring(0, cursorPosition); - const lastNode = last(window.parse(prevContent)); + const { nodes } = await markdownServiceClient.parseMarkdown({ markdown: prevContent }); + const lastNode = last(nodes); if (!lastNode) { return; } let insertText = ""; if (lastNode.type === NodeType.TASK_LIST) { - const { complete } = lastNode.value as TaskListNode; + const { complete } = lastNode.taskListNode as TaskListNode; insertText = complete ? "- [x] " : "- [ ] "; } else if (lastNode.type === NodeType.UNORDERED_LIST) { - const { symbol } = lastNode.value as UnorderedListNode; + const { symbol } = lastNode.unorderedListNode as UnorderedListNode; insertText = `${symbol} `; } else if (lastNode.type === NodeType.ORDERED_LIST) { - const { number } = lastNode.value as OrderedListNode; + const { number } = lastNode.orderedListNode as OrderedListNode; insertText = `${Number(number) + 1}. `; } if (insertText) { diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index ed4efac20..6aa4b2b9e 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -364,7 +364,7 @@ const MemoEditor = (props: Props) => { } // Batch upsert tags. - const tags = extractTagsFromContent(content); + const tags = await extractTagsFromContent(content); await tagStore.batchUpsertTag(tags); setState((state) => { diff --git a/web/src/components/MemoView.tsx b/web/src/components/MemoView.tsx index 943b44c75..2c91a1224 100644 --- a/web/src/components/MemoView.tsx +++ b/web/src/components/MemoView.tsx @@ -148,7 +148,7 @@ const MemoView: React.FC = (props: Props) => { = ({ content, destroy }: Props) => { + const [nodes, setNodes] = useState([]); + + useEffect(() => { + (async () => { + try { + const { nodes } = await markdownServiceClient.parseMarkdown({ markdown: content }); + setNodes(nodes); + } catch (error) { + console.error("Error parsing markdown:", error); + } + })(); + }, [content]); + const handleCloseBtnClick = () => { destroy(); }; @@ -23,7 +39,7 @@ const PreviewMarkdownDialog: React.FC = ({ content, destroy }: Props) =>
- {content !== "" ? :

Nothing to preview

} + {nodes.length > 0 ? :

Nothing to preview

}
); diff --git a/web/src/components/ShareMemoDialog.tsx b/web/src/components/ShareMemoDialog.tsx index d3b323f04..9fd55753c 100644 --- a/web/src/components/ShareMemoDialog.tsx +++ b/web/src/components/ShareMemoDialog.tsx @@ -155,7 +155,7 @@ const ShareMemoDialog: React.FC = (props: Props) => { > {getDateTimeString(memo.displayTime)}
- +
diff --git a/web/src/grpcweb.ts b/web/src/grpcweb.ts index d6b521a64..2d3ba8bc6 100644 --- a/web/src/grpcweb.ts +++ b/web/src/grpcweb.ts @@ -3,7 +3,7 @@ import { ActivityServiceDefinition } from "./types/proto/api/v1/activity_service import { AuthServiceDefinition } from "./types/proto/api/v1/auth_service"; import { IdentityProviderServiceDefinition } from "./types/proto/api/v1/idp_service"; import { InboxServiceDefinition } from "./types/proto/api/v1/inbox_service"; -import { LinkServiceDefinition } from "./types/proto/api/v1/link_service"; +import { MarkdownServiceDefinition } from "./types/proto/api/v1/markdown_service"; import { MemoServiceDefinition } from "./types/proto/api/v1/memo_service"; import { ResourceServiceDefinition } from "./types/proto/api/v1/resource_service"; import { TagServiceDefinition } from "./types/proto/api/v1/tag_service"; @@ -41,6 +41,6 @@ export const activityServiceClient = clientFactory.create(ActivityServiceDefinit export const webhookServiceClient = clientFactory.create(WebhookServiceDefinition, channel); -export const linkServiceClient = clientFactory.create(LinkServiceDefinition, channel); +export const markdownServiceClient = clientFactory.create(MarkdownServiceDefinition, channel); export const identityProviderServiceClient = clientFactory.create(IdentityProviderServiceDefinition, channel); diff --git a/web/src/main.tsx b/web/src/main.tsx index 242e4d4f0..440012b17 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -4,8 +4,6 @@ import { createRoot } from "react-dom/client"; import { Toaster } from "react-hot-toast"; import { Provider } from "react-redux"; import { RouterProvider } from "react-router-dom"; -import gomarkWasm from "./assets/gomark.wasm?url"; -import "./assets/wasm_exec.js"; import "./css/global.css"; import "./css/tailwind.css"; import "./helpers/polyfill"; @@ -17,10 +15,6 @@ import store from "./store"; import theme from "./theme"; (async () => { - const go = new window.Go(); - const { instance } = await WebAssembly.instantiateStreaming(fetch(gomarkWasm), go.importObject); - go.run(instance); - const container = document.getElementById("root"); const root = createRoot(container as HTMLElement); root.render( diff --git a/web/src/pages/Archived.tsx b/web/src/pages/Archived.tsx index 1cdc8cc29..755883e65 100644 --- a/web/src/pages/Archived.tsx +++ b/web/src/pages/Archived.tsx @@ -121,7 +121,7 @@ const Archived = () => {
- + ))} {isRequesting ? ( diff --git a/web/src/types/global.d.ts b/web/src/types/global.d.ts deleted file mode 100644 index dd6c6dacc..000000000 --- a/web/src/types/global.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Node } from "./node"; - -declare class Go { - argv: string[]; - env: { [envKey: string]: string }; - exit: (code: number) => void; - importObject: WebAssembly.Imports; - exited: boolean; - mem: DataView; - run(instance: WebAssembly.Instance): Promise; -} - -declare global { - interface Window { - Go: typeof Go; - parse: (content: string) => Node[]; - restore: (input: Node[]) => string; - } -} - -export {}; diff --git a/web/src/types/node.ts b/web/src/types/node.ts deleted file mode 100644 index e09d1bb78..000000000 --- a/web/src/types/node.ts +++ /dev/null @@ -1,202 +0,0 @@ -export enum NodeType { - LINE_BREAK = "LINE_BREAK", - PARAGRAPH = "PARAGRAPH", - CODE_BLOCK = "CODE_BLOCK", - HEADING = "HEADING", - HORIZONTAL_RULE = "HORIZONTAL_RULE", - BLOCKQUOTE = "BLOCKQUOTE", - ORDERED_LIST = "ORDERED_LIST", - UNORDERED_LIST = "UNORDERED_LIST", - TASK_LIST = "TASK_LIST", - MATH_BLOCK = "MATH_BLOCK", - TABLE = "TABLE", - EMBEDDED_CONTENT = "EMBEDDED_CONTENT", - TEXT = "TEXT", - BOLD = "BOLD", - ITALIC = "ITALIC", - BOLD_ITALIC = "BOLD_ITALIC", - CODE = "CODE", - IMAGE = "IMAGE", - LINK = "LINK", - AUTO_LINK = "AUTO_LINK", - TAG = "TAG", - STRIKETHROUGH = "STRIKETHROUGH", - ESCAPING_CHARACTER = "ESCAPING_CHARACTER", - MATH = "MATH", - HIGHLIGHT = "HIGHLIGHT", - SUBSCRIPT = "SUBSCRIPT", - SUPERSCRIPT = "SUPERSCRIPT", - REFERENCED_CONTENT = "REFERENCED_CONTENT", - SPOILER = "SPOILER", -} - -export interface Node { - type: NodeType; - value: - | LineBreakNode - | ParagraphNode - | CodeBlockNode - | HeadingNode - | HorizontalRuleNode - | BlockquoteNode - | OrderedListNode - | UnorderedListNode - | TaskListNode - | MathBlockNode - | TableNode - | EmbeddedContentNode - | TextNode - | BoldNode - | ItalicNode - | BoldItalicNode - | CodeNode - | ImageNode - | LinkNode - | AutoLinkNode - | TagNode - | StrikethroughNode - | EscapingCharacterNode - | MathNode - | HighlightNode - | SubscriptNode - | SuperscriptNode - | ReferencedContentNode - | SpoilerNode; -} - -export interface LineBreakNode {} - -export interface ParagraphNode { - children: Node[]; -} - -export interface CodeBlockNode { - language: string; - content: string; -} - -export interface HeadingNode { - level: number; - children: Node[]; -} - -export interface HorizontalRuleNode { - symbol: string; -} - -export interface BlockquoteNode { - children: Node[]; -} - -export interface OrderedListNode { - number: string; - indent: number; - children: Node[]; -} - -export interface UnorderedListNode { - symbol: string; - indent: number; - children: Node[]; -} - -export interface TaskListNode { - symbol: string; - indent: number; - complete: boolean; - children: Node[]; -} - -export interface MathBlockNode { - content: string; -} - -export interface TableNode { - header: string[]; - delimiter: string[]; - rows: TableNode_Row[]; -} - -export interface TableNode_Row { - cells: string[]; -} - -export interface EmbeddedContentNode { - resourceName: string; - params: string; -} - -export interface TextNode { - content: string; -} - -export interface BoldNode { - symbol: string; - children: Node[]; -} - -export interface ItalicNode { - symbol: string; - content: string; -} - -export interface BoldItalicNode { - symbol: string; - content: string; -} - -export interface CodeNode { - content: string; -} - -export interface ImageNode { - altText: string; - url: string; -} - -export interface LinkNode { - text: string; - url: string; -} - -export interface AutoLinkNode { - url: string; - isRawText: boolean; -} - -export interface TagNode { - content: string; -} - -export interface StrikethroughNode { - content: string; -} - -export interface EscapingCharacterNode { - symbol: string; -} - -export interface MathNode { - content: string; -} - -export interface HighlightNode { - content: string; -} - -export interface SubscriptNode { - content: string; -} - -export interface SuperscriptNode { - content: string; -} - -export interface ReferencedContentNode { - resourceName: string; - params: string; -} - -export interface SpoilerNode { - content: string; -} diff --git a/web/src/utils/tag.ts b/web/src/utils/tag.ts index ceb5a2fbd..911f8161f 100644 --- a/web/src/utils/tag.ts +++ b/web/src/utils/tag.ts @@ -1,10 +1,11 @@ -import { Node, TagNode } from "@/types/node"; +import { markdownServiceClient } from "@/grpcweb"; +import { Node, NodeType, TagNode } from "@/types/proto/api/v1/markdown_service"; export const TAG_REG = /#([^\s#,]+)/; // extractTagsFromContent extracts tags from content. -export const extractTagsFromContent = (content: string) => { - const nodes = window.parse(content); +export const extractTagsFromContent = async (content: string) => { + const { nodes } = await markdownServiceClient.parseMarkdown({ markdown: content }); const tags = new Set(); const traverse = (nodes: Node[], handle: (node: Node) => void) => { @@ -15,7 +16,7 @@ export const extractTagsFromContent = (content: string) => { handle(node); if (node.type === "PARAGRAPH" || node.type === "ORDERED_LIST" || node.type === "UNORDERED_LIST") { - const children = (node.value as any).children; + const children = node.paragraphNode?.children || node.orderedListNode?.children || node.unorderedListNode?.children; if (Array.isArray(children)) { traverse(children, handle); } @@ -24,8 +25,8 @@ export const extractTagsFromContent = (content: string) => { }; traverse(nodes, (node) => { - if (node.type === "TAG" && node.value) { - tags.add((node.value as TagNode).content); + if (node.type === NodeType.TAG && node.tagNode) { + tags.add((node.tagNode as TagNode).content); } });