Преглед на файлове

:hammer: merge grpc protocols

Jeremy Zheng преди 2 години
родител
ревизия
60559426c4
променени са 50 файла, в които са добавени 7510 реда и са изтрити 2439 реда
  1. 90 26
      dashboard/src/protocols/LilyServiceClientPb.ts
  2. 1 1
      dashboard/src/protocols/MorusServiceClientPb.ts
  3. 103 31
      dashboard/src/protocols/lily_pb.d.ts
  4. 687 244
      dashboard/src/protocols/lily_pb.js
  5. 33 10
      rpc/protocols/lily.proto
  6. 23 23
      rpc/schema.sh
  7. 116 55
      rpc/sdk/cpp/lily.grpc.pb.cc
  8. 369 164
      rpc/sdk/cpp/lily.grpc.pb.h
  9. 307 469
      rpc/sdk/cpp/lily.pb.cc
  10. 223 409
      rpc/sdk/cpp/lily.pb.h
  11. 176 195
      rpc/sdk/cpp/morus.pb.cc
  12. 80 71
      rpc/sdk/cpp/morus.pb.h
  13. 913 286
      rpc/sdk/csharp/Lily.cs
  14. 188 45
      rpc/sdk/csharp/LilyGrpc.cs
  15. 12 12
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/EpubGrpc.java
  16. 24 24
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/ExcelGrpc.java
  17. 0 32
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/FileOrBuilder.java
  18. 68 35
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/Lily.java
  19. 813 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3File.java
  20. 45 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3FileOrBuilder.java
  21. 870 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileRequest.java
  22. 48 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileRequestOrBuilder.java
  23. 104 195
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileResponse.java
  24. 21 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileResponseOrBuilder.java
  25. 293 0
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3Grpc.java
  26. 24 24
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexGrpc.java
  27. 580 27
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexToRequest.java
  28. 55 5
      rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexToRequestOrBuilder.java
  29. BIN
      rpc/sdk/php/GPBMetadata/Lily.php
  30. BIN
      rpc/sdk/php/GPBMetadata/Morus.php
  31. 34 0
      rpc/sdk/php/Mint/Morus/V1/MarkdownClient.php
  32. 85 0
      rpc/sdk/php/Mint/Morus/V1/MarkdownToHtmlRequest.php
  33. 58 0
      rpc/sdk/php/Mint/Morus/V1/MarkdownToHtmlResponse.php
  34. 31 0
      rpc/sdk/php/Palm/Lily/V1/EpubBuildRequest.php
  35. 35 0
      rpc/sdk/php/Palm/Lily/V1/EpubClient.php
  36. 49 0
      rpc/sdk/php/Palm/Lily/V1/ExcelClient.php
  37. 58 0
      rpc/sdk/php/Palm/Lily/V1/ExcelModel.php
  38. 88 0
      rpc/sdk/php/Palm/Lily/V1/ExcelModel/Sheet.php
  39. 115 0
      rpc/sdk/php/Palm/Lily/V1/ExcelModel/Sheet/Cell.php
  40. 33 0
      rpc/sdk/php/Palm/Lily/V1/S3Client.php
  41. 112 0
      rpc/sdk/php/Palm/Lily/V1/S3File.php
  42. 122 0
      rpc/sdk/php/Palm/Lily/V1/S3GetFileRequest.php
  43. 58 0
      rpc/sdk/php/Palm/Lily/V1/S3GetFileResponse.php
  44. 47 0
      rpc/sdk/php/Palm/Lily/V1/TexClient.php
  45. 186 0
      rpc/sdk/php/Palm/Lily/V1/TexToRequest.php
  46. 28 22
      rpc/sdk/python/lily_pb2.py
  47. 79 24
      rpc/sdk/python/lily_pb2_grpc.py
  48. 0 1
      rpc/sdk/python/morus_pb2.py
  49. 7 2
      rpc/sdk/ruby/lily_pb.rb
  50. 19 7
      rpc/sdk/ruby/lily_services_pb.rb

+ 90 - 26
dashboard/src/protocols/LilyServiceClientPb.ts

@@ -7,7 +7,7 @@
 // Code generated by protoc-gen-grpc-web. DO NOT EDIT.
 // versions:
 // 	protoc-gen-grpc-web v1.4.2
-// 	protoc              v4.23.4
+// 	protoc              v4.24.3
 // source: lily.proto
 
 
@@ -42,26 +42,26 @@ export class ExcelClient {
   methodDescriptorParse = new grpcWeb.MethodDescriptor(
     '/palm.lily.v1.Excel/Parse',
     grpcWeb.MethodType.UNARY,
-    lily_pb.File,
+    lily_pb.S3File,
     lily_pb.ExcelModel,
-    (request: lily_pb.File) => {
+    (request: lily_pb.S3File) => {
       return request.serializeBinary();
     },
     lily_pb.ExcelModel.deserializeBinary
   );
 
   parse(
-    request: lily_pb.File,
+    request: lily_pb.S3File,
     metadata: grpcWeb.Metadata | null): Promise<lily_pb.ExcelModel>;
 
   parse(
-    request: lily_pb.File,
+    request: lily_pb.S3File,
     metadata: grpcWeb.Metadata | null,
     callback: (err: grpcWeb.RpcError,
                response: lily_pb.ExcelModel) => void): grpcWeb.ClientReadableStream<lily_pb.ExcelModel>;
 
   parse(
-    request: lily_pb.File,
+    request: lily_pb.S3File,
     metadata: grpcWeb.Metadata | null,
     callback?: (err: grpcWeb.RpcError,
                response: lily_pb.ExcelModel) => void) {
@@ -86,28 +86,28 @@ export class ExcelClient {
     '/palm.lily.v1.Excel/Generate',
     grpcWeb.MethodType.UNARY,
     lily_pb.ExcelModel,
-    lily_pb.File,
+    lily_pb.S3File,
     (request: lily_pb.ExcelModel) => {
       return request.serializeBinary();
     },
-    lily_pb.File.deserializeBinary
+    lily_pb.S3File.deserializeBinary
   );
 
   generate(
     request: lily_pb.ExcelModel,
-    metadata: grpcWeb.Metadata | null): Promise<lily_pb.File>;
+    metadata: grpcWeb.Metadata | null): Promise<lily_pb.S3File>;
 
   generate(
     request: lily_pb.ExcelModel,
     metadata: grpcWeb.Metadata | null,
     callback: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void): grpcWeb.ClientReadableStream<lily_pb.File>;
+               response: lily_pb.S3File) => void): grpcWeb.ClientReadableStream<lily_pb.S3File>;
 
   generate(
     request: lily_pb.ExcelModel,
     metadata: grpcWeb.Metadata | null,
     callback?: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void) {
+               response: lily_pb.S3File) => void) {
     if (callback !== undefined) {
       return this.client_.rpcCall(
         this.hostname_ +
@@ -127,6 +127,70 @@ export class ExcelClient {
 
 }
 
+export class S3Client {
+  client_: grpcWeb.AbstractClientBase;
+  hostname_: string;
+  credentials_: null | { [index: string]: string; };
+  options_: null | { [index: string]: any; };
+
+  constructor (hostname: string,
+               credentials?: null | { [index: string]: string; },
+               options?: null | { [index: string]: any; }) {
+    if (!options) options = {};
+    if (!credentials) credentials = {};
+    options['format'] = 'binary';
+
+    this.client_ = new grpcWeb.GrpcWebClientBase(options);
+    this.hostname_ = hostname.replace(/\/+$/, '');
+    this.credentials_ = credentials;
+    this.options_ = options;
+  }
+
+  methodDescriptorGetFile = new grpcWeb.MethodDescriptor(
+    '/palm.lily.v1.S3/GetFile',
+    grpcWeb.MethodType.UNARY,
+    lily_pb.S3GetFileRequest,
+    lily_pb.S3GetFileResponse,
+    (request: lily_pb.S3GetFileRequest) => {
+      return request.serializeBinary();
+    },
+    lily_pb.S3GetFileResponse.deserializeBinary
+  );
+
+  getFile(
+    request: lily_pb.S3GetFileRequest,
+    metadata: grpcWeb.Metadata | null): Promise<lily_pb.S3GetFileResponse>;
+
+  getFile(
+    request: lily_pb.S3GetFileRequest,
+    metadata: grpcWeb.Metadata | null,
+    callback: (err: grpcWeb.RpcError,
+               response: lily_pb.S3GetFileResponse) => void): grpcWeb.ClientReadableStream<lily_pb.S3GetFileResponse>;
+
+  getFile(
+    request: lily_pb.S3GetFileRequest,
+    metadata: grpcWeb.Metadata | null,
+    callback?: (err: grpcWeb.RpcError,
+               response: lily_pb.S3GetFileResponse) => void) {
+    if (callback !== undefined) {
+      return this.client_.rpcCall(
+        this.hostname_ +
+          '/palm.lily.v1.S3/GetFile',
+        request,
+        metadata || {},
+        this.methodDescriptorGetFile,
+        callback);
+    }
+    return this.client_.unaryCall(
+    this.hostname_ +
+      '/palm.lily.v1.S3/GetFile',
+    request,
+    metadata || {},
+    this.methodDescriptorGetFile);
+  }
+
+}
+
 export class TexClient {
   client_: grpcWeb.AbstractClientBase;
   hostname_: string;
@@ -150,28 +214,28 @@ export class TexClient {
     '/palm.lily.v1.Tex/ToPdf',
     grpcWeb.MethodType.UNARY,
     lily_pb.TexToRequest,
-    lily_pb.File,
+    lily_pb.S3File,
     (request: lily_pb.TexToRequest) => {
       return request.serializeBinary();
     },
-    lily_pb.File.deserializeBinary
+    lily_pb.S3File.deserializeBinary
   );
 
   toPdf(
     request: lily_pb.TexToRequest,
-    metadata: grpcWeb.Metadata | null): Promise<lily_pb.File>;
+    metadata: grpcWeb.Metadata | null): Promise<lily_pb.S3File>;
 
   toPdf(
     request: lily_pb.TexToRequest,
     metadata: grpcWeb.Metadata | null,
     callback: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void): grpcWeb.ClientReadableStream<lily_pb.File>;
+               response: lily_pb.S3File) => void): grpcWeb.ClientReadableStream<lily_pb.S3File>;
 
   toPdf(
     request: lily_pb.TexToRequest,
     metadata: grpcWeb.Metadata | null,
     callback?: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void) {
+               response: lily_pb.S3File) => void) {
     if (callback !== undefined) {
       return this.client_.rpcCall(
         this.hostname_ +
@@ -193,28 +257,28 @@ export class TexClient {
     '/palm.lily.v1.Tex/ToWord',
     grpcWeb.MethodType.UNARY,
     lily_pb.TexToRequest,
-    lily_pb.File,
+    lily_pb.S3File,
     (request: lily_pb.TexToRequest) => {
       return request.serializeBinary();
     },
-    lily_pb.File.deserializeBinary
+    lily_pb.S3File.deserializeBinary
   );
 
   toWord(
     request: lily_pb.TexToRequest,
-    metadata: grpcWeb.Metadata | null): Promise<lily_pb.File>;
+    metadata: grpcWeb.Metadata | null): Promise<lily_pb.S3File>;
 
   toWord(
     request: lily_pb.TexToRequest,
     metadata: grpcWeb.Metadata | null,
     callback: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void): grpcWeb.ClientReadableStream<lily_pb.File>;
+               response: lily_pb.S3File) => void): grpcWeb.ClientReadableStream<lily_pb.S3File>;
 
   toWord(
     request: lily_pb.TexToRequest,
     metadata: grpcWeb.Metadata | null,
     callback?: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void) {
+               response: lily_pb.S3File) => void) {
     if (callback !== undefined) {
       return this.client_.rpcCall(
         this.hostname_ +
@@ -257,28 +321,28 @@ export class EpubClient {
     '/palm.lily.v1.Epub/Build',
     grpcWeb.MethodType.UNARY,
     lily_pb.EpubBuildRequest,
-    lily_pb.File,
+    lily_pb.S3File,
     (request: lily_pb.EpubBuildRequest) => {
       return request.serializeBinary();
     },
-    lily_pb.File.deserializeBinary
+    lily_pb.S3File.deserializeBinary
   );
 
   build(
     request: lily_pb.EpubBuildRequest,
-    metadata: grpcWeb.Metadata | null): Promise<lily_pb.File>;
+    metadata: grpcWeb.Metadata | null): Promise<lily_pb.S3File>;
 
   build(
     request: lily_pb.EpubBuildRequest,
     metadata: grpcWeb.Metadata | null,
     callback: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void): grpcWeb.ClientReadableStream<lily_pb.File>;
+               response: lily_pb.S3File) => void): grpcWeb.ClientReadableStream<lily_pb.S3File>;
 
   build(
     request: lily_pb.EpubBuildRequest,
     metadata: grpcWeb.Metadata | null,
     callback?: (err: grpcWeb.RpcError,
-               response: lily_pb.File) => void) {
+               response: lily_pb.S3File) => void) {
     if (callback !== undefined) {
       return this.client_.rpcCall(
         this.hostname_ +

+ 1 - 1
dashboard/src/protocols/MorusServiceClientPb.ts

@@ -7,7 +7,7 @@
 // Code generated by protoc-gen-grpc-web. DO NOT EDIT.
 // versions:
 // 	protoc-gen-grpc-web v1.4.2
-// 	protoc              v4.23.4
+// 	protoc              v4.24.3
 // source: morus.proto
 
 

+ 103 - 31
dashboard/src/protocols/lily_pb.d.ts

@@ -1,38 +1,8 @@
 import * as jspb from 'google-protobuf'
 
+import * as google_protobuf_duration_pb from 'google-protobuf/google/protobuf/duration_pb';
 
 
-export class File extends jspb.Message {
-  getContentType(): string;
-  setContentType(value: string): File;
-  hasContentType(): boolean;
-  clearContentType(): File;
-
-  getPayload(): Uint8Array | string;
-  getPayload_asU8(): Uint8Array;
-  getPayload_asB64(): string;
-  setPayload(value: Uint8Array | string): File;
-
-  serializeBinary(): Uint8Array;
-  toObject(includeInstance?: boolean): File.AsObject;
-  static toObject(includeInstance: boolean, msg: File): File.AsObject;
-  static serializeBinaryToWriter(message: File, writer: jspb.BinaryWriter): void;
-  static deserializeBinary(bytes: Uint8Array): File;
-  static deserializeBinaryFromReader(message: File, reader: jspb.BinaryReader): File;
-}
-
-export namespace File {
-  export type AsObject = {
-    contentType?: string,
-    payload: Uint8Array | string,
-  }
-
-  export enum ContentTypeCase { 
-    _CONTENT_TYPE_NOT_SET = 0,
-    CONTENT_TYPE = 1,
-  }
-}
-
 export class ExcelModel extends jspb.Message {
   getSheetsList(): Array<ExcelModel.Sheet>;
   setSheetsList(value: Array<ExcelModel.Sheet>): ExcelModel;
@@ -105,10 +75,98 @@ export namespace ExcelModel {
 
 }
 
+export class S3File extends jspb.Message {
+  getBucket(): string;
+  setBucket(value: string): S3File;
+
+  getName(): string;
+  setName(value: string): S3File;
+
+  getContentType(): string;
+  setContentType(value: string): S3File;
+
+  serializeBinary(): Uint8Array;
+  toObject(includeInstance?: boolean): S3File.AsObject;
+  static toObject(includeInstance: boolean, msg: S3File): S3File.AsObject;
+  static serializeBinaryToWriter(message: S3File, writer: jspb.BinaryWriter): void;
+  static deserializeBinary(bytes: Uint8Array): S3File;
+  static deserializeBinaryFromReader(message: S3File, reader: jspb.BinaryReader): S3File;
+}
+
+export namespace S3File {
+  export type AsObject = {
+    bucket: string,
+    name: string,
+    contentType: string,
+  }
+}
+
+export class S3GetFileRequest extends jspb.Message {
+  getBucket(): string;
+  setBucket(value: string): S3GetFileRequest;
+
+  getName(): string;
+  setName(value: string): S3GetFileRequest;
+
+  getTtl(): google_protobuf_duration_pb.Duration | undefined;
+  setTtl(value?: google_protobuf_duration_pb.Duration): S3GetFileRequest;
+  hasTtl(): boolean;
+  clearTtl(): S3GetFileRequest;
+
+  serializeBinary(): Uint8Array;
+  toObject(includeInstance?: boolean): S3GetFileRequest.AsObject;
+  static toObject(includeInstance: boolean, msg: S3GetFileRequest): S3GetFileRequest.AsObject;
+  static serializeBinaryToWriter(message: S3GetFileRequest, writer: jspb.BinaryWriter): void;
+  static deserializeBinary(bytes: Uint8Array): S3GetFileRequest;
+  static deserializeBinaryFromReader(message: S3GetFileRequest, reader: jspb.BinaryReader): S3GetFileRequest;
+}
+
+export namespace S3GetFileRequest {
+  export type AsObject = {
+    bucket: string,
+    name: string,
+    ttl?: google_protobuf_duration_pb.Duration.AsObject,
+  }
+}
+
+export class S3GetFileResponse extends jspb.Message {
+  getUrl(): string;
+  setUrl(value: string): S3GetFileResponse;
+
+  serializeBinary(): Uint8Array;
+  toObject(includeInstance?: boolean): S3GetFileResponse.AsObject;
+  static toObject(includeInstance: boolean, msg: S3GetFileResponse): S3GetFileResponse.AsObject;
+  static serializeBinaryToWriter(message: S3GetFileResponse, writer: jspb.BinaryWriter): void;
+  static deserializeBinary(bytes: Uint8Array): S3GetFileResponse;
+  static deserializeBinaryFromReader(message: S3GetFileResponse, reader: jspb.BinaryReader): S3GetFileResponse;
+}
+
+export namespace S3GetFileResponse {
+  export type AsObject = {
+    url: string,
+  }
+}
+
 export class TexToRequest extends jspb.Message {
+  getTitle(): string;
+  setTitle(value: string): TexToRequest;
+
   getFilesMap(): jspb.Map<string, Uint8Array | string>;
   clearFilesMap(): TexToRequest;
 
+  getTtl(): google_protobuf_duration_pb.Duration | undefined;
+  setTtl(value?: google_protobuf_duration_pb.Duration): TexToRequest;
+  hasTtl(): boolean;
+  clearTtl(): TexToRequest;
+
+  getOwner(): string;
+  setOwner(value: string): TexToRequest;
+  hasOwner(): boolean;
+  clearOwner(): TexToRequest;
+
+  getPublished(): boolean;
+  setPublished(value: boolean): TexToRequest;
+
   serializeBinary(): Uint8Array;
   toObject(includeInstance?: boolean): TexToRequest.AsObject;
   static toObject(includeInstance: boolean, msg: TexToRequest): TexToRequest.AsObject;
@@ -119,7 +177,21 @@ export class TexToRequest extends jspb.Message {
 
 export namespace TexToRequest {
   export type AsObject = {
+    title: string,
     filesMap: Array<[string, Uint8Array | string]>,
+    ttl?: google_protobuf_duration_pb.Duration.AsObject,
+    owner?: string,
+    published: boolean,
+  }
+
+  export enum TtlCase { 
+    _TTL_NOT_SET = 0,
+    TTL = 7,
+  }
+
+  export enum OwnerCase { 
+    _OWNER_NOT_SET = 0,
+    OWNER = 8,
   }
 }
 

Файловите разлики са ограничени, защото са твърде много
+ 687 - 244
dashboard/src/protocols/lily_pb.js


+ 33 - 10
rpc/protocols/lily.proto

@@ -3,16 +3,13 @@ option java_multiple_files = true;
 option java_package = "com.github.saturn_xiv.palm.plugins.lily.v1";
 package palm.lily.v1;
 
-message File {
-  optional string content_type = 1;
-  bytes payload = 2;
-}
+import "google/protobuf/duration.proto";
 
 // ----------------------------------------------------------------------------
 
 service Excel {
-  rpc Parse(File) returns (ExcelModel) {}
-  rpc Generate(ExcelModel) returns (File) {}
+  rpc Parse(S3File) returns (ExcelModel) {}
+  rpc Generate(ExcelModel) returns (S3File) {}
 }
 
 message ExcelModel {
@@ -27,20 +24,46 @@ message ExcelModel {
   }
   repeated Sheet sheets = 1;
 }
+// ----------------------------------------------------------------------------
+
+service S3 {
+  rpc GetFile(S3GetFileRequest) returns (S3GetFileResponse) {}
+}
+
+message S3File {
+  string bucket = 1;
+  string name = 2;
+
+  string content_type = 9;
+}
 
+message S3GetFileRequest {
+  string bucket = 1;
+  string name = 2;
+  google.protobuf.Duration ttl = 9;
+}
+message S3GetFileResponse {
+  string url = 1;
+}
 // ----------------------------------------------------------------------------
 
 service Tex {
-  rpc ToPdf(TexToRequest) returns (File) {}
-  rpc ToWord(TexToRequest) returns (File) {}
+  rpc ToPdf(TexToRequest) returns (S3File) {}
+  rpc ToWord(TexToRequest) returns (S3File) {}
 }
 
-message TexToRequest { map<string, bytes> files = 1; }
+message TexToRequest {
+  string title = 1;
+  map<string, bytes> files = 2;
+  optional google.protobuf.Duration ttl = 7;
+  optional string owner = 8;
+  bool published = 9;
+}
 
 // ----------------------------------------------------------------------------
 
 service Epub {
-  rpc Build(EpubBuildRequest) returns (File) {}
+  rpc Build(EpubBuildRequest) returns (S3File) {}
 }
 
 message EpubBuildRequest {}

+ 23 - 23
scripts/schema.sh → rpc/schema.sh

@@ -7,30 +7,32 @@ export WORKSPACE=$PWD
 
 # -----------------------------------------------------------------------------
 
+# if [[ "$1" == "php" ]]
+#         then
+#             declare -a folders=(
+#                 "GPBMetadata"
+#                 "Mint"
+#                 "Palm"
+#             )
+#             for f in "${folders[@]}"
+#             do
+#                 local t=$target/$1/$f
+#                 if [ -d $t ]
+#                 then
+#                     rm -f $t
+#                 fi
+#             done            
+#         else
+            
+#         fi
+
 function generate_grpc_by_lang() {
-    local target=$WORKSPACE/clients/$1
+    local target=$WORKSPACE/sdk/$1
     echo "generate code for grpc-$1"
     
     if [ -d $target ]
     then
-        if [[ "$1" == "php" ]]
-        then
-            declare -a folders=(
-                "GPBMetadata"
-                "Mint"
-                "Palm"
-            )
-            for f in "${folders[@]}"
-            do
-                local t=$target/$1/$f
-                if [ -d $t ]
-                then
-                    rm -f $t
-                fi
-            done            
-        else
-            rm -r $target
-        fi
+        rm -r $target        
     fi
     mkdir -p $target
     $PROTOBUF_ROOT/bin/protoc -I $WORKSPACE/protocols \
@@ -45,12 +47,10 @@ function generate_flatbuffers(){
     flatc --rust -o $WORKSPACE/src/$2.rs $WORKSPACE/protocols/$1.fbs
 }
 
-
-
 # https://github.com/grpc/grpc-web#code-generator-plugin
 function generate_grpc_web() {
     echo "generate code for grpc-web"
-    local target=$WORKSPACE/dashboard/src/protocols
+    local target=$1/src/protocols
     if [ -d $target ]
     then
         rm -r $target
@@ -80,7 +80,7 @@ do
     generate_grpc_by_lang $l
 done
 
-generate_grpc_web
+generate_grpc_web $WORKSPACE/../dashboard
 
 # ----------------------------------------------------------
 

+ 116 - 55
rpc/sdk/cpp/lily.grpc.pb.cc

@@ -39,46 +39,46 @@ Excel::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, con
   , rpcmethod_Generate_(Excel_method_names[1], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   {}
 
-::grpc::Status Excel::Stub::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::File& request, ::palm::lily::v1::ExcelModel* response) {
-  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Parse_, context, request, response);
+::grpc::Status Excel::Stub::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::S3File& request, ::palm::lily::v1::ExcelModel* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::S3File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Parse_, context, request, response);
 }
 
-void Excel::Stub::async::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::File* request, ::palm::lily::v1::ExcelModel* response, std::function<void(::grpc::Status)> f) {
-  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Parse_, context, request, response, std::move(f));
+void Excel::Stub::async::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::S3File* request, ::palm::lily::v1::ExcelModel* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::S3File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Parse_, context, request, response, std::move(f));
 }
 
-void Excel::Stub::async::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::File* request, ::palm::lily::v1::ExcelModel* response, ::grpc::ClientUnaryReactor* reactor) {
+void Excel::Stub::async::Parse(::grpc::ClientContext* context, const ::palm::lily::v1::S3File* request, ::palm::lily::v1::ExcelModel* response, ::grpc::ClientUnaryReactor* reactor) {
   ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Parse_, context, request, response, reactor);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::ExcelModel>* Excel::Stub::PrepareAsyncParseRaw(::grpc::ClientContext* context, const ::palm::lily::v1::File& request, ::grpc::CompletionQueue* cq) {
-  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Parse_, context, request);
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::ExcelModel>* Excel::Stub::PrepareAsyncParseRaw(::grpc::ClientContext* context, const ::palm::lily::v1::S3File& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Parse_, context, request);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::ExcelModel>* Excel::Stub::AsyncParseRaw(::grpc::ClientContext* context, const ::palm::lily::v1::File& request, ::grpc::CompletionQueue* cq) {
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::ExcelModel>* Excel::Stub::AsyncParseRaw(::grpc::ClientContext* context, const ::palm::lily::v1::S3File& request, ::grpc::CompletionQueue* cq) {
   auto* result =
     this->PrepareAsyncParseRaw(context, request, cq);
   result->StartCall();
   return result;
 }
 
-::grpc::Status Excel::Stub::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::palm::lily::v1::File* response) {
-  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Generate_, context, request, response);
+::grpc::Status Excel::Stub::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::palm::lily::v1::S3File* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Generate_, context, request, response);
 }
 
-void Excel::Stub::async::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::File* response, std::function<void(::grpc::Status)> f) {
-  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Generate_, context, request, response, std::move(f));
+void Excel::Stub::async::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::S3File* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::ExcelModel, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Generate_, context, request, response, std::move(f));
 }
 
-void Excel::Stub::async::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::File* response, ::grpc::ClientUnaryReactor* reactor) {
+void Excel::Stub::async::Generate(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::S3File* response, ::grpc::ClientUnaryReactor* reactor) {
   ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Generate_, context, request, response, reactor);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Excel::Stub::PrepareAsyncGenerateRaw(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::grpc::CompletionQueue* cq) {
-  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Generate_, context, request);
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Excel::Stub::PrepareAsyncGenerateRaw(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::S3File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Generate_, context, request);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Excel::Stub::AsyncGenerateRaw(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::grpc::CompletionQueue* cq) {
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Excel::Stub::AsyncGenerateRaw(::grpc::ClientContext* context, const ::palm::lily::v1::ExcelModel& request, ::grpc::CompletionQueue* cq) {
   auto* result =
     this->PrepareAsyncGenerateRaw(context, request, cq);
   result->StartCall();
@@ -89,21 +89,21 @@ Excel::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       Excel_method_names[0],
       ::grpc::internal::RpcMethod::NORMAL_RPC,
-      new ::grpc::internal::RpcMethodHandler< Excel::Service, ::palm::lily::v1::File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+      new ::grpc::internal::RpcMethodHandler< Excel::Service, ::palm::lily::v1::S3File, ::palm::lily::v1::ExcelModel, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
           [](Excel::Service* service,
              ::grpc::ServerContext* ctx,
-             const ::palm::lily::v1::File* req,
+             const ::palm::lily::v1::S3File* req,
              ::palm::lily::v1::ExcelModel* resp) {
                return service->Parse(ctx, req, resp);
              }, this)));
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       Excel_method_names[1],
       ::grpc::internal::RpcMethod::NORMAL_RPC,
-      new ::grpc::internal::RpcMethodHandler< Excel::Service, ::palm::lily::v1::ExcelModel, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+      new ::grpc::internal::RpcMethodHandler< Excel::Service, ::palm::lily::v1::ExcelModel, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
           [](Excel::Service* service,
              ::grpc::ServerContext* ctx,
              const ::palm::lily::v1::ExcelModel* req,
-             ::palm::lily::v1::File* resp) {
+             ::palm::lily::v1::S3File* resp) {
                return service->Generate(ctx, req, resp);
              }, this)));
 }
@@ -111,14 +111,75 @@ Excel::Service::Service() {
 Excel::Service::~Service() {
 }
 
-::grpc::Status Excel::Service::Parse(::grpc::ServerContext* context, const ::palm::lily::v1::File* request, ::palm::lily::v1::ExcelModel* response) {
+::grpc::Status Excel::Service::Parse(::grpc::ServerContext* context, const ::palm::lily::v1::S3File* request, ::palm::lily::v1::ExcelModel* response) {
   (void) context;
   (void) request;
   (void) response;
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
-::grpc::Status Excel::Service::Generate(::grpc::ServerContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::File* response) {
+::grpc::Status Excel::Service::Generate(::grpc::ServerContext* context, const ::palm::lily::v1::ExcelModel* request, ::palm::lily::v1::S3File* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+
+static const char* S3_method_names[] = {
+  "/palm.lily.v1.S3/GetFile",
+};
+
+std::unique_ptr< S3::Stub> S3::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
+  (void)options;
+  std::unique_ptr< S3::Stub> stub(new S3::Stub(channel, options));
+  return stub;
+}
+
+S3::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options)
+  : channel_(channel), rpcmethod_GetFile_(S3_method_names[0], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  {}
+
+::grpc::Status S3::Stub::GetFile(::grpc::ClientContext* context, const ::palm::lily::v1::S3GetFileRequest& request, ::palm::lily::v1::S3GetFileResponse* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::S3GetFileRequest, ::palm::lily::v1::S3GetFileResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_GetFile_, context, request, response);
+}
+
+void S3::Stub::async::GetFile(::grpc::ClientContext* context, const ::palm::lily::v1::S3GetFileRequest* request, ::palm::lily::v1::S3GetFileResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::S3GetFileRequest, ::palm::lily::v1::S3GetFileResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_GetFile_, context, request, response, std::move(f));
+}
+
+void S3::Stub::async::GetFile(::grpc::ClientContext* context, const ::palm::lily::v1::S3GetFileRequest* request, ::palm::lily::v1::S3GetFileResponse* response, ::grpc::ClientUnaryReactor* reactor) {
+  ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_GetFile_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3GetFileResponse>* S3::Stub::PrepareAsyncGetFileRaw(::grpc::ClientContext* context, const ::palm::lily::v1::S3GetFileRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::S3GetFileResponse, ::palm::lily::v1::S3GetFileRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_GetFile_, context, request);
+}
+
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3GetFileResponse>* S3::Stub::AsyncGetFileRaw(::grpc::ClientContext* context, const ::palm::lily::v1::S3GetFileRequest& request, ::grpc::CompletionQueue* cq) {
+  auto* result =
+    this->PrepareAsyncGetFileRaw(context, request, cq);
+  result->StartCall();
+  return result;
+}
+
+S3::Service::Service() {
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      S3_method_names[0],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< S3::Service, ::palm::lily::v1::S3GetFileRequest, ::palm::lily::v1::S3GetFileResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+          [](S3::Service* service,
+             ::grpc::ServerContext* ctx,
+             const ::palm::lily::v1::S3GetFileRequest* req,
+             ::palm::lily::v1::S3GetFileResponse* resp) {
+               return service->GetFile(ctx, req, resp);
+             }, this)));
+}
+
+S3::Service::~Service() {
+}
+
+::grpc::Status S3::Service::GetFile(::grpc::ServerContext* context, const ::palm::lily::v1::S3GetFileRequest* request, ::palm::lily::v1::S3GetFileResponse* response) {
   (void) context;
   (void) request;
   (void) response;
@@ -142,46 +203,46 @@ Tex::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const
   , rpcmethod_ToWord_(Tex_method_names[1], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   {}
 
-::grpc::Status Tex::Stub::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::palm::lily::v1::File* response) {
-  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ToPdf_, context, request, response);
+::grpc::Status Tex::Stub::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::palm::lily::v1::S3File* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ToPdf_, context, request, response);
 }
 
-void Tex::Stub::async::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response, std::function<void(::grpc::Status)> f) {
-  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToPdf_, context, request, response, std::move(f));
+void Tex::Stub::async::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToPdf_, context, request, response, std::move(f));
 }
 
-void Tex::Stub::async::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response, ::grpc::ClientUnaryReactor* reactor) {
+void Tex::Stub::async::ToPdf(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response, ::grpc::ClientUnaryReactor* reactor) {
   ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToPdf_, context, request, response, reactor);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Tex::Stub::PrepareAsyncToPdfRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
-  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::File, ::palm::lily::v1::TexToRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ToPdf_, context, request);
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Tex::Stub::PrepareAsyncToPdfRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::S3File, ::palm::lily::v1::TexToRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ToPdf_, context, request);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Tex::Stub::AsyncToPdfRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Tex::Stub::AsyncToPdfRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
   auto* result =
     this->PrepareAsyncToPdfRaw(context, request, cq);
   result->StartCall();
   return result;
 }
 
-::grpc::Status Tex::Stub::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::palm::lily::v1::File* response) {
-  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ToWord_, context, request, response);
+::grpc::Status Tex::Stub::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::palm::lily::v1::S3File* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ToWord_, context, request, response);
 }
 
-void Tex::Stub::async::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response, std::function<void(::grpc::Status)> f) {
-  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToWord_, context, request, response, std::move(f));
+void Tex::Stub::async::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToWord_, context, request, response, std::move(f));
 }
 
-void Tex::Stub::async::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response, ::grpc::ClientUnaryReactor* reactor) {
+void Tex::Stub::async::ToWord(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response, ::grpc::ClientUnaryReactor* reactor) {
   ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ToWord_, context, request, response, reactor);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Tex::Stub::PrepareAsyncToWordRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
-  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::File, ::palm::lily::v1::TexToRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ToWord_, context, request);
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Tex::Stub::PrepareAsyncToWordRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::S3File, ::palm::lily::v1::TexToRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ToWord_, context, request);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Tex::Stub::AsyncToWordRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Tex::Stub::AsyncToWordRaw(::grpc::ClientContext* context, const ::palm::lily::v1::TexToRequest& request, ::grpc::CompletionQueue* cq) {
   auto* result =
     this->PrepareAsyncToWordRaw(context, request, cq);
   result->StartCall();
@@ -192,21 +253,21 @@ Tex::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       Tex_method_names[0],
       ::grpc::internal::RpcMethod::NORMAL_RPC,
-      new ::grpc::internal::RpcMethodHandler< Tex::Service, ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+      new ::grpc::internal::RpcMethodHandler< Tex::Service, ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
           [](Tex::Service* service,
              ::grpc::ServerContext* ctx,
              const ::palm::lily::v1::TexToRequest* req,
-             ::palm::lily::v1::File* resp) {
+             ::palm::lily::v1::S3File* resp) {
                return service->ToPdf(ctx, req, resp);
              }, this)));
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       Tex_method_names[1],
       ::grpc::internal::RpcMethod::NORMAL_RPC,
-      new ::grpc::internal::RpcMethodHandler< Tex::Service, ::palm::lily::v1::TexToRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+      new ::grpc::internal::RpcMethodHandler< Tex::Service, ::palm::lily::v1::TexToRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
           [](Tex::Service* service,
              ::grpc::ServerContext* ctx,
              const ::palm::lily::v1::TexToRequest* req,
-             ::palm::lily::v1::File* resp) {
+             ::palm::lily::v1::S3File* resp) {
                return service->ToWord(ctx, req, resp);
              }, this)));
 }
@@ -214,14 +275,14 @@ Tex::Service::Service() {
 Tex::Service::~Service() {
 }
 
-::grpc::Status Tex::Service::ToPdf(::grpc::ServerContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response) {
+::grpc::Status Tex::Service::ToPdf(::grpc::ServerContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response) {
   (void) context;
   (void) request;
   (void) response;
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
-::grpc::Status Tex::Service::ToWord(::grpc::ServerContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::File* response) {
+::grpc::Status Tex::Service::ToWord(::grpc::ServerContext* context, const ::palm::lily::v1::TexToRequest* request, ::palm::lily::v1::S3File* response) {
   (void) context;
   (void) request;
   (void) response;
@@ -243,23 +304,23 @@ Epub::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, cons
   : channel_(channel), rpcmethod_Build_(Epub_method_names[0], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   {}
 
-::grpc::Status Epub::Stub::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::palm::lily::v1::File* response) {
-  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Build_, context, request, response);
+::grpc::Status Epub::Stub::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::palm::lily::v1::S3File* response) {
+  return ::grpc::internal::BlockingUnaryCall< ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Build_, context, request, response);
 }
 
-void Epub::Stub::async::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::File* response, std::function<void(::grpc::Status)> f) {
-  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Build_, context, request, response, std::move(f));
+void Epub::Stub::async::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::S3File* response, std::function<void(::grpc::Status)> f) {
+  ::grpc::internal::CallbackUnaryCall< ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Build_, context, request, response, std::move(f));
 }
 
-void Epub::Stub::async::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::File* response, ::grpc::ClientUnaryReactor* reactor) {
+void Epub::Stub::async::Build(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::S3File* response, ::grpc::ClientUnaryReactor* reactor) {
   ::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_Build_, context, request, response, reactor);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Epub::Stub::PrepareAsyncBuildRaw(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::grpc::CompletionQueue* cq) {
-  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::File, ::palm::lily::v1::EpubBuildRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Build_, context, request);
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Epub::Stub::PrepareAsyncBuildRaw(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::palm::lily::v1::S3File, ::palm::lily::v1::EpubBuildRequest, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_Build_, context, request);
 }
 
-::grpc::ClientAsyncResponseReader< ::palm::lily::v1::File>* Epub::Stub::AsyncBuildRaw(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::grpc::CompletionQueue* cq) {
+::grpc::ClientAsyncResponseReader< ::palm::lily::v1::S3File>* Epub::Stub::AsyncBuildRaw(::grpc::ClientContext* context, const ::palm::lily::v1::EpubBuildRequest& request, ::grpc::CompletionQueue* cq) {
   auto* result =
     this->PrepareAsyncBuildRaw(context, request, cq);
   result->StartCall();
@@ -270,11 +331,11 @@ Epub::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       Epub_method_names[0],
       ::grpc::internal::RpcMethod::NORMAL_RPC,
-      new ::grpc::internal::RpcMethodHandler< Epub::Service, ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
+      new ::grpc::internal::RpcMethodHandler< Epub::Service, ::palm::lily::v1::EpubBuildRequest, ::palm::lily::v1::S3File, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
           [](Epub::Service* service,
              ::grpc::ServerContext* ctx,
              const ::palm::lily::v1::EpubBuildRequest* req,
-             ::palm::lily::v1::File* resp) {
+             ::palm::lily::v1::S3File* resp) {
                return service->Build(ctx, req, resp);
              }, this)));
 }
@@ -282,7 +343,7 @@ Epub::Service::Service() {
 Epub::Service::~Service() {
 }
 
-::grpc::Status Epub::Service::Build(::grpc::ServerContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::File* response) {
+::grpc::Status Epub::Service::Build(::grpc::ServerContext* context, const ::palm::lily::v1::EpubBuildRequest* request, ::palm::lily::v1::S3File* response) {
   (void) context;
   (void) request;
   (void) response;

Файловите разлики са ограничени, защото са твърде много
+ 369 - 164
rpc/sdk/cpp/lily.grpc.pb.h


Файловите разлики са ограничени, защото са твърде много
+ 307 - 469
rpc/sdk/cpp/lily.pb.cc


Файловите разлики са ограничени, защото са твърде много
+ 223 - 409
rpc/sdk/cpp/lily.pb.h


+ 176 - 195
rpc/sdk/cpp/morus.pb.cc

@@ -11,26 +11,28 @@
 #include "google/protobuf/generated_message_reflection.h"
 #include "google/protobuf/reflection_ops.h"
 #include "google/protobuf/wire_format.h"
+#include "google/protobuf/generated_message_tctable_impl.h"
 // @@protoc_insertion_point(includes)
 
 // Must be included last.
 #include "google/protobuf/port_def.inc"
 PROTOBUF_PRAGMA_INIT_SEG
-namespace _pb = ::PROTOBUF_NAMESPACE_ID;
-namespace _pbi = ::PROTOBUF_NAMESPACE_ID::internal;
+namespace _pb = ::google::protobuf;
+namespace _pbi = ::google::protobuf::internal;
+namespace _fl = ::google::protobuf::internal::field_layout;
 namespace mint {
 namespace morus {
 namespace v1 {
-template <typename>
-PROTOBUF_CONSTEXPR MarkdownToHtmlRequest::MarkdownToHtmlRequest(
-    ::_pbi::ConstantInitialized): _impl_{
-    /*decltype(_impl_.payload_)*/ {
-    &::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized {}
-  }
-
-  , /*decltype(_impl_.sanitize_)*/ false
-
-  , /*decltype(_impl_._cached_size_)*/{}} {}
+        template <typename>
+PROTOBUF_CONSTEXPR MarkdownToHtmlRequest::MarkdownToHtmlRequest(::_pbi::ConstantInitialized)
+    : _impl_{
+      /*decltype(_impl_.payload_)*/ {
+          &::_pbi::fixed_address_empty_string,
+          ::_pbi::ConstantInitialized{},
+      },
+      /*decltype(_impl_.sanitize_)*/ false,
+      /*decltype(_impl_._cached_size_)*/ {},
+    } {}
 struct MarkdownToHtmlRequestDefaultTypeInternal {
   PROTOBUF_CONSTEXPR MarkdownToHtmlRequestDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
   ~MarkdownToHtmlRequestDefaultTypeInternal() {}
@@ -41,14 +43,15 @@ struct MarkdownToHtmlRequestDefaultTypeInternal {
 
 PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT
     PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MarkdownToHtmlRequestDefaultTypeInternal _MarkdownToHtmlRequest_default_instance_;
-template <typename>
-PROTOBUF_CONSTEXPR MarkdownToHtmlResponse::MarkdownToHtmlResponse(
-    ::_pbi::ConstantInitialized): _impl_{
-    /*decltype(_impl_.payload_)*/ {
-    &::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized {}
-  }
-
-  , /*decltype(_impl_._cached_size_)*/{}} {}
+        template <typename>
+PROTOBUF_CONSTEXPR MarkdownToHtmlResponse::MarkdownToHtmlResponse(::_pbi::ConstantInitialized)
+    : _impl_{
+      /*decltype(_impl_.payload_)*/ {
+          &::_pbi::fixed_address_empty_string,
+          ::_pbi::ConstantInitialized{},
+      },
+      /*decltype(_impl_._cached_size_)*/ {},
+    } {}
 struct MarkdownToHtmlResponseDefaultTypeInternal {
   PROTOBUF_CONSTEXPR MarkdownToHtmlResponseDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {}
   ~MarkdownToHtmlResponseDefaultTypeInternal() {}
@@ -92,8 +95,8 @@ const ::uint32_t TableStruct_morus_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(
 
 static const ::_pbi::MigrationSchema
     schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
-        { 0, -1, -1, sizeof(::mint::morus::v1::MarkdownToHtmlRequest)},
-        { 10, -1, -1, sizeof(::mint::morus::v1::MarkdownToHtmlResponse)},
+        {0, -1, -1, sizeof(::mint::morus::v1::MarkdownToHtmlRequest)},
+        {10, -1, -1, sizeof(::mint::morus::v1::MarkdownToHtmlResponse)},
 };
 
 static const ::_pb::Message* const file_default_instances[] = {
@@ -155,22 +158,21 @@ class MarkdownToHtmlRequest::_Internal {
  public:
 };
 
-MarkdownToHtmlRequest::MarkdownToHtmlRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena) {
+MarkdownToHtmlRequest::MarkdownToHtmlRequest(::google::protobuf::Arena* arena)
+    : ::google::protobuf::Message(arena) {
   SharedCtor(arena);
   // @@protoc_insertion_point(arena_constructor:mint.morus.v1.MarkdownToHtmlRequest)
 }
-MarkdownToHtmlRequest::MarkdownToHtmlRequest(const MarkdownToHtmlRequest& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
-  MarkdownToHtmlRequest* const _this = this; (void)_this;
+MarkdownToHtmlRequest::MarkdownToHtmlRequest(const MarkdownToHtmlRequest& from) : ::google::protobuf::Message() {
+  MarkdownToHtmlRequest* const _this = this;
+  (void)_this;
   new (&_impl_) Impl_{
-      decltype(_impl_.payload_) {}
-
-    , decltype(_impl_.sanitize_) {}
-
-    , /*decltype(_impl_._cached_size_)*/{}};
-
-  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+      decltype(_impl_.payload_){},
+      decltype(_impl_.sanitize_){},
+      /*decltype(_impl_._cached_size_)*/ {},
+  };
+  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
+      from._internal_metadata_);
   _impl_.payload_.InitDefault();
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         _impl_.payload_.Set("", GetArenaForAllocation());
@@ -179,43 +181,35 @@ MarkdownToHtmlRequest::MarkdownToHtmlRequest(const MarkdownToHtmlRequest& from)
     _this->_impl_.payload_.Set(from._internal_payload(), _this->GetArenaForAllocation());
   }
   _this->_impl_.sanitize_ = from._impl_.sanitize_;
+
   // @@protoc_insertion_point(copy_constructor:mint.morus.v1.MarkdownToHtmlRequest)
 }
-
 inline void MarkdownToHtmlRequest::SharedCtor(::_pb::Arena* arena) {
   (void)arena;
   new (&_impl_) Impl_{
-      decltype(_impl_.payload_) {}
-
-    , decltype(_impl_.sanitize_) { false }
-
-    , /*decltype(_impl_._cached_size_)*/{}
+      decltype(_impl_.payload_){},
+      decltype(_impl_.sanitize_){false},
+      /*decltype(_impl_._cached_size_)*/ {},
   };
   _impl_.payload_.InitDefault();
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         _impl_.payload_.Set("", GetArenaForAllocation());
   #endif  // PROTOBUF_FORCE_COPY_DEFAULT_STRING
 }
-
 MarkdownToHtmlRequest::~MarkdownToHtmlRequest() {
   // @@protoc_insertion_point(destructor:mint.morus.v1.MarkdownToHtmlRequest)
-  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
-  (void)arena;
-    return;
-  }
+  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
   SharedDtor();
 }
-
 inline void MarkdownToHtmlRequest::SharedDtor() {
   ABSL_DCHECK(GetArenaForAllocation() == nullptr);
   _impl_.payload_.Destroy();
 }
-
 void MarkdownToHtmlRequest::SetCachedSize(int size) const {
   _impl_._cached_size_.Set(size);
 }
 
-void MarkdownToHtmlRequest::Clear() {
+PROTOBUF_NOINLINE void MarkdownToHtmlRequest::Clear() {
 // @@protoc_insertion_point(message_clear_start:mint.morus.v1.MarkdownToHtmlRequest)
   ::uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
@@ -223,69 +217,67 @@ void MarkdownToHtmlRequest::Clear() {
 
   _impl_.payload_.ClearToEmpty();
   _impl_.sanitize_ = false;
-  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
 }
 
-const char* MarkdownToHtmlRequest::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) {
-#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
-  while (!ctx->Done(&ptr)) {
-    ::uint32_t tag;
-    ptr = ::_pbi::ReadTag(ptr, &tag);
-    switch (tag >> 3) {
-      // string payload = 1;
-      case 1:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<::uint8_t>(tag) == 10)) {
-          auto str = _internal_mutable_payload();
-          ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx);
-          CHK_(ptr);
-          CHK_(::_pbi::VerifyUTF8(str, "mint.morus.v1.MarkdownToHtmlRequest.payload"));
-        } else {
-          goto handle_unusual;
-        }
-        continue;
-      // bool sanitize = 2;
-      case 2:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<::uint8_t>(tag) == 16)) {
-          _impl_.sanitize_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr);
-          CHK_(ptr);
-        } else {
-          goto handle_unusual;
-        }
-        continue;
-      default:
-        goto handle_unusual;
-    }  // switch
-  handle_unusual:
-    if ((tag == 0) || ((tag & 7) == 4)) {
-      CHK_(ptr);
-      ctx->SetLastTag(tag);
-      goto message_done;
-    }
-    ptr = UnknownFieldParse(
-        tag,
-        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
-        ptr, ctx);
-    CHK_(ptr != nullptr);
-  }  // while
-message_done:
+const char* MarkdownToHtmlRequest::_InternalParse(
+    const char* ptr, ::_pbi::ParseContext* ctx) {
+  ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header);
   return ptr;
-failure:
-  ptr = nullptr;
-  goto message_done;
-#undef CHK_
 }
 
+
+PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
+const ::_pbi::TcParseTable<1, 2, 0, 51, 2> MarkdownToHtmlRequest::_table_ = {
+  {
+    0,  // no _has_bits_
+    0, // no _extensions_
+    2, 8,  // max_field_number, fast_idx_mask
+    offsetof(decltype(_table_), field_lookup_table),
+    4294967292,  // skipmap
+    offsetof(decltype(_table_), field_entries),
+    2,  // num_field_entries
+    0,  // num_aux_entries
+    offsetof(decltype(_table_), field_names),  // no aux_entries
+    &_MarkdownToHtmlRequest_default_instance_._instance,
+    ::_pbi::TcParser::GenericFallback,  // fallback
+  }, {{
+    // bool sanitize = 2;
+    {::_pbi::TcParser::SingularVarintNoZag1<bool, offsetof(MarkdownToHtmlRequest, _impl_.sanitize_), 63>(),
+     {16, 63, 0, PROTOBUF_FIELD_OFFSET(MarkdownToHtmlRequest, _impl_.sanitize_)}},
+    // string payload = 1;
+    {::_pbi::TcParser::FastUS1,
+     {10, 63, 0, PROTOBUF_FIELD_OFFSET(MarkdownToHtmlRequest, _impl_.payload_)}},
+  }}, {{
+    65535, 65535
+  }}, {{
+    // string payload = 1;
+    {PROTOBUF_FIELD_OFFSET(MarkdownToHtmlRequest, _impl_.payload_), 0, 0,
+    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
+    // bool sanitize = 2;
+    {PROTOBUF_FIELD_OFFSET(MarkdownToHtmlRequest, _impl_.sanitize_), 0, 0,
+    (0 | ::_fl::kFcSingular | ::_fl::kBool)},
+  }},
+  // no aux_entries
+  {{
+    "\43\7\0\0\0\0\0\0"
+    "mint.morus.v1.MarkdownToHtmlRequest"
+    "payload"
+  }},
+};
+
 ::uint8_t* MarkdownToHtmlRequest::_InternalSerialize(
-    ::uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+    ::uint8_t* target,
+    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
   // @@protoc_insertion_point(serialize_to_array_start:mint.morus.v1.MarkdownToHtmlRequest)
   ::uint32_t cached_has_bits = 0;
-  (void) cached_has_bits;
+  (void)cached_has_bits;
 
   // string payload = 1;
   if (!this->_internal_payload().empty()) {
     const std::string& _s = this->_internal_payload();
-    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
-        _s.data(), static_cast<int>(_s.length()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, "mint.morus.v1.MarkdownToHtmlRequest.payload");
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "mint.morus.v1.MarkdownToHtmlRequest.payload");
     target = stream->WriteStringMaybeAliased(1, _s, target);
   }
 
@@ -297,8 +289,9 @@ failure:
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
-    target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+    target =
+        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
+            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
   }
   // @@protoc_insertion_point(serialize_to_array_end:mint.morus.v1.MarkdownToHtmlRequest)
   return target;
@@ -314,7 +307,7 @@ failure:
 
   // string payload = 1;
   if (!this->_internal_payload().empty()) {
-    total_size += 1 + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+    total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                     this->_internal_payload());
   }
 
@@ -326,14 +319,14 @@ failure:
   return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData MarkdownToHtmlRequest::_class_data_ = {
-    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck,
+const ::google::protobuf::Message::ClassData MarkdownToHtmlRequest::_class_data_ = {
+    ::google::protobuf::Message::CopyWithSourceCheck,
     MarkdownToHtmlRequest::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*MarkdownToHtmlRequest::GetClassData() const { return &_class_data_; }
+const ::google::protobuf::Message::ClassData*MarkdownToHtmlRequest::GetClassData() const { return &_class_data_; }
 
 
-void MarkdownToHtmlRequest::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) {
+void MarkdownToHtmlRequest::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) {
   auto* const _this = static_cast<MarkdownToHtmlRequest*>(&to_msg);
   auto& from = static_cast<const MarkdownToHtmlRequest&>(from_msg);
   // @@protoc_insertion_point(class_specific_merge_from_start:mint.morus.v1.MarkdownToHtmlRequest)
@@ -347,7 +340,7 @@ void MarkdownToHtmlRequest::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg,
   if (from._internal_sanitize() != 0) {
     _this->_internal_set_sanitize(from._internal_sanitize());
   }
-  _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
 }
 
 void MarkdownToHtmlRequest::CopyFrom(const MarkdownToHtmlRequest& from) {
@@ -357,7 +350,7 @@ void MarkdownToHtmlRequest::CopyFrom(const MarkdownToHtmlRequest& from) {
   MergeFrom(from);
 }
 
-bool MarkdownToHtmlRequest::IsInitialized() const {
+PROTOBUF_NOINLINE bool MarkdownToHtmlRequest::IsInitialized() const {
   return true;
 }
 
@@ -368,11 +361,10 @@ void MarkdownToHtmlRequest::InternalSwap(MarkdownToHtmlRequest* other) {
   _internal_metadata_.InternalSwap(&other->_internal_metadata_);
   ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.payload_, lhs_arena,
                                        &other->_impl_.payload_, rhs_arena);
-
-  swap(_impl_.sanitize_, other->_impl_.sanitize_);
+        swap(_impl_.sanitize_, other->_impl_.sanitize_);
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata MarkdownToHtmlRequest::GetMetadata() const {
+::google::protobuf::Metadata MarkdownToHtmlRequest::GetMetadata() const {
   return ::_pbi::AssignDescriptors(
       &descriptor_table_morus_2eproto_getter, &descriptor_table_morus_2eproto_once,
       file_level_metadata_morus_2eproto[0]);
@@ -383,20 +375,20 @@ class MarkdownToHtmlResponse::_Internal {
  public:
 };
 
-MarkdownToHtmlResponse::MarkdownToHtmlResponse(::PROTOBUF_NAMESPACE_ID::Arena* arena)
-  : ::PROTOBUF_NAMESPACE_ID::Message(arena) {
+MarkdownToHtmlResponse::MarkdownToHtmlResponse(::google::protobuf::Arena* arena)
+    : ::google::protobuf::Message(arena) {
   SharedCtor(arena);
   // @@protoc_insertion_point(arena_constructor:mint.morus.v1.MarkdownToHtmlResponse)
 }
-MarkdownToHtmlResponse::MarkdownToHtmlResponse(const MarkdownToHtmlResponse& from)
-  : ::PROTOBUF_NAMESPACE_ID::Message() {
-  MarkdownToHtmlResponse* const _this = this; (void)_this;
+MarkdownToHtmlResponse::MarkdownToHtmlResponse(const MarkdownToHtmlResponse& from) : ::google::protobuf::Message() {
+  MarkdownToHtmlResponse* const _this = this;
+  (void)_this;
   new (&_impl_) Impl_{
-      decltype(_impl_.payload_) {}
-
-    , /*decltype(_impl_._cached_size_)*/{}};
-
-  _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+      decltype(_impl_.payload_){},
+      /*decltype(_impl_._cached_size_)*/ {},
+  };
+  _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(
+      from._internal_metadata_);
   _impl_.payload_.InitDefault();
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         _impl_.payload_.Set("", GetArenaForAllocation());
@@ -404,107 +396,102 @@ MarkdownToHtmlResponse::MarkdownToHtmlResponse(const MarkdownToHtmlResponse& fro
   if (!from._internal_payload().empty()) {
     _this->_impl_.payload_.Set(from._internal_payload(), _this->GetArenaForAllocation());
   }
+
   // @@protoc_insertion_point(copy_constructor:mint.morus.v1.MarkdownToHtmlResponse)
 }
-
 inline void MarkdownToHtmlResponse::SharedCtor(::_pb::Arena* arena) {
   (void)arena;
   new (&_impl_) Impl_{
-      decltype(_impl_.payload_) {}
-
-    , /*decltype(_impl_._cached_size_)*/{}
+      decltype(_impl_.payload_){},
+      /*decltype(_impl_._cached_size_)*/ {},
   };
   _impl_.payload_.InitDefault();
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         _impl_.payload_.Set("", GetArenaForAllocation());
   #endif  // PROTOBUF_FORCE_COPY_DEFAULT_STRING
 }
-
 MarkdownToHtmlResponse::~MarkdownToHtmlResponse() {
   // @@protoc_insertion_point(destructor:mint.morus.v1.MarkdownToHtmlResponse)
-  if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) {
-  (void)arena;
-    return;
-  }
+  _internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>();
   SharedDtor();
 }
-
 inline void MarkdownToHtmlResponse::SharedDtor() {
   ABSL_DCHECK(GetArenaForAllocation() == nullptr);
   _impl_.payload_.Destroy();
 }
-
 void MarkdownToHtmlResponse::SetCachedSize(int size) const {
   _impl_._cached_size_.Set(size);
 }
 
-void MarkdownToHtmlResponse::Clear() {
+PROTOBUF_NOINLINE void MarkdownToHtmlResponse::Clear() {
 // @@protoc_insertion_point(message_clear_start:mint.morus.v1.MarkdownToHtmlResponse)
   ::uint32_t cached_has_bits = 0;
   // Prevent compiler warnings about cached_has_bits being unused
   (void) cached_has_bits;
 
   _impl_.payload_.ClearToEmpty();
-  _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+  _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>();
 }
 
-const char* MarkdownToHtmlResponse::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) {
-#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
-  while (!ctx->Done(&ptr)) {
-    ::uint32_t tag;
-    ptr = ::_pbi::ReadTag(ptr, &tag);
-    switch (tag >> 3) {
-      // string payload = 1;
-      case 1:
-        if (PROTOBUF_PREDICT_TRUE(static_cast<::uint8_t>(tag) == 10)) {
-          auto str = _internal_mutable_payload();
-          ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx);
-          CHK_(ptr);
-          CHK_(::_pbi::VerifyUTF8(str, "mint.morus.v1.MarkdownToHtmlResponse.payload"));
-        } else {
-          goto handle_unusual;
-        }
-        continue;
-      default:
-        goto handle_unusual;
-    }  // switch
-  handle_unusual:
-    if ((tag == 0) || ((tag & 7) == 4)) {
-      CHK_(ptr);
-      ctx->SetLastTag(tag);
-      goto message_done;
-    }
-    ptr = UnknownFieldParse(
-        tag,
-        _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(),
-        ptr, ctx);
-    CHK_(ptr != nullptr);
-  }  // while
-message_done:
+const char* MarkdownToHtmlResponse::_InternalParse(
+    const char* ptr, ::_pbi::ParseContext* ctx) {
+  ptr = ::_pbi::TcParser::ParseLoop(this, ptr, ctx, &_table_.header);
   return ptr;
-failure:
-  ptr = nullptr;
-  goto message_done;
-#undef CHK_
 }
 
+
+PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1
+const ::_pbi::TcParseTable<0, 1, 0, 52, 2> MarkdownToHtmlResponse::_table_ = {
+  {
+    0,  // no _has_bits_
+    0, // no _extensions_
+    1, 0,  // max_field_number, fast_idx_mask
+    offsetof(decltype(_table_), field_lookup_table),
+    4294967294,  // skipmap
+    offsetof(decltype(_table_), field_entries),
+    1,  // num_field_entries
+    0,  // num_aux_entries
+    offsetof(decltype(_table_), field_names),  // no aux_entries
+    &_MarkdownToHtmlResponse_default_instance_._instance,
+    ::_pbi::TcParser::GenericFallback,  // fallback
+  }, {{
+    // string payload = 1;
+    {::_pbi::TcParser::FastUS1,
+     {10, 63, 0, PROTOBUF_FIELD_OFFSET(MarkdownToHtmlResponse, _impl_.payload_)}},
+  }}, {{
+    65535, 65535
+  }}, {{
+    // string payload = 1;
+    {PROTOBUF_FIELD_OFFSET(MarkdownToHtmlResponse, _impl_.payload_), 0, 0,
+    (0 | ::_fl::kFcSingular | ::_fl::kUtf8String | ::_fl::kRepAString)},
+  }},
+  // no aux_entries
+  {{
+    "\44\7\0\0\0\0\0\0"
+    "mint.morus.v1.MarkdownToHtmlResponse"
+    "payload"
+  }},
+};
+
 ::uint8_t* MarkdownToHtmlResponse::_InternalSerialize(
-    ::uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+    ::uint8_t* target,
+    ::google::protobuf::io::EpsCopyOutputStream* stream) const {
   // @@protoc_insertion_point(serialize_to_array_start:mint.morus.v1.MarkdownToHtmlResponse)
   ::uint32_t cached_has_bits = 0;
-  (void) cached_has_bits;
+  (void)cached_has_bits;
 
   // string payload = 1;
   if (!this->_internal_payload().empty()) {
     const std::string& _s = this->_internal_payload();
-    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
-        _s.data(), static_cast<int>(_s.length()), ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, "mint.morus.v1.MarkdownToHtmlResponse.payload");
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+        _s.data(), static_cast<int>(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "mint.morus.v1.MarkdownToHtmlResponse.payload");
     target = stream->WriteStringMaybeAliased(1, _s, target);
   }
 
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
-    target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
-        _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream);
+    target =
+        ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray(
+            _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream);
   }
   // @@protoc_insertion_point(serialize_to_array_end:mint.morus.v1.MarkdownToHtmlResponse)
   return target;
@@ -520,21 +507,21 @@ failure:
 
   // string payload = 1;
   if (!this->_internal_payload().empty()) {
-    total_size += 1 + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+    total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize(
                                     this->_internal_payload());
   }
 
   return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_);
 }
 
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData MarkdownToHtmlResponse::_class_data_ = {
-    ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck,
+const ::google::protobuf::Message::ClassData MarkdownToHtmlResponse::_class_data_ = {
+    ::google::protobuf::Message::CopyWithSourceCheck,
     MarkdownToHtmlResponse::MergeImpl
 };
-const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*MarkdownToHtmlResponse::GetClassData() const { return &_class_data_; }
+const ::google::protobuf::Message::ClassData*MarkdownToHtmlResponse::GetClassData() const { return &_class_data_; }
 
 
-void MarkdownToHtmlResponse::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) {
+void MarkdownToHtmlResponse::MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg) {
   auto* const _this = static_cast<MarkdownToHtmlResponse*>(&to_msg);
   auto& from = static_cast<const MarkdownToHtmlResponse&>(from_msg);
   // @@protoc_insertion_point(class_specific_merge_from_start:mint.morus.v1.MarkdownToHtmlResponse)
@@ -545,7 +532,7 @@ void MarkdownToHtmlResponse::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg,
   if (!from._internal_payload().empty()) {
     _this->_internal_set_payload(from._internal_payload());
   }
-  _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_);
+  _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_);
 }
 
 void MarkdownToHtmlResponse::CopyFrom(const MarkdownToHtmlResponse& from) {
@@ -555,7 +542,7 @@ void MarkdownToHtmlResponse::CopyFrom(const MarkdownToHtmlResponse& from) {
   MergeFrom(from);
 }
 
-bool MarkdownToHtmlResponse::IsInitialized() const {
+PROTOBUF_NOINLINE bool MarkdownToHtmlResponse::IsInitialized() const {
   return true;
 }
 
@@ -568,7 +555,7 @@ void MarkdownToHtmlResponse::InternalSwap(MarkdownToHtmlResponse* other) {
                                        &other->_impl_.payload_, rhs_arena);
 }
 
-::PROTOBUF_NAMESPACE_ID::Metadata MarkdownToHtmlResponse::GetMetadata() const {
+::google::protobuf::Metadata MarkdownToHtmlResponse::GetMetadata() const {
   return ::_pbi::AssignDescriptors(
       &descriptor_table_morus_2eproto_getter, &descriptor_table_morus_2eproto_once,
       file_level_metadata_morus_2eproto[1]);
@@ -577,15 +564,9 @@ void MarkdownToHtmlResponse::InternalSwap(MarkdownToHtmlResponse* other) {
 }  // namespace v1
 }  // namespace morus
 }  // namespace mint
-PROTOBUF_NAMESPACE_OPEN
-template<> PROTOBUF_NOINLINE ::mint::morus::v1::MarkdownToHtmlRequest*
-Arena::CreateMaybeMessage< ::mint::morus::v1::MarkdownToHtmlRequest >(Arena* arena) {
-  return Arena::CreateMessageInternal< ::mint::morus::v1::MarkdownToHtmlRequest >(arena);
-}
-template<> PROTOBUF_NOINLINE ::mint::morus::v1::MarkdownToHtmlResponse*
-Arena::CreateMaybeMessage< ::mint::morus::v1::MarkdownToHtmlResponse >(Arena* arena) {
-  return Arena::CreateMessageInternal< ::mint::morus::v1::MarkdownToHtmlResponse >(arena);
-}
-PROTOBUF_NAMESPACE_CLOSE
+namespace google {
+namespace protobuf {
+}  // namespace protobuf
+}  // namespace google
 // @@protoc_insertion_point(global_scope)
 #include "google/protobuf/port_undef.inc"

+ 80 - 71
rpc/sdk/cpp/morus.pb.h

@@ -9,13 +9,13 @@
 #include <type_traits>
 
 #include "google/protobuf/port_def.inc"
-#if PROTOBUF_VERSION < 4023000
+#if PROTOBUF_VERSION < 4024000
 #error "This file was generated by a newer version of protoc which is"
 #error "incompatible with your Protocol Buffer headers. Please update"
 #error "your headers."
 #endif  // PROTOBUF_VERSION
 
-#if 4023004 < PROTOBUF_MIN_PROTOC_VERSION
+#if 4024003 < PROTOBUF_MIN_PROTOC_VERSION
 #error "This file was generated by an older version of protoc which is"
 #error "incompatible with your Protocol Buffer headers. Please"
 #error "regenerate this file with a newer version of protoc."
@@ -24,6 +24,7 @@
 #include "google/protobuf/io/coded_stream.h"
 #include "google/protobuf/arena.h"
 #include "google/protobuf/arenastring.h"
+#include "google/protobuf/generated_message_tctable_decl.h"
 #include "google/protobuf/generated_message_util.h"
 #include "google/protobuf/metadata_lite.h"
 #include "google/protobuf/generated_message_reflection.h"
@@ -38,17 +39,19 @@
 
 #define PROTOBUF_INTERNAL_EXPORT_morus_2eproto
 
-PROTOBUF_NAMESPACE_OPEN
+namespace google {
+namespace protobuf {
 namespace internal {
 class AnyMetadata;
 }  // namespace internal
-PROTOBUF_NAMESPACE_CLOSE
+}  // namespace protobuf
+}  // namespace google
 
 // Internal implementation detail -- do not use these members.
 struct TableStruct_morus_2eproto {
   static const ::uint32_t offsets[];
 };
-extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable
+extern const ::google::protobuf::internal::DescriptorTable
     descriptor_table_morus_2eproto;
 namespace mint {
 namespace morus {
@@ -62,12 +65,10 @@ extern MarkdownToHtmlResponseDefaultTypeInternal _MarkdownToHtmlResponse_default
 }  // namespace v1
 }  // namespace morus
 }  // namespace mint
-PROTOBUF_NAMESPACE_OPEN
-template <>
-::mint::morus::v1::MarkdownToHtmlRequest* Arena::CreateMaybeMessage<::mint::morus::v1::MarkdownToHtmlRequest>(Arena*);
-template <>
-::mint::morus::v1::MarkdownToHtmlResponse* Arena::CreateMaybeMessage<::mint::morus::v1::MarkdownToHtmlResponse>(Arena*);
-PROTOBUF_NAMESPACE_CLOSE
+namespace google {
+namespace protobuf {
+}  // namespace protobuf
+}  // namespace google
 
 namespace mint {
 namespace morus {
@@ -79,12 +80,12 @@ namespace v1 {
 // -------------------------------------------------------------------
 
 class MarkdownToHtmlRequest final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:mint.morus.v1.MarkdownToHtmlRequest) */ {
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:mint.morus.v1.MarkdownToHtmlRequest) */ {
  public:
   inline MarkdownToHtmlRequest() : MarkdownToHtmlRequest(nullptr) {}
   ~MarkdownToHtmlRequest() override;
   template<typename = void>
-  explicit PROTOBUF_CONSTEXPR MarkdownToHtmlRequest(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  explicit PROTOBUF_CONSTEXPR MarkdownToHtmlRequest(::google::protobuf::internal::ConstantInitialized);
 
   MarkdownToHtmlRequest(const MarkdownToHtmlRequest& from);
   MarkdownToHtmlRequest(MarkdownToHtmlRequest&& from) noexcept
@@ -110,20 +111,20 @@ class MarkdownToHtmlRequest final :
     return *this;
   }
 
-  inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance);
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance);
   }
-  inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>();
   }
 
-  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+  static const ::google::protobuf::Descriptor* descriptor() {
     return GetDescriptor();
   }
-  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+  static const ::google::protobuf::Descriptor* GetDescriptor() {
     return default_instance().GetMetadata().descriptor;
   }
-  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+  static const ::google::protobuf::Reflection* GetReflection() {
     return default_instance().GetMetadata().reflection;
   }
   static const MarkdownToHtmlRequest& default_instance() {
@@ -149,7 +150,7 @@ class MarkdownToHtmlRequest final :
   #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
       InternalSwap(other);
     } else {
-      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+      ::google::protobuf::internal::GenericSwap(this, other);
     }
   }
   void UnsafeArenaSwap(MarkdownToHtmlRequest* other) {
@@ -160,46 +161,46 @@ class MarkdownToHtmlRequest final :
 
   // implements Message ----------------------------------------------
 
-  MarkdownToHtmlRequest* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+  MarkdownToHtmlRequest* New(::google::protobuf::Arena* arena = nullptr) const final {
     return CreateMaybeMessage<MarkdownToHtmlRequest>(arena);
   }
-  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  using ::google::protobuf::Message::CopyFrom;
   void CopyFrom(const MarkdownToHtmlRequest& from);
-  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  using ::google::protobuf::Message::MergeFrom;
   void MergeFrom( const MarkdownToHtmlRequest& from) {
     MarkdownToHtmlRequest::MergeImpl(*this, from);
   }
   private:
-  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg);
+  static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg);
   public:
   PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
   bool IsInitialized() const final;
 
   ::size_t ByteSizeLong() const final;
-  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final;
   ::uint8_t* _InternalSerialize(
-      ::uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+      ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final;
   int GetCachedSize() const final { return _impl_._cached_size_.Get(); }
 
   private:
-  void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  void SharedCtor(::google::protobuf::Arena* arena);
   void SharedDtor();
   void SetCachedSize(int size) const final;
   void InternalSwap(MarkdownToHtmlRequest* other);
 
   private:
-  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  friend class ::google::protobuf::internal::AnyMetadata;
   static ::absl::string_view FullMessageName() {
     return "mint.morus.v1.MarkdownToHtmlRequest";
   }
   protected:
-  explicit MarkdownToHtmlRequest(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  explicit MarkdownToHtmlRequest(::google::protobuf::Arena* arena);
   public:
 
   static const ClassData _class_data_;
-  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+  const ::google::protobuf::Message::ClassData*GetClassData() const final;
 
-  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+  ::google::protobuf::Metadata GetMetadata() const final;
 
   // nested types ----------------------------------------------------
 
@@ -212,10 +213,6 @@ class MarkdownToHtmlRequest final :
   // string payload = 1;
   void clear_payload() ;
   const std::string& payload() const;
-
-
-
-
   template <typename Arg_ = const std::string&, typename... Args_>
   void set_payload(Arg_&& arg, Args_... args);
   std::string* mutable_payload();
@@ -243,25 +240,28 @@ class MarkdownToHtmlRequest final :
  private:
   class _Internal;
 
-  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  friend class ::google::protobuf::internal::TcParser;
+  static const ::google::protobuf::internal::TcParseTable<1, 2, 0, 51, 2> _table_;
+  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
   struct Impl_ {
-    ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr payload_;
+    ::google::protobuf::internal::ArenaStringPtr payload_;
     bool sanitize_;
-    mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+    mutable ::google::protobuf::internal::CachedSize _cached_size_;
+    PROTOBUF_TSAN_DECLARE_MEMBER
   };
   union { Impl_ _impl_; };
   friend struct ::TableStruct_morus_2eproto;
 };// -------------------------------------------------------------------
 
 class MarkdownToHtmlResponse final :
-    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:mint.morus.v1.MarkdownToHtmlResponse) */ {
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:mint.morus.v1.MarkdownToHtmlResponse) */ {
  public:
   inline MarkdownToHtmlResponse() : MarkdownToHtmlResponse(nullptr) {}
   ~MarkdownToHtmlResponse() override;
   template<typename = void>
-  explicit PROTOBUF_CONSTEXPR MarkdownToHtmlResponse(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized);
+  explicit PROTOBUF_CONSTEXPR MarkdownToHtmlResponse(::google::protobuf::internal::ConstantInitialized);
 
   MarkdownToHtmlResponse(const MarkdownToHtmlResponse& from);
   MarkdownToHtmlResponse(MarkdownToHtmlResponse&& from) noexcept
@@ -287,20 +287,20 @@ class MarkdownToHtmlResponse final :
     return *this;
   }
 
-  inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const {
-    return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance);
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance);
   }
-  inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() {
-    return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>();
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>();
   }
 
-  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+  static const ::google::protobuf::Descriptor* descriptor() {
     return GetDescriptor();
   }
-  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+  static const ::google::protobuf::Descriptor* GetDescriptor() {
     return default_instance().GetMetadata().descriptor;
   }
-  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+  static const ::google::protobuf::Reflection* GetReflection() {
     return default_instance().GetMetadata().reflection;
   }
   static const MarkdownToHtmlResponse& default_instance() {
@@ -326,7 +326,7 @@ class MarkdownToHtmlResponse final :
   #endif  // !PROTOBUF_FORCE_COPY_IN_SWAP
       InternalSwap(other);
     } else {
-      ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other);
+      ::google::protobuf::internal::GenericSwap(this, other);
     }
   }
   void UnsafeArenaSwap(MarkdownToHtmlResponse* other) {
@@ -337,46 +337,46 @@ class MarkdownToHtmlResponse final :
 
   // implements Message ----------------------------------------------
 
-  MarkdownToHtmlResponse* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final {
+  MarkdownToHtmlResponse* New(::google::protobuf::Arena* arena = nullptr) const final {
     return CreateMaybeMessage<MarkdownToHtmlResponse>(arena);
   }
-  using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom;
+  using ::google::protobuf::Message::CopyFrom;
   void CopyFrom(const MarkdownToHtmlResponse& from);
-  using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom;
+  using ::google::protobuf::Message::MergeFrom;
   void MergeFrom( const MarkdownToHtmlResponse& from) {
     MarkdownToHtmlResponse::MergeImpl(*this, from);
   }
   private:
-  static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg);
+  static void MergeImpl(::google::protobuf::Message& to_msg, const ::google::protobuf::Message& from_msg);
   public:
   PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
   bool IsInitialized() const final;
 
   ::size_t ByteSizeLong() const final;
-  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  const char* _InternalParse(const char* ptr, ::google::protobuf::internal::ParseContext* ctx) final;
   ::uint8_t* _InternalSerialize(
-      ::uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+      ::uint8_t* target, ::google::protobuf::io::EpsCopyOutputStream* stream) const final;
   int GetCachedSize() const final { return _impl_._cached_size_.Get(); }
 
   private:
-  void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  void SharedCtor(::google::protobuf::Arena* arena);
   void SharedDtor();
   void SetCachedSize(int size) const final;
   void InternalSwap(MarkdownToHtmlResponse* other);
 
   private:
-  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  friend class ::google::protobuf::internal::AnyMetadata;
   static ::absl::string_view FullMessageName() {
     return "mint.morus.v1.MarkdownToHtmlResponse";
   }
   protected:
-  explicit MarkdownToHtmlResponse(::PROTOBUF_NAMESPACE_ID::Arena* arena);
+  explicit MarkdownToHtmlResponse(::google::protobuf::Arena* arena);
   public:
 
   static const ClassData _class_data_;
-  const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final;
+  const ::google::protobuf::Message::ClassData*GetClassData() const final;
 
-  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+  ::google::protobuf::Metadata GetMetadata() const final;
 
   // nested types ----------------------------------------------------
 
@@ -388,10 +388,6 @@ class MarkdownToHtmlResponse final :
   // string payload = 1;
   void clear_payload() ;
   const std::string& payload() const;
-
-
-
-
   template <typename Arg_ = const std::string&, typename... Args_>
   void set_payload(Arg_&& arg, Args_... args);
   std::string* mutable_payload();
@@ -409,12 +405,15 @@ class MarkdownToHtmlResponse final :
  private:
   class _Internal;
 
-  template <typename T> friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper;
+  friend class ::google::protobuf::internal::TcParser;
+  static const ::google::protobuf::internal::TcParseTable<0, 1, 0, 52, 2> _table_;
+  template <typename T> friend class ::google::protobuf::Arena::InternalHelper;
   typedef void InternalArenaConstructable_;
   typedef void DestructorSkippable_;
   struct Impl_ {
-    ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr payload_;
-    mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+    ::google::protobuf::internal::ArenaStringPtr payload_;
+    mutable ::google::protobuf::internal::CachedSize _cached_size_;
+    PROTOBUF_TSAN_DECLARE_MEMBER
   };
   union { Impl_ _impl_; };
   friend struct ::TableStruct_morus_2eproto;
@@ -447,6 +446,7 @@ inline const std::string& MarkdownToHtmlRequest::payload() const {
 template <typename Arg_, typename... Args_>
 inline PROTOBUF_ALWAYS_INLINE void MarkdownToHtmlRequest::set_payload(Arg_&& arg,
                                                      Args_... args) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
   _impl_.payload_.Set(static_cast<Arg_&&>(arg), args..., GetArenaForAllocation());
   // @@protoc_insertion_point(field_set:mint.morus.v1.MarkdownToHtmlRequest.payload)
@@ -457,23 +457,26 @@ inline std::string* MarkdownToHtmlRequest::mutable_payload() {
   return _s;
 }
 inline const std::string& MarkdownToHtmlRequest::_internal_payload() const {
+  PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race);
   return _impl_.payload_.Get();
 }
 inline void MarkdownToHtmlRequest::_internal_set_payload(const std::string& value) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
-
-
   _impl_.payload_.Set(value, GetArenaForAllocation());
 }
 inline std::string* MarkdownToHtmlRequest::_internal_mutable_payload() {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
   return _impl_.payload_.Mutable( GetArenaForAllocation());
 }
 inline std::string* MarkdownToHtmlRequest::release_payload() {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   // @@protoc_insertion_point(field_release:mint.morus.v1.MarkdownToHtmlRequest.payload)
   return _impl_.payload_.Release();
 }
 inline void MarkdownToHtmlRequest::set_allocated_payload(std::string* value) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   _impl_.payload_.SetAllocated(value, GetArenaForAllocation());
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         if (_impl_.payload_.IsDefault()) {
@@ -496,9 +499,11 @@ inline void MarkdownToHtmlRequest::set_sanitize(bool value) {
   // @@protoc_insertion_point(field_set:mint.morus.v1.MarkdownToHtmlRequest.sanitize)
 }
 inline bool MarkdownToHtmlRequest::_internal_sanitize() const {
+  PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race);
   return _impl_.sanitize_;
 }
 inline void MarkdownToHtmlRequest::_internal_set_sanitize(bool value) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
   _impl_.sanitize_ = value;
 }
@@ -518,6 +523,7 @@ inline const std::string& MarkdownToHtmlResponse::payload() const {
 template <typename Arg_, typename... Args_>
 inline PROTOBUF_ALWAYS_INLINE void MarkdownToHtmlResponse::set_payload(Arg_&& arg,
                                                      Args_... args) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
   _impl_.payload_.Set(static_cast<Arg_&&>(arg), args..., GetArenaForAllocation());
   // @@protoc_insertion_point(field_set:mint.morus.v1.MarkdownToHtmlResponse.payload)
@@ -528,23 +534,26 @@ inline std::string* MarkdownToHtmlResponse::mutable_payload() {
   return _s;
 }
 inline const std::string& MarkdownToHtmlResponse::_internal_payload() const {
+  PROTOBUF_TSAN_READ(&_impl_._tsan_detect_race);
   return _impl_.payload_.Get();
 }
 inline void MarkdownToHtmlResponse::_internal_set_payload(const std::string& value) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
-
-
   _impl_.payload_.Set(value, GetArenaForAllocation());
 }
 inline std::string* MarkdownToHtmlResponse::_internal_mutable_payload() {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   ;
   return _impl_.payload_.Mutable( GetArenaForAllocation());
 }
 inline std::string* MarkdownToHtmlResponse::release_payload() {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   // @@protoc_insertion_point(field_release:mint.morus.v1.MarkdownToHtmlResponse.payload)
   return _impl_.payload_.Release();
 }
 inline void MarkdownToHtmlResponse::set_allocated_payload(std::string* value) {
+  PROTOBUF_TSAN_WRITE(&_impl_._tsan_detect_race);
   _impl_.payload_.SetAllocated(value, GetArenaForAllocation());
   #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING
         if (_impl_.payload_.IsDefault()) {

Файловите разлики са ограничени, защото са твърде много
+ 913 - 286
rpc/sdk/csharp/Lily.cs


+ 188 - 45
rpc/sdk/csharp/LilyGrpc.cs

@@ -46,25 +46,25 @@ namespace Palm.Lily.V1 {
     }
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Marshaller<global::Palm.Lily.V1.File> __Marshaller_palm_lily_v1_File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.File.Parser));
+    static readonly grpc::Marshaller<global::Palm.Lily.V1.S3File> __Marshaller_palm_lily_v1_S3File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.S3File.Parser));
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     static readonly grpc::Marshaller<global::Palm.Lily.V1.ExcelModel> __Marshaller_palm_lily_v1_ExcelModel = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.ExcelModel.Parser));
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Method<global::Palm.Lily.V1.File, global::Palm.Lily.V1.ExcelModel> __Method_Parse = new grpc::Method<global::Palm.Lily.V1.File, global::Palm.Lily.V1.ExcelModel>(
+    static readonly grpc::Method<global::Palm.Lily.V1.S3File, global::Palm.Lily.V1.ExcelModel> __Method_Parse = new grpc::Method<global::Palm.Lily.V1.S3File, global::Palm.Lily.V1.ExcelModel>(
         grpc::MethodType.Unary,
         __ServiceName,
         "Parse",
-        __Marshaller_palm_lily_v1_File,
+        __Marshaller_palm_lily_v1_S3File,
         __Marshaller_palm_lily_v1_ExcelModel);
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Method<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.File> __Method_Generate = new grpc::Method<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.File>(
+    static readonly grpc::Method<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.S3File> __Method_Generate = new grpc::Method<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.S3File>(
         grpc::MethodType.Unary,
         __ServiceName,
         "Generate",
         __Marshaller_palm_lily_v1_ExcelModel,
-        __Marshaller_palm_lily_v1_File);
+        __Marshaller_palm_lily_v1_S3File);
 
     /// <summary>Service descriptor</summary>
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
@@ -77,13 +77,13 @@ namespace Palm.Lily.V1 {
     public abstract partial class ExcelBase
     {
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.ExcelModel> Parse(global::Palm.Lily.V1.File request, grpc::ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.ExcelModel> Parse(global::Palm.Lily.V1.S3File request, grpc::ServerCallContext context)
       {
         throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
       }
 
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.File> Generate(global::Palm.Lily.V1.ExcelModel request, grpc::ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.S3File> Generate(global::Palm.Lily.V1.ExcelModel request, grpc::ServerCallContext context)
       {
         throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
       }
@@ -118,42 +118,42 @@ namespace Palm.Lily.V1 {
       }
 
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.ExcelModel Parse(global::Palm.Lily.V1.File request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual global::Palm.Lily.V1.ExcelModel Parse(global::Palm.Lily.V1.S3File request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return Parse(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.ExcelModel Parse(global::Palm.Lily.V1.File request, grpc::CallOptions options)
+      public virtual global::Palm.Lily.V1.ExcelModel Parse(global::Palm.Lily.V1.S3File request, grpc::CallOptions options)
       {
         return CallInvoker.BlockingUnaryCall(__Method_Parse, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.ExcelModel> ParseAsync(global::Palm.Lily.V1.File request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.ExcelModel> ParseAsync(global::Palm.Lily.V1.S3File request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return ParseAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.ExcelModel> ParseAsync(global::Palm.Lily.V1.File request, grpc::CallOptions options)
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.ExcelModel> ParseAsync(global::Palm.Lily.V1.S3File request, grpc::CallOptions options)
       {
         return CallInvoker.AsyncUnaryCall(__Method_Parse, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File Generate(global::Palm.Lily.V1.ExcelModel request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual global::Palm.Lily.V1.S3File Generate(global::Palm.Lily.V1.ExcelModel request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return Generate(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File Generate(global::Palm.Lily.V1.ExcelModel request, grpc::CallOptions options)
+      public virtual global::Palm.Lily.V1.S3File Generate(global::Palm.Lily.V1.ExcelModel request, grpc::CallOptions options)
       {
         return CallInvoker.BlockingUnaryCall(__Method_Generate, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> GenerateAsync(global::Palm.Lily.V1.ExcelModel request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> GenerateAsync(global::Palm.Lily.V1.ExcelModel request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return GenerateAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> GenerateAsync(global::Palm.Lily.V1.ExcelModel request, grpc::CallOptions options)
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> GenerateAsync(global::Palm.Lily.V1.ExcelModel request, grpc::CallOptions options)
       {
         return CallInvoker.AsyncUnaryCall(__Method_Generate, null, options, request);
       }
@@ -182,8 +182,151 @@ namespace Palm.Lily.V1 {
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     public static void BindService(grpc::ServiceBinderBase serviceBinder, ExcelBase serviceImpl)
     {
-      serviceBinder.AddMethod(__Method_Parse, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.File, global::Palm.Lily.V1.ExcelModel>(serviceImpl.Parse));
-      serviceBinder.AddMethod(__Method_Generate, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.File>(serviceImpl.Generate));
+      serviceBinder.AddMethod(__Method_Parse, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.S3File, global::Palm.Lily.V1.ExcelModel>(serviceImpl.Parse));
+      serviceBinder.AddMethod(__Method_Generate, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.ExcelModel, global::Palm.Lily.V1.S3File>(serviceImpl.Generate));
+    }
+
+  }
+  public static partial class S3
+  {
+    static readonly string __ServiceName = "palm.lily.v1.S3";
+
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static void __Helper_SerializeMessage(global::Google.Protobuf.IMessage message, grpc::SerializationContext context)
+    {
+      #if !GRPC_DISABLE_PROTOBUF_BUFFER_SERIALIZATION
+      if (message is global::Google.Protobuf.IBufferMessage)
+      {
+        context.SetPayloadLength(message.CalculateSize());
+        global::Google.Protobuf.MessageExtensions.WriteTo(message, context.GetBufferWriter());
+        context.Complete();
+        return;
+      }
+      #endif
+      context.Complete(global::Google.Protobuf.MessageExtensions.ToByteArray(message));
+    }
+
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static class __Helper_MessageCache<T>
+    {
+      public static readonly bool IsBufferMessage = global::System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(global::Google.Protobuf.IBufferMessage)).IsAssignableFrom(typeof(T));
+    }
+
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static T __Helper_DeserializeMessage<T>(grpc::DeserializationContext context, global::Google.Protobuf.MessageParser<T> parser) where T : global::Google.Protobuf.IMessage<T>
+    {
+      #if !GRPC_DISABLE_PROTOBUF_BUFFER_SERIALIZATION
+      if (__Helper_MessageCache<T>.IsBufferMessage)
+      {
+        return parser.ParseFrom(context.PayloadAsReadOnlySequence());
+      }
+      #endif
+      return parser.ParseFrom(context.PayloadAsNewBuffer());
+    }
+
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static readonly grpc::Marshaller<global::Palm.Lily.V1.S3GetFileRequest> __Marshaller_palm_lily_v1_S3GetFileRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.S3GetFileRequest.Parser));
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static readonly grpc::Marshaller<global::Palm.Lily.V1.S3GetFileResponse> __Marshaller_palm_lily_v1_S3GetFileResponse = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.S3GetFileResponse.Parser));
+
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    static readonly grpc::Method<global::Palm.Lily.V1.S3GetFileRequest, global::Palm.Lily.V1.S3GetFileResponse> __Method_GetFile = new grpc::Method<global::Palm.Lily.V1.S3GetFileRequest, global::Palm.Lily.V1.S3GetFileResponse>(
+        grpc::MethodType.Unary,
+        __ServiceName,
+        "GetFile",
+        __Marshaller_palm_lily_v1_S3GetFileRequest,
+        __Marshaller_palm_lily_v1_S3GetFileResponse);
+
+    /// <summary>Service descriptor</summary>
+    public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
+    {
+      get { return global::Palm.Lily.V1.LilyReflection.Descriptor.Services[1]; }
+    }
+
+    /// <summary>Base class for server-side implementations of S3</summary>
+    [grpc::BindServiceMethod(typeof(S3), "BindService")]
+    public abstract partial class S3Base
+    {
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.S3GetFileResponse> GetFile(global::Palm.Lily.V1.S3GetFileRequest request, grpc::ServerCallContext context)
+      {
+        throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
+      }
+
+    }
+
+    /// <summary>Client for S3</summary>
+    public partial class S3Client : grpc::ClientBase<S3Client>
+    {
+      /// <summary>Creates a new client for S3</summary>
+      /// <param name="channel">The channel to use to make remote calls.</param>
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public S3Client(grpc::ChannelBase channel) : base(channel)
+      {
+      }
+      /// <summary>Creates a new client for S3 that uses a custom <c>CallInvoker</c>.</summary>
+      /// <param name="callInvoker">The callInvoker to use to make remote calls.</param>
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public S3Client(grpc::CallInvoker callInvoker) : base(callInvoker)
+      {
+      }
+      /// <summary>Protected parameterless constructor to allow creation of test doubles.</summary>
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      protected S3Client() : base()
+      {
+      }
+      /// <summary>Protected constructor to allow creation of configured clients.</summary>
+      /// <param name="configuration">The client configuration.</param>
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      protected S3Client(ClientBaseConfiguration configuration) : base(configuration)
+      {
+      }
+
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public virtual global::Palm.Lily.V1.S3GetFileResponse GetFile(global::Palm.Lily.V1.S3GetFileRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      {
+        return GetFile(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+      }
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public virtual global::Palm.Lily.V1.S3GetFileResponse GetFile(global::Palm.Lily.V1.S3GetFileRequest request, grpc::CallOptions options)
+      {
+        return CallInvoker.BlockingUnaryCall(__Method_GetFile, null, options, request);
+      }
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3GetFileResponse> GetFileAsync(global::Palm.Lily.V1.S3GetFileRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      {
+        return GetFileAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
+      }
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3GetFileResponse> GetFileAsync(global::Palm.Lily.V1.S3GetFileRequest request, grpc::CallOptions options)
+      {
+        return CallInvoker.AsyncUnaryCall(__Method_GetFile, null, options, request);
+      }
+      /// <summary>Creates a new instance of client from given <c>ClientBaseConfiguration</c>.</summary>
+      [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+      protected override S3Client NewInstance(ClientBaseConfiguration configuration)
+      {
+        return new S3Client(configuration);
+      }
+    }
+
+    /// <summary>Creates service definition that can be registered with a server</summary>
+    /// <param name="serviceImpl">An object implementing the server-side handling logic.</param>
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    public static grpc::ServerServiceDefinition BindService(S3Base serviceImpl)
+    {
+      return grpc::ServerServiceDefinition.CreateBuilder()
+          .AddMethod(__Method_GetFile, serviceImpl.GetFile).Build();
+    }
+
+    /// <summary>Register service method with a service binder with or without implementation. Useful when customizing the service binding logic.
+    /// Note: this method is part of an experimental API that can change or be removed without any prior notice.</summary>
+    /// <param name="serviceBinder">Service methods will be bound by calling <c>AddMethod</c> on this object.</param>
+    /// <param name="serviceImpl">An object implementing the server-side handling logic.</param>
+    [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
+    public static void BindService(grpc::ServiceBinderBase serviceBinder, S3Base serviceImpl)
+    {
+      serviceBinder.AddMethod(__Method_GetFile, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.S3GetFileRequest, global::Palm.Lily.V1.S3GetFileResponse>(serviceImpl.GetFile));
     }
 
   }
@@ -227,28 +370,28 @@ namespace Palm.Lily.V1 {
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     static readonly grpc::Marshaller<global::Palm.Lily.V1.TexToRequest> __Marshaller_palm_lily_v1_TexToRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.TexToRequest.Parser));
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Marshaller<global::Palm.Lily.V1.File> __Marshaller_palm_lily_v1_File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.File.Parser));
+    static readonly grpc::Marshaller<global::Palm.Lily.V1.S3File> __Marshaller_palm_lily_v1_S3File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.S3File.Parser));
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File> __Method_ToPdf = new grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File>(
+    static readonly grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File> __Method_ToPdf = new grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File>(
         grpc::MethodType.Unary,
         __ServiceName,
         "ToPdf",
         __Marshaller_palm_lily_v1_TexToRequest,
-        __Marshaller_palm_lily_v1_File);
+        __Marshaller_palm_lily_v1_S3File);
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File> __Method_ToWord = new grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File>(
+    static readonly grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File> __Method_ToWord = new grpc::Method<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File>(
         grpc::MethodType.Unary,
         __ServiceName,
         "ToWord",
         __Marshaller_palm_lily_v1_TexToRequest,
-        __Marshaller_palm_lily_v1_File);
+        __Marshaller_palm_lily_v1_S3File);
 
     /// <summary>Service descriptor</summary>
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
     {
-      get { return global::Palm.Lily.V1.LilyReflection.Descriptor.Services[1]; }
+      get { return global::Palm.Lily.V1.LilyReflection.Descriptor.Services[2]; }
     }
 
     /// <summary>Base class for server-side implementations of Tex</summary>
@@ -256,13 +399,13 @@ namespace Palm.Lily.V1 {
     public abstract partial class TexBase
     {
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.File> ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.S3File> ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::ServerCallContext context)
       {
         throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
       }
 
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.File> ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.S3File> ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::ServerCallContext context)
       {
         throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
       }
@@ -297,42 +440,42 @@ namespace Palm.Lily.V1 {
       }
 
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual global::Palm.Lily.V1.S3File ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return ToPdf(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
+      public virtual global::Palm.Lily.V1.S3File ToPdf(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
       {
         return CallInvoker.BlockingUnaryCall(__Method_ToPdf, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> ToPdfAsync(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> ToPdfAsync(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return ToPdfAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> ToPdfAsync(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> ToPdfAsync(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
       {
         return CallInvoker.AsyncUnaryCall(__Method_ToPdf, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual global::Palm.Lily.V1.S3File ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return ToWord(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
+      public virtual global::Palm.Lily.V1.S3File ToWord(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
       {
         return CallInvoker.BlockingUnaryCall(__Method_ToWord, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> ToWordAsync(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> ToWordAsync(global::Palm.Lily.V1.TexToRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return ToWordAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> ToWordAsync(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> ToWordAsync(global::Palm.Lily.V1.TexToRequest request, grpc::CallOptions options)
       {
         return CallInvoker.AsyncUnaryCall(__Method_ToWord, null, options, request);
       }
@@ -361,8 +504,8 @@ namespace Palm.Lily.V1 {
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     public static void BindService(grpc::ServiceBinderBase serviceBinder, TexBase serviceImpl)
     {
-      serviceBinder.AddMethod(__Method_ToPdf, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File>(serviceImpl.ToPdf));
-      serviceBinder.AddMethod(__Method_ToWord, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.File>(serviceImpl.ToWord));
+      serviceBinder.AddMethod(__Method_ToPdf, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File>(serviceImpl.ToPdf));
+      serviceBinder.AddMethod(__Method_ToWord, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.TexToRequest, global::Palm.Lily.V1.S3File>(serviceImpl.ToWord));
     }
 
   }
@@ -406,20 +549,20 @@ namespace Palm.Lily.V1 {
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     static readonly grpc::Marshaller<global::Palm.Lily.V1.EpubBuildRequest> __Marshaller_palm_lily_v1_EpubBuildRequest = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.EpubBuildRequest.Parser));
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Marshaller<global::Palm.Lily.V1.File> __Marshaller_palm_lily_v1_File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.File.Parser));
+    static readonly grpc::Marshaller<global::Palm.Lily.V1.S3File> __Marshaller_palm_lily_v1_S3File = grpc::Marshallers.Create(__Helper_SerializeMessage, context => __Helper_DeserializeMessage(context, global::Palm.Lily.V1.S3File.Parser));
 
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-    static readonly grpc::Method<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.File> __Method_Build = new grpc::Method<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.File>(
+    static readonly grpc::Method<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.S3File> __Method_Build = new grpc::Method<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.S3File>(
         grpc::MethodType.Unary,
         __ServiceName,
         "Build",
         __Marshaller_palm_lily_v1_EpubBuildRequest,
-        __Marshaller_palm_lily_v1_File);
+        __Marshaller_palm_lily_v1_S3File);
 
     /// <summary>Service descriptor</summary>
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
     {
-      get { return global::Palm.Lily.V1.LilyReflection.Descriptor.Services[2]; }
+      get { return global::Palm.Lily.V1.LilyReflection.Descriptor.Services[3]; }
     }
 
     /// <summary>Base class for server-side implementations of Epub</summary>
@@ -427,7 +570,7 @@ namespace Palm.Lily.V1 {
     public abstract partial class EpubBase
     {
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.File> Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::ServerCallContext context)
+      public virtual global::System.Threading.Tasks.Task<global::Palm.Lily.V1.S3File> Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::ServerCallContext context)
       {
         throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, ""));
       }
@@ -462,22 +605,22 @@ namespace Palm.Lily.V1 {
       }
 
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual global::Palm.Lily.V1.S3File Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return Build(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual global::Palm.Lily.V1.File Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::CallOptions options)
+      public virtual global::Palm.Lily.V1.S3File Build(global::Palm.Lily.V1.EpubBuildRequest request, grpc::CallOptions options)
       {
         return CallInvoker.BlockingUnaryCall(__Method_Build, null, options, request);
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> BuildAsync(global::Palm.Lily.V1.EpubBuildRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> BuildAsync(global::Palm.Lily.V1.EpubBuildRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken))
       {
         return BuildAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken));
       }
       [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
-      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.File> BuildAsync(global::Palm.Lily.V1.EpubBuildRequest request, grpc::CallOptions options)
+      public virtual grpc::AsyncUnaryCall<global::Palm.Lily.V1.S3File> BuildAsync(global::Palm.Lily.V1.EpubBuildRequest request, grpc::CallOptions options)
       {
         return CallInvoker.AsyncUnaryCall(__Method_Build, null, options, request);
       }
@@ -505,7 +648,7 @@ namespace Palm.Lily.V1 {
     [global::System.CodeDom.Compiler.GeneratedCode("grpc_csharp_plugin", null)]
     public static void BindService(grpc::ServiceBinderBase serviceBinder, EpubBase serviceImpl)
     {
-      serviceBinder.AddMethod(__Method_Build, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.File>(serviceImpl.Build));
+      serviceBinder.AddMethod(__Method_Build, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::Palm.Lily.V1.EpubBuildRequest, global::Palm.Lily.V1.S3File>(serviceImpl.Build));
     }
 
   }

+ 12 - 12
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/EpubGrpc.java

@@ -16,28 +16,28 @@ public final class EpubGrpc {
 
   // Static method descriptors that strictly reflect the proto.
   private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getBuildMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getBuildMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "Build",
       requestType = com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest.class,
-      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.File.class,
+      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getBuildMethod() {
-    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File> getBuildMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getBuildMethod() {
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getBuildMethod;
     if ((getBuildMethod = EpubGrpc.getBuildMethod) == null) {
       synchronized (EpubGrpc.class) {
         if ((getBuildMethod = EpubGrpc.getBuildMethod) == null) {
           EpubGrpc.getBuildMethod = getBuildMethod =
-              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File>newBuilder()
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "Build"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()))
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()))
               .setSchemaDescriptor(new EpubMethodDescriptorSupplier("Build"))
               .build();
         }
@@ -97,7 +97,7 @@ public final class EpubGrpc {
     /**
      */
     default void build(com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getBuildMethod(), responseObserver);
     }
   }
@@ -132,7 +132,7 @@ public final class EpubGrpc {
     /**
      */
     public void build(com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getBuildMethod(), getCallOptions()), request, responseObserver);
     }
@@ -156,7 +156,7 @@ public final class EpubGrpc {
 
     /**
      */
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File build(com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest request) {
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File build(com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getBuildMethod(), getCallOptions(), request);
     }
@@ -180,7 +180,7 @@ public final class EpubGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.File> build(
+    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> build(
         com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getBuildMethod(), getCallOptions()), request);
@@ -208,7 +208,7 @@ public final class EpubGrpc {
       switch (methodId) {
         case METHODID_BUILD:
           serviceImpl.build((com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest) request,
-              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File>) responseObserver);
+              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File>) responseObserver);
           break;
         default:
           throw new AssertionError();
@@ -233,7 +233,7 @@ public final class EpubGrpc {
           io.grpc.stub.ServerCalls.asyncUnaryCall(
             new MethodHandlers<
               com.github.saturn_xiv.palm.plugins.lily.v1.EpubBuildRequest,
-              com.github.saturn_xiv.palm.plugins.lily.v1.File>(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File>(
                 service, METHODID_BUILD)))
         .build();
   }

+ 24 - 24
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/ExcelGrpc.java

@@ -15,27 +15,27 @@ public final class ExcelGrpc {
   public static final java.lang.String SERVICE_NAME = "palm.lily.v1.Excel";
 
   // Static method descriptors that strictly reflect the proto.
-  private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.File,
+  private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3File,
       com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> getParseMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "Parse",
-      requestType = com.github.saturn_xiv.palm.plugins.lily.v1.File.class,
+      requestType = com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class,
       responseType = com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
-  public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.File,
+  public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3File,
       com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> getParseMethod() {
-    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.File, com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> getParseMethod;
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3File, com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> getParseMethod;
     if ((getParseMethod = ExcelGrpc.getParseMethod) == null) {
       synchronized (ExcelGrpc.class) {
         if ((getParseMethod = ExcelGrpc.getParseMethod) == null) {
           ExcelGrpc.getParseMethod = getParseMethod =
-              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.File, com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel>newBuilder()
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.S3File, com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "Parse"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()))
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel.getDefaultInstance()))
               .setSchemaDescriptor(new ExcelMethodDescriptorSupplier("Parse"))
@@ -47,28 +47,28 @@ public final class ExcelGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getGenerateMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getGenerateMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "Generate",
       requestType = com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel.class,
-      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.File.class,
+      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getGenerateMethod() {
-    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel, com.github.saturn_xiv.palm.plugins.lily.v1.File> getGenerateMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getGenerateMethod() {
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel, com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getGenerateMethod;
     if ((getGenerateMethod = ExcelGrpc.getGenerateMethod) == null) {
       synchronized (ExcelGrpc.class) {
         if ((getGenerateMethod = ExcelGrpc.getGenerateMethod) == null) {
           ExcelGrpc.getGenerateMethod = getGenerateMethod =
-              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel, com.github.saturn_xiv.palm.plugins.lily.v1.File>newBuilder()
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel, com.github.saturn_xiv.palm.plugins.lily.v1.S3File>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "Generate"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()))
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()))
               .setSchemaDescriptor(new ExcelMethodDescriptorSupplier("Generate"))
               .build();
         }
@@ -127,7 +127,7 @@ public final class ExcelGrpc {
 
     /**
      */
-    default void parse(com.github.saturn_xiv.palm.plugins.lily.v1.File request,
+    default void parse(com.github.saturn_xiv.palm.plugins.lily.v1.S3File request,
         io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getParseMethod(), responseObserver);
     }
@@ -135,7 +135,7 @@ public final class ExcelGrpc {
     /**
      */
     default void generate(com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGenerateMethod(), responseObserver);
     }
   }
@@ -169,7 +169,7 @@ public final class ExcelGrpc {
 
     /**
      */
-    public void parse(com.github.saturn_xiv.palm.plugins.lily.v1.File request,
+    public void parse(com.github.saturn_xiv.palm.plugins.lily.v1.S3File request,
         io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getParseMethod(), getCallOptions()), request, responseObserver);
@@ -178,7 +178,7 @@ public final class ExcelGrpc {
     /**
      */
     public void generate(com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getGenerateMethod(), getCallOptions()), request, responseObserver);
     }
@@ -202,14 +202,14 @@ public final class ExcelGrpc {
 
     /**
      */
-    public com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel parse(com.github.saturn_xiv.palm.plugins.lily.v1.File request) {
+    public com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel parse(com.github.saturn_xiv.palm.plugins.lily.v1.S3File request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getParseMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File generate(com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel request) {
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File generate(com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getGenerateMethod(), getCallOptions(), request);
     }
@@ -234,14 +234,14 @@ public final class ExcelGrpc {
     /**
      */
     public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel> parse(
-        com.github.saturn_xiv.palm.plugins.lily.v1.File request) {
+        com.github.saturn_xiv.palm.plugins.lily.v1.S3File request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getParseMethod(), getCallOptions()), request);
     }
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.File> generate(
+    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> generate(
         com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getGenerateMethod(), getCallOptions()), request);
@@ -269,12 +269,12 @@ public final class ExcelGrpc {
     public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
       switch (methodId) {
         case METHODID_PARSE:
-          serviceImpl.parse((com.github.saturn_xiv.palm.plugins.lily.v1.File) request,
+          serviceImpl.parse((com.github.saturn_xiv.palm.plugins.lily.v1.S3File) request,
               (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel>) responseObserver);
           break;
         case METHODID_GENERATE:
           serviceImpl.generate((com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel) request,
-              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File>) responseObserver);
+              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File>) responseObserver);
           break;
         default:
           throw new AssertionError();
@@ -298,7 +298,7 @@ public final class ExcelGrpc {
           getParseMethod(),
           io.grpc.stub.ServerCalls.asyncUnaryCall(
             new MethodHandlers<
-              com.github.saturn_xiv.palm.plugins.lily.v1.File,
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File,
               com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel>(
                 service, METHODID_PARSE)))
         .addMethod(
@@ -306,7 +306,7 @@ public final class ExcelGrpc {
           io.grpc.stub.ServerCalls.asyncUnaryCall(
             new MethodHandlers<
               com.github.saturn_xiv.palm.plugins.lily.v1.ExcelModel,
-              com.github.saturn_xiv.palm.plugins.lily.v1.File>(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File>(
                 service, METHODID_GENERATE)))
         .build();
   }

+ 0 - 32
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/FileOrBuilder.java

@@ -1,32 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: lily.proto
-
-package com.github.saturn_xiv.palm.plugins.lily.v1;
-
-public interface FileOrBuilder extends
-    // @@protoc_insertion_point(interface_extends:palm.lily.v1.File)
-    com.google.protobuf.MessageOrBuilder {
-
-  /**
-   * <code>optional string content_type = 1;</code>
-   * @return Whether the contentType field is set.
-   */
-  boolean hasContentType();
-  /**
-   * <code>optional string content_type = 1;</code>
-   * @return The contentType.
-   */
-  java.lang.String getContentType();
-  /**
-   * <code>optional string content_type = 1;</code>
-   * @return The bytes for contentType.
-   */
-  com.google.protobuf.ByteString
-      getContentTypeBytes();
-
-  /**
-   * <code>bytes payload = 2;</code>
-   * @return The payload.
-   */
-  com.google.protobuf.ByteString getPayload();
-}

+ 68 - 35
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/Lily.java

@@ -14,11 +14,6 @@ public final class Lily {
     registerAllExtensions(
         (com.google.protobuf.ExtensionRegistryLite) registry);
   }
-  static final com.google.protobuf.Descriptors.Descriptor
-    internal_static_palm_lily_v1_File_descriptor;
-  static final 
-    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
-      internal_static_palm_lily_v1_File_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_palm_lily_v1_ExcelModel_descriptor;
   static final 
@@ -34,6 +29,21 @@ public final class Lily {
   static final 
     com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internal_static_palm_lily_v1_ExcelModel_Sheet_Cell_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_palm_lily_v1_S3File_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_palm_lily_v1_S3File_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_palm_lily_v1_S3GetFileRequest_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_palm_lily_v1_S3GetFileRequest_fieldAccessorTable;
+  static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_palm_lily_v1_S3GetFileResponse_descriptor;
+  static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_palm_lily_v1_S3GetFileResponse_fieldAccessorTable;
   static final com.google.protobuf.Descriptors.Descriptor
     internal_static_palm_lily_v1_TexToRequest_descriptor;
   static final 
@@ -58,39 +68,43 @@ public final class Lily {
       descriptor;
   static {
     java.lang.String[] descriptorData = {
-      "\n\nlily.proto\022\014palm.lily.v1\"C\n\004File\022\031\n\014co" +
-      "ntent_type\030\001 \001(\tH\000\210\001\001\022\017\n\007payload\030\002 \001(\014B\017" +
-      "\n\r_content_type\"\266\001\n\nExcelModel\022.\n\006sheets" +
-      "\030\001 \003(\0132\036.palm.lily.v1.ExcelModel.Sheet\032x" +
-      "\n\005Sheet\022\014\n\004name\030\001 \001(\t\0222\n\005cells\030\002 \003(\0132#.p" +
-      "alm.lily.v1.ExcelModel.Sheet.Cell\032-\n\004Cel" +
-      "l\022\013\n\003row\030\001 \001(\r\022\013\n\003col\030\002 \001(\r\022\013\n\003val\030\003 \001(\t" +
-      "\"r\n\014TexToRequest\0224\n\005files\030\001 \003(\0132%.palm.l" +
-      "ily.v1.TexToRequest.FilesEntry\032,\n\nFilesE" +
-      "ntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\014:\0028\001\"\022\n\020" +
-      "EpubBuildRequest2|\n\005Excel\0227\n\005Parse\022\022.pal" +
-      "m.lily.v1.File\032\030.palm.lily.v1.ExcelModel" +
-      "\"\000\022:\n\010Generate\022\030.palm.lily.v1.ExcelModel" +
-      "\032\022.palm.lily.v1.File\"\0002|\n\003Tex\0229\n\005ToPdf\022\032" +
-      ".palm.lily.v1.TexToRequest\032\022.palm.lily.v" +
-      "1.File\"\000\022:\n\006ToWord\022\032.palm.lily.v1.TexToR" +
-      "equest\032\022.palm.lily.v1.File\"\0002E\n\004Epub\022=\n\005" +
-      "Build\022\036.palm.lily.v1.EpubBuildRequest\032\022." +
-      "palm.lily.v1.File\"\000B.\n*com.github.saturn" +
-      "_xiv.palm.plugins.lily.v1P\001b\006proto3"
+      "\n\nlily.proto\022\014palm.lily.v1\032\036google/proto" +
+      "buf/duration.proto\"\266\001\n\nExcelModel\022.\n\006she" +
+      "ets\030\001 \003(\0132\036.palm.lily.v1.ExcelModel.Shee" +
+      "t\032x\n\005Sheet\022\014\n\004name\030\001 \001(\t\0222\n\005cells\030\002 \003(\0132" +
+      "#.palm.lily.v1.ExcelModel.Sheet.Cell\032-\n\004" +
+      "Cell\022\013\n\003row\030\001 \001(\r\022\013\n\003col\030\002 \001(\r\022\013\n\003val\030\003 " +
+      "\001(\t\"<\n\006S3File\022\016\n\006bucket\030\001 \001(\t\022\014\n\004name\030\002 " +
+      "\001(\t\022\024\n\014content_type\030\t \001(\t\"X\n\020S3GetFileRe" +
+      "quest\022\016\n\006bucket\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022&\n\003t" +
+      "tl\030\t \001(\0132\031.google.protobuf.Duration\" \n\021S" +
+      "3GetFileResponse\022\013\n\003url\030\001 \001(\t\"\347\001\n\014TexToR" +
+      "equest\022\r\n\005title\030\001 \001(\t\0224\n\005files\030\002 \003(\0132%.p" +
+      "alm.lily.v1.TexToRequest.FilesEntry\022+\n\003t" +
+      "tl\030\007 \001(\0132\031.google.protobuf.DurationH\000\210\001\001" +
+      "\022\022\n\005owner\030\010 \001(\tH\001\210\001\001\022\021\n\tpublished\030\t \001(\010\032" +
+      ",\n\nFilesEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(" +
+      "\014:\0028\001B\006\n\004_ttlB\010\n\006_owner\"\022\n\020EpubBuildRequ" +
+      "est2\200\001\n\005Excel\0229\n\005Parse\022\024.palm.lily.v1.S3" +
+      "File\032\030.palm.lily.v1.ExcelModel\"\000\022<\n\010Gene" +
+      "rate\022\030.palm.lily.v1.ExcelModel\032\024.palm.li" +
+      "ly.v1.S3File\"\0002R\n\002S3\022L\n\007GetFile\022\036.palm.l" +
+      "ily.v1.S3GetFileRequest\032\037.palm.lily.v1.S" +
+      "3GetFileResponse\"\0002\200\001\n\003Tex\022;\n\005ToPdf\022\032.pa" +
+      "lm.lily.v1.TexToRequest\032\024.palm.lily.v1.S" +
+      "3File\"\000\022<\n\006ToWord\022\032.palm.lily.v1.TexToRe" +
+      "quest\032\024.palm.lily.v1.S3File\"\0002G\n\004Epub\022?\n" +
+      "\005Build\022\036.palm.lily.v1.EpubBuildRequest\032\024" +
+      ".palm.lily.v1.S3File\"\000B.\n*com.github.sat" +
+      "urn_xiv.palm.plugins.lily.v1P\001b\006proto3"
     };
     descriptor = com.google.protobuf.Descriptors.FileDescriptor
       .internalBuildGeneratedFileFrom(descriptorData,
         new com.google.protobuf.Descriptors.FileDescriptor[] {
+          com.google.protobuf.DurationProto.getDescriptor(),
         });
-    internal_static_palm_lily_v1_File_descriptor =
-      getDescriptor().getMessageTypes().get(0);
-    internal_static_palm_lily_v1_File_fieldAccessorTable = new
-      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
-        internal_static_palm_lily_v1_File_descriptor,
-        new java.lang.String[] { "ContentType", "Payload", "ContentType", });
     internal_static_palm_lily_v1_ExcelModel_descriptor =
-      getDescriptor().getMessageTypes().get(1);
+      getDescriptor().getMessageTypes().get(0);
     internal_static_palm_lily_v1_ExcelModel_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_palm_lily_v1_ExcelModel_descriptor,
@@ -107,12 +121,30 @@ public final class Lily {
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_palm_lily_v1_ExcelModel_Sheet_Cell_descriptor,
         new java.lang.String[] { "Row", "Col", "Val", });
-    internal_static_palm_lily_v1_TexToRequest_descriptor =
+    internal_static_palm_lily_v1_S3File_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_palm_lily_v1_S3File_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_palm_lily_v1_S3File_descriptor,
+        new java.lang.String[] { "Bucket", "Name", "ContentType", });
+    internal_static_palm_lily_v1_S3GetFileRequest_descriptor =
       getDescriptor().getMessageTypes().get(2);
+    internal_static_palm_lily_v1_S3GetFileRequest_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_palm_lily_v1_S3GetFileRequest_descriptor,
+        new java.lang.String[] { "Bucket", "Name", "Ttl", });
+    internal_static_palm_lily_v1_S3GetFileResponse_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_palm_lily_v1_S3GetFileResponse_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_palm_lily_v1_S3GetFileResponse_descriptor,
+        new java.lang.String[] { "Url", });
+    internal_static_palm_lily_v1_TexToRequest_descriptor =
+      getDescriptor().getMessageTypes().get(4);
     internal_static_palm_lily_v1_TexToRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_palm_lily_v1_TexToRequest_descriptor,
-        new java.lang.String[] { "Files", });
+        new java.lang.String[] { "Title", "Files", "Ttl", "Owner", "Published", "Ttl", "Owner", });
     internal_static_palm_lily_v1_TexToRequest_FilesEntry_descriptor =
       internal_static_palm_lily_v1_TexToRequest_descriptor.getNestedTypes().get(0);
     internal_static_palm_lily_v1_TexToRequest_FilesEntry_fieldAccessorTable = new
@@ -120,11 +152,12 @@ public final class Lily {
         internal_static_palm_lily_v1_TexToRequest_FilesEntry_descriptor,
         new java.lang.String[] { "Key", "Value", });
     internal_static_palm_lily_v1_EpubBuildRequest_descriptor =
-      getDescriptor().getMessageTypes().get(3);
+      getDescriptor().getMessageTypes().get(5);
     internal_static_palm_lily_v1_EpubBuildRequest_fieldAccessorTable = new
       com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
         internal_static_palm_lily_v1_EpubBuildRequest_descriptor,
         new java.lang.String[] { });
+    com.google.protobuf.DurationProto.getDescriptor();
   }
 
   // @@protoc_insertion_point(outer_class_scope)

+ 813 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3File.java

@@ -0,0 +1,813 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: lily.proto
+
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+/**
+ * Protobuf type {@code palm.lily.v1.S3File}
+ */
+public final class S3File extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:palm.lily.v1.S3File)
+    S3FileOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use S3File.newBuilder() to construct.
+  private S3File(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private S3File() {
+    bucket_ = "";
+    name_ = "";
+    contentType_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new S3File();
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3File_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3File_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3File.Builder.class);
+  }
+
+  public static final int BUCKET_FIELD_NUMBER = 1;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object bucket_ = "";
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bucket.
+   */
+  @java.lang.Override
+  public java.lang.String getBucket() {
+    java.lang.Object ref = bucket_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      bucket_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bytes for bucket.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getBucketBytes() {
+    java.lang.Object ref = bucket_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      bucket_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NAME_FIELD_NUMBER = 2;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object name_ = "";
+  /**
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  @java.lang.Override
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int CONTENT_TYPE_FIELD_NUMBER = 9;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object contentType_ = "";
+  /**
+   * <code>string content_type = 9;</code>
+   * @return The contentType.
+   */
+  @java.lang.Override
+  public java.lang.String getContentType() {
+    java.lang.Object ref = contentType_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      contentType_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string content_type = 9;</code>
+   * @return The bytes for contentType.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getContentTypeBytes() {
+    java.lang.Object ref = contentType_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      contentType_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bucket_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, bucket_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(contentType_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 9, contentType_);
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bucket_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, bucket_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(contentType_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, contentType_);
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3File)) {
+      return super.equals(obj);
+    }
+    com.github.saturn_xiv.palm.plugins.lily.v1.S3File other = (com.github.saturn_xiv.palm.plugins.lily.v1.S3File) obj;
+
+    if (!getBucket()
+        .equals(other.getBucket())) return false;
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (!getContentType()
+        .equals(other.getContentType())) return false;
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + BUCKET_FIELD_NUMBER;
+    hash = (53 * hash) + getBucket().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    hash = (37 * hash) + CONTENT_TYPE_FIELD_NUMBER;
+    hash = (53 * hash) + getContentType().hashCode();
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.github.saturn_xiv.palm.plugins.lily.v1.S3File prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code palm.lily.v1.S3File}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:palm.lily.v1.S3File)
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3FileOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3File_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3File_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3File.Builder.class);
+    }
+
+    // Construct using com.github.saturn_xiv.palm.plugins.lily.v1.S3File.newBuilder()
+    private Builder() {
+
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      bucket_ = "";
+      name_ = "";
+      contentType_ = "";
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3File_descriptor;
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File getDefaultInstanceForType() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File build() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File buildPartial() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File result = new com.github.saturn_xiv.palm.plugins.lily.v1.S3File(this);
+      if (bitField0_ != 0) { buildPartial0(result); }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(com.github.saturn_xiv.palm.plugins.lily.v1.S3File result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.bucket_ = bucket_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.name_ = name_;
+      }
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.contentType_ = contentType_;
+      }
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3File) {
+        return mergeFrom((com.github.saturn_xiv.palm.plugins.lily.v1.S3File)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.github.saturn_xiv.palm.plugins.lily.v1.S3File other) {
+      if (other == com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()) return this;
+      if (!other.getBucket().isEmpty()) {
+        bucket_ = other.bucket_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        bitField0_ |= 0x00000002;
+        onChanged();
+      }
+      if (!other.getContentType().isEmpty()) {
+        contentType_ = other.contentType_;
+        bitField0_ |= 0x00000004;
+        onChanged();
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              bucket_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000001;
+              break;
+            } // case 10
+            case 18: {
+              name_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000002;
+              break;
+            } // case 18
+            case 74: {
+              contentType_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000004;
+              break;
+            } // case 74
+            default: {
+              if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                done = true; // was an endgroup tag
+              }
+              break;
+            } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+    private int bitField0_;
+
+    private java.lang.Object bucket_ = "";
+    /**
+     * <code>string bucket = 1;</code>
+     * @return The bucket.
+     */
+    public java.lang.String getBucket() {
+      java.lang.Object ref = bucket_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        bucket_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @return The bytes for bucket.
+     */
+    public com.google.protobuf.ByteString
+        getBucketBytes() {
+      java.lang.Object ref = bucket_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        bucket_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @param value The bucket to set.
+     * @return This builder for chaining.
+     */
+    public Builder setBucket(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      bucket_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearBucket() {
+      bucket_ = getDefaultInstance().getBucket();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @param value The bytes for bucket to set.
+     * @return This builder for chaining.
+     */
+    public Builder setBucketBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      bucket_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @param value The name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      name_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearName() {
+      name_ = getDefaultInstance().getName();
+      bitField0_ = (bitField0_ & ~0x00000002);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @param value The bytes for name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      name_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object contentType_ = "";
+    /**
+     * <code>string content_type = 9;</code>
+     * @return The contentType.
+     */
+    public java.lang.String getContentType() {
+      java.lang.Object ref = contentType_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        contentType_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string content_type = 9;</code>
+     * @return The bytes for contentType.
+     */
+    public com.google.protobuf.ByteString
+        getContentTypeBytes() {
+      java.lang.Object ref = contentType_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        contentType_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string content_type = 9;</code>
+     * @param value The contentType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setContentType(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      contentType_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string content_type = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearContentType() {
+      contentType_ = getDefaultInstance().getContentType();
+      bitField0_ = (bitField0_ & ~0x00000004);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string content_type = 9;</code>
+     * @param value The bytes for contentType to set.
+     * @return This builder for chaining.
+     */
+    public Builder setContentTypeBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      contentType_ = value;
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:palm.lily.v1.S3File)
+  }
+
+  // @@protoc_insertion_point(class_scope:palm.lily.v1.S3File)
+  private static final com.github.saturn_xiv.palm.plugins.lily.v1.S3File DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.github.saturn_xiv.palm.plugins.lily.v1.S3File();
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3File getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<S3File>
+      PARSER = new com.google.protobuf.AbstractParser<S3File>() {
+    @java.lang.Override
+    public S3File parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      Builder builder = newBuilder();
+      try {
+        builder.mergeFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(builder.buildPartial());
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(e)
+            .setUnfinishedMessage(builder.buildPartial());
+      }
+      return builder.buildPartial();
+    }
+  };
+
+  public static com.google.protobuf.Parser<S3File> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<S3File> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.github.saturn_xiv.palm.plugins.lily.v1.S3File getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 45 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3FileOrBuilder.java

@@ -0,0 +1,45 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: lily.proto
+
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+public interface S3FileOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:palm.lily.v1.S3File)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bucket.
+   */
+  java.lang.String getBucket();
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bytes for bucket.
+   */
+  com.google.protobuf.ByteString
+      getBucketBytes();
+
+  /**
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  java.lang.String getName();
+  /**
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+
+  /**
+   * <code>string content_type = 9;</code>
+   * @return The contentType.
+   */
+  java.lang.String getContentType();
+  /**
+   * <code>string content_type = 9;</code>
+   * @return The bytes for contentType.
+   */
+  com.google.protobuf.ByteString
+      getContentTypeBytes();
+}

+ 870 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileRequest.java

@@ -0,0 +1,870 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: lily.proto
+
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+/**
+ * Protobuf type {@code palm.lily.v1.S3GetFileRequest}
+ */
+public final class S3GetFileRequest extends
+    com.google.protobuf.GeneratedMessageV3 implements
+    // @@protoc_insertion_point(message_implements:palm.lily.v1.S3GetFileRequest)
+    S3GetFileRequestOrBuilder {
+private static final long serialVersionUID = 0L;
+  // Use S3GetFileRequest.newBuilder() to construct.
+  private S3GetFileRequest(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+    super(builder);
+  }
+  private S3GetFileRequest() {
+    bucket_ = "";
+    name_ = "";
+  }
+
+  @java.lang.Override
+  @SuppressWarnings({"unused"})
+  protected java.lang.Object newInstance(
+      UnusedPrivateParameter unused) {
+    return new S3GetFileRequest();
+  }
+
+  public static final com.google.protobuf.Descriptors.Descriptor
+      getDescriptor() {
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileRequest_descriptor;
+  }
+
+  @java.lang.Override
+  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internalGetFieldAccessorTable() {
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileRequest_fieldAccessorTable
+        .ensureFieldAccessorsInitialized(
+            com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.Builder.class);
+  }
+
+  private int bitField0_;
+  public static final int BUCKET_FIELD_NUMBER = 1;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object bucket_ = "";
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bucket.
+   */
+  @java.lang.Override
+  public java.lang.String getBucket() {
+    java.lang.Object ref = bucket_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      bucket_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bytes for bucket.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getBucketBytes() {
+    java.lang.Object ref = bucket_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      bucket_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int NAME_FIELD_NUMBER = 2;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object name_ = "";
+  /**
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  @java.lang.Override
+  public java.lang.String getName() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      name_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getNameBytes() {
+    java.lang.Object ref = name_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      name_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int TTL_FIELD_NUMBER = 9;
+  private com.google.protobuf.Duration ttl_;
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   * @return Whether the ttl field is set.
+   */
+  @java.lang.Override
+  public boolean hasTtl() {
+    return ((bitField0_ & 0x00000001) != 0);
+  }
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   * @return The ttl.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Duration getTtl() {
+    return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+  }
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.DurationOrBuilder getTtlOrBuilder() {
+    return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+  }
+
+  private byte memoizedIsInitialized = -1;
+  @java.lang.Override
+  public final boolean isInitialized() {
+    byte isInitialized = memoizedIsInitialized;
+    if (isInitialized == 1) return true;
+    if (isInitialized == 0) return false;
+
+    memoizedIsInitialized = 1;
+    return true;
+  }
+
+  @java.lang.Override
+  public void writeTo(com.google.protobuf.CodedOutputStream output)
+                      throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bucket_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, bucket_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+    }
+    if (((bitField0_ & 0x00000001) != 0)) {
+      output.writeMessage(9, getTtl());
+    }
+    getUnknownFields().writeTo(output);
+  }
+
+  @java.lang.Override
+  public int getSerializedSize() {
+    int size = memoizedSize;
+    if (size != -1) return size;
+
+    size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(bucket_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, bucket_);
+    }
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+    }
+    if (((bitField0_ & 0x00000001) != 0)) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(9, getTtl());
+    }
+    size += getUnknownFields().getSerializedSize();
+    memoizedSize = size;
+    return size;
+  }
+
+  @java.lang.Override
+  public boolean equals(final java.lang.Object obj) {
+    if (obj == this) {
+     return true;
+    }
+    if (!(obj instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest)) {
+      return super.equals(obj);
+    }
+    com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest other = (com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest) obj;
+
+    if (!getBucket()
+        .equals(other.getBucket())) return false;
+    if (!getName()
+        .equals(other.getName())) return false;
+    if (hasTtl() != other.hasTtl()) return false;
+    if (hasTtl()) {
+      if (!getTtl()
+          .equals(other.getTtl())) return false;
+    }
+    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
+    return true;
+  }
+
+  @java.lang.Override
+  public int hashCode() {
+    if (memoizedHashCode != 0) {
+      return memoizedHashCode;
+    }
+    int hash = 41;
+    hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + BUCKET_FIELD_NUMBER;
+    hash = (53 * hash) + getBucket().hashCode();
+    hash = (37 * hash) + NAME_FIELD_NUMBER;
+    hash = (53 * hash) + getName().hashCode();
+    if (hasTtl()) {
+      hash = (37 * hash) + TTL_FIELD_NUMBER;
+      hash = (53 * hash) + getTtl().hashCode();
+    }
+    hash = (29 * hash) + getUnknownFields().hashCode();
+    memoizedHashCode = hash;
+    return hash;
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      java.nio.ByteBuffer data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      java.nio.ByteBuffer data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      com.google.protobuf.ByteString data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      com.google.protobuf.ByteString data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(byte[] data)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      byte[] data,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws com.google.protobuf.InvalidProtocolBufferException {
+    return PARSER.parseFrom(data, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseDelimitedFrom(java.io.InputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input);
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseDelimitedFrom(
+      java.io.InputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      com.google.protobuf.CodedInputStream input)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input);
+  }
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest parseFrom(
+      com.google.protobuf.CodedInputStream input,
+      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+      throws java.io.IOException {
+    return com.google.protobuf.GeneratedMessageV3
+        .parseWithIOException(PARSER, input, extensionRegistry);
+  }
+
+  @java.lang.Override
+  public Builder newBuilderForType() { return newBuilder(); }
+  public static Builder newBuilder() {
+    return DEFAULT_INSTANCE.toBuilder();
+  }
+  public static Builder newBuilder(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest prototype) {
+    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+  }
+  @java.lang.Override
+  public Builder toBuilder() {
+    return this == DEFAULT_INSTANCE
+        ? new Builder() : new Builder().mergeFrom(this);
+  }
+
+  @java.lang.Override
+  protected Builder newBuilderForType(
+      com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+    Builder builder = new Builder(parent);
+    return builder;
+  }
+  /**
+   * Protobuf type {@code palm.lily.v1.S3GetFileRequest}
+   */
+  public static final class Builder extends
+      com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+      // @@protoc_insertion_point(builder_implements:palm.lily.v1.S3GetFileRequest)
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequestOrBuilder {
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileRequest_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileRequest_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.Builder.class);
+    }
+
+    // Construct using com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.newBuilder()
+    private Builder() {
+      maybeForceBuilderInitialization();
+    }
+
+    private Builder(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      super(parent);
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getTtlFieldBuilder();
+      }
+    }
+    @java.lang.Override
+    public Builder clear() {
+      super.clear();
+      bitField0_ = 0;
+      bucket_ = "";
+      name_ = "";
+      ttl_ = null;
+      if (ttlBuilder_ != null) {
+        ttlBuilder_.dispose();
+        ttlBuilder_ = null;
+      }
+      return this;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.Descriptor
+        getDescriptorForType() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileRequest_descriptor;
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest getDefaultInstanceForType() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.getDefaultInstance();
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest build() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest result = buildPartial();
+      if (!result.isInitialized()) {
+        throw newUninitializedMessageException(result);
+      }
+      return result;
+    }
+
+    @java.lang.Override
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest buildPartial() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest result = new com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest(this);
+      if (bitField0_ != 0) { buildPartial0(result); }
+      onBuilt();
+      return result;
+    }
+
+    private void buildPartial0(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest result) {
+      int from_bitField0_ = bitField0_;
+      if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.bucket_ = bucket_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
+        result.name_ = name_;
+      }
+      int to_bitField0_ = 0;
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.ttl_ = ttlBuilder_ == null
+            ? ttl_
+            : ttlBuilder_.build();
+        to_bitField0_ |= 0x00000001;
+      }
+      result.bitField0_ |= to_bitField0_;
+    }
+
+    @java.lang.Override
+    public Builder clone() {
+      return super.clone();
+    }
+    @java.lang.Override
+    public Builder setField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.setField(field, value);
+    }
+    @java.lang.Override
+    public Builder clearField(
+        com.google.protobuf.Descriptors.FieldDescriptor field) {
+      return super.clearField(field);
+    }
+    @java.lang.Override
+    public Builder clearOneof(
+        com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+      return super.clearOneof(oneof);
+    }
+    @java.lang.Override
+    public Builder setRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        int index, java.lang.Object value) {
+      return super.setRepeatedField(field, index, value);
+    }
+    @java.lang.Override
+    public Builder addRepeatedField(
+        com.google.protobuf.Descriptors.FieldDescriptor field,
+        java.lang.Object value) {
+      return super.addRepeatedField(field, value);
+    }
+    @java.lang.Override
+    public Builder mergeFrom(com.google.protobuf.Message other) {
+      if (other instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest) {
+        return mergeFrom((com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest)other);
+      } else {
+        super.mergeFrom(other);
+        return this;
+      }
+    }
+
+    public Builder mergeFrom(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest other) {
+      if (other == com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.getDefaultInstance()) return this;
+      if (!other.getBucket().isEmpty()) {
+        bucket_ = other.bucket_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
+      if (!other.getName().isEmpty()) {
+        name_ = other.name_;
+        bitField0_ |= 0x00000002;
+        onChanged();
+      }
+      if (other.hasTtl()) {
+        mergeTtl(other.getTtl());
+      }
+      this.mergeUnknownFields(other.getUnknownFields());
+      onChanged();
+      return this;
+    }
+
+    @java.lang.Override
+    public final boolean isInitialized() {
+      return true;
+    }
+
+    @java.lang.Override
+    public Builder mergeFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              bucket_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000001;
+              break;
+            } // case 10
+            case 18: {
+              name_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000002;
+              break;
+            } // case 18
+            case 74: {
+              input.readMessage(
+                  getTtlFieldBuilder().getBuilder(),
+                  extensionRegistry);
+              bitField0_ |= 0x00000004;
+              break;
+            } // case 74
+            default: {
+              if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+                done = true; // was an endgroup tag
+              }
+              break;
+            } // default:
+          } // switch (tag)
+        } // while (!done)
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.unwrapIOException();
+      } finally {
+        onChanged();
+      } // finally
+      return this;
+    }
+    private int bitField0_;
+
+    private java.lang.Object bucket_ = "";
+    /**
+     * <code>string bucket = 1;</code>
+     * @return The bucket.
+     */
+    public java.lang.String getBucket() {
+      java.lang.Object ref = bucket_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        bucket_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @return The bytes for bucket.
+     */
+    public com.google.protobuf.ByteString
+        getBucketBytes() {
+      java.lang.Object ref = bucket_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        bucket_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @param value The bucket to set.
+     * @return This builder for chaining.
+     */
+    public Builder setBucket(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      bucket_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearBucket() {
+      bucket_ = getDefaultInstance().getBucket();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string bucket = 1;</code>
+     * @param value The bytes for bucket to set.
+     * @return This builder for chaining.
+     */
+    public Builder setBucketBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      bucket_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
+    private java.lang.Object name_ = "";
+    /**
+     * <code>string name = 2;</code>
+     * @return The name.
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @return The bytes for name.
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @param value The name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setName(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      name_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearName() {
+      name_ = getDefaultInstance().getName();
+      bitField0_ = (bitField0_ & ~0x00000002);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string name = 2;</code>
+     * @param value The bytes for name to set.
+     * @return This builder for chaining.
+     */
+    public Builder setNameBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      name_ = value;
+      bitField0_ |= 0x00000002;
+      onChanged();
+      return this;
+    }
+
+    private com.google.protobuf.Duration ttl_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> ttlBuilder_;
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     * @return Whether the ttl field is set.
+     */
+    public boolean hasTtl() {
+      return ((bitField0_ & 0x00000004) != 0);
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     * @return The ttl.
+     */
+    public com.google.protobuf.Duration getTtl() {
+      if (ttlBuilder_ == null) {
+        return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+      } else {
+        return ttlBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public Builder setTtl(com.google.protobuf.Duration value) {
+      if (ttlBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ttl_ = value;
+      } else {
+        ttlBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public Builder setTtl(
+        com.google.protobuf.Duration.Builder builderForValue) {
+      if (ttlBuilder_ == null) {
+        ttl_ = builderForValue.build();
+      } else {
+        ttlBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public Builder mergeTtl(com.google.protobuf.Duration value) {
+      if (ttlBuilder_ == null) {
+        if (((bitField0_ & 0x00000004) != 0) &&
+          ttl_ != null &&
+          ttl_ != com.google.protobuf.Duration.getDefaultInstance()) {
+          getTtlBuilder().mergeFrom(value);
+        } else {
+          ttl_ = value;
+        }
+      } else {
+        ttlBuilder_.mergeFrom(value);
+      }
+      if (ttl_ != null) {
+        bitField0_ |= 0x00000004;
+        onChanged();
+      }
+      return this;
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public Builder clearTtl() {
+      bitField0_ = (bitField0_ & ~0x00000004);
+      ttl_ = null;
+      if (ttlBuilder_ != null) {
+        ttlBuilder_.dispose();
+        ttlBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public com.google.protobuf.Duration.Builder getTtlBuilder() {
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return getTtlFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    public com.google.protobuf.DurationOrBuilder getTtlOrBuilder() {
+      if (ttlBuilder_ != null) {
+        return ttlBuilder_.getMessageOrBuilder();
+      } else {
+        return ttl_ == null ?
+            com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+      }
+    }
+    /**
+     * <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> 
+        getTtlFieldBuilder() {
+      if (ttlBuilder_ == null) {
+        ttlBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>(
+                getTtl(),
+                getParentForChildren(),
+                isClean());
+        ttl_ = null;
+      }
+      return ttlBuilder_;
+    }
+    @java.lang.Override
+    public final Builder setUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.setUnknownFields(unknownFields);
+    }
+
+    @java.lang.Override
+    public final Builder mergeUnknownFields(
+        final com.google.protobuf.UnknownFieldSet unknownFields) {
+      return super.mergeUnknownFields(unknownFields);
+    }
+
+
+    // @@protoc_insertion_point(builder_scope:palm.lily.v1.S3GetFileRequest)
+  }
+
+  // @@protoc_insertion_point(class_scope:palm.lily.v1.S3GetFileRequest)
+  private static final com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest DEFAULT_INSTANCE;
+  static {
+    DEFAULT_INSTANCE = new com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest();
+  }
+
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest getDefaultInstance() {
+    return DEFAULT_INSTANCE;
+  }
+
+  private static final com.google.protobuf.Parser<S3GetFileRequest>
+      PARSER = new com.google.protobuf.AbstractParser<S3GetFileRequest>() {
+    @java.lang.Override
+    public S3GetFileRequest parsePartialFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      Builder builder = newBuilder();
+      try {
+        builder.mergeFrom(input, extensionRegistry);
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(builder.buildPartial());
+      } catch (com.google.protobuf.UninitializedMessageException e) {
+        throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(e)
+            .setUnfinishedMessage(builder.buildPartial());
+      }
+      return builder.buildPartial();
+    }
+  };
+
+  public static com.google.protobuf.Parser<S3GetFileRequest> parser() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.google.protobuf.Parser<S3GetFileRequest> getParserForType() {
+    return PARSER;
+  }
+
+  @java.lang.Override
+  public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest getDefaultInstanceForType() {
+    return DEFAULT_INSTANCE;
+  }
+
+}
+

+ 48 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileRequestOrBuilder.java

@@ -0,0 +1,48 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: lily.proto
+
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+public interface S3GetFileRequestOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:palm.lily.v1.S3GetFileRequest)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bucket.
+   */
+  java.lang.String getBucket();
+  /**
+   * <code>string bucket = 1;</code>
+   * @return The bytes for bucket.
+   */
+  com.google.protobuf.ByteString
+      getBucketBytes();
+
+  /**
+   * <code>string name = 2;</code>
+   * @return The name.
+   */
+  java.lang.String getName();
+  /**
+   * <code>string name = 2;</code>
+   * @return The bytes for name.
+   */
+  com.google.protobuf.ByteString
+      getNameBytes();
+
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   * @return Whether the ttl field is set.
+   */
+  boolean hasTtl();
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   * @return The ttl.
+   */
+  com.google.protobuf.Duration getTtl();
+  /**
+   * <code>.google.protobuf.Duration ttl = 9;</code>
+   */
+  com.google.protobuf.DurationOrBuilder getTtlOrBuilder();
+}

+ 104 - 195
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/File.java → rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileResponse.java

@@ -4,101 +4,80 @@
 package com.github.saturn_xiv.palm.plugins.lily.v1;
 
 /**
- * Protobuf type {@code palm.lily.v1.File}
+ * Protobuf type {@code palm.lily.v1.S3GetFileResponse}
  */
-public final class File extends
+public final class S3GetFileResponse extends
     com.google.protobuf.GeneratedMessageV3 implements
-    // @@protoc_insertion_point(message_implements:palm.lily.v1.File)
-    FileOrBuilder {
+    // @@protoc_insertion_point(message_implements:palm.lily.v1.S3GetFileResponse)
+    S3GetFileResponseOrBuilder {
 private static final long serialVersionUID = 0L;
-  // Use File.newBuilder() to construct.
-  private File(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+  // Use S3GetFileResponse.newBuilder() to construct.
+  private S3GetFileResponse(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
     super(builder);
   }
-  private File() {
-    contentType_ = "";
-    payload_ = com.google.protobuf.ByteString.EMPTY;
+  private S3GetFileResponse() {
+    url_ = "";
   }
 
   @java.lang.Override
   @SuppressWarnings({"unused"})
   protected java.lang.Object newInstance(
       UnusedPrivateParameter unused) {
-    return new File();
+    return new S3GetFileResponse();
   }
 
   public static final com.google.protobuf.Descriptors.Descriptor
       getDescriptor() {
-    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_File_descriptor;
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileResponse_descriptor;
   }
 
   @java.lang.Override
   protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
       internalGetFieldAccessorTable() {
-    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_File_fieldAccessorTable
+    return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileResponse_fieldAccessorTable
         .ensureFieldAccessorsInitialized(
-            com.github.saturn_xiv.palm.plugins.lily.v1.File.class, com.github.saturn_xiv.palm.plugins.lily.v1.File.Builder.class);
+            com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.Builder.class);
   }
 
-  private int bitField0_;
-  public static final int CONTENT_TYPE_FIELD_NUMBER = 1;
+  public static final int URL_FIELD_NUMBER = 1;
   @SuppressWarnings("serial")
-  private volatile java.lang.Object contentType_ = "";
+  private volatile java.lang.Object url_ = "";
   /**
-   * <code>optional string content_type = 1;</code>
-   * @return Whether the contentType field is set.
+   * <code>string url = 1;</code>
+   * @return The url.
    */
   @java.lang.Override
-  public boolean hasContentType() {
-    return ((bitField0_ & 0x00000001) != 0);
-  }
-  /**
-   * <code>optional string content_type = 1;</code>
-   * @return The contentType.
-   */
-  @java.lang.Override
-  public java.lang.String getContentType() {
-    java.lang.Object ref = contentType_;
+  public java.lang.String getUrl() {
+    java.lang.Object ref = url_;
     if (ref instanceof java.lang.String) {
       return (java.lang.String) ref;
     } else {
       com.google.protobuf.ByteString bs = 
           (com.google.protobuf.ByteString) ref;
       java.lang.String s = bs.toStringUtf8();
-      contentType_ = s;
+      url_ = s;
       return s;
     }
   }
   /**
-   * <code>optional string content_type = 1;</code>
-   * @return The bytes for contentType.
+   * <code>string url = 1;</code>
+   * @return The bytes for url.
    */
   @java.lang.Override
   public com.google.protobuf.ByteString
-      getContentTypeBytes() {
-    java.lang.Object ref = contentType_;
+      getUrlBytes() {
+    java.lang.Object ref = url_;
     if (ref instanceof java.lang.String) {
       com.google.protobuf.ByteString b = 
           com.google.protobuf.ByteString.copyFromUtf8(
               (java.lang.String) ref);
-      contentType_ = b;
+      url_ = b;
       return b;
     } else {
       return (com.google.protobuf.ByteString) ref;
     }
   }
 
-  public static final int PAYLOAD_FIELD_NUMBER = 2;
-  private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY;
-  /**
-   * <code>bytes payload = 2;</code>
-   * @return The payload.
-   */
-  @java.lang.Override
-  public com.google.protobuf.ByteString getPayload() {
-    return payload_;
-  }
-
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -113,11 +92,8 @@ private static final long serialVersionUID = 0L;
   @java.lang.Override
   public void writeTo(com.google.protobuf.CodedOutputStream output)
                       throws java.io.IOException {
-    if (((bitField0_ & 0x00000001) != 0)) {
-      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, contentType_);
-    }
-    if (!payload_.isEmpty()) {
-      output.writeBytes(2, payload_);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, url_);
     }
     getUnknownFields().writeTo(output);
   }
@@ -128,12 +104,8 @@ private static final long serialVersionUID = 0L;
     if (size != -1) return size;
 
     size = 0;
-    if (((bitField0_ & 0x00000001) != 0)) {
-      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, contentType_);
-    }
-    if (!payload_.isEmpty()) {
-      size += com.google.protobuf.CodedOutputStream
-        .computeBytesSize(2, payload_);
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(url_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, url_);
     }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
@@ -145,18 +117,13 @@ private static final long serialVersionUID = 0L;
     if (obj == this) {
      return true;
     }
-    if (!(obj instanceof com.github.saturn_xiv.palm.plugins.lily.v1.File)) {
+    if (!(obj instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse)) {
       return super.equals(obj);
     }
-    com.github.saturn_xiv.palm.plugins.lily.v1.File other = (com.github.saturn_xiv.palm.plugins.lily.v1.File) obj;
+    com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse other = (com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse) obj;
 
-    if (hasContentType() != other.hasContentType()) return false;
-    if (hasContentType()) {
-      if (!getContentType()
-          .equals(other.getContentType())) return false;
-    }
-    if (!getPayload()
-        .equals(other.getPayload())) return false;
+    if (!getUrl()
+        .equals(other.getUrl())) return false;
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
   }
@@ -168,55 +135,51 @@ private static final long serialVersionUID = 0L;
     }
     int hash = 41;
     hash = (19 * hash) + getDescriptor().hashCode();
-    if (hasContentType()) {
-      hash = (37 * hash) + CONTENT_TYPE_FIELD_NUMBER;
-      hash = (53 * hash) + getContentType().hashCode();
-    }
-    hash = (37 * hash) + PAYLOAD_FIELD_NUMBER;
-    hash = (53 * hash) + getPayload().hashCode();
+    hash = (37 * hash) + URL_FIELD_NUMBER;
+    hash = (53 * hash) + getUrl().hashCode();
     hash = (29 * hash) + getUnknownFields().hashCode();
     memoizedHashCode = hash;
     return hash;
   }
 
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       java.nio.ByteBuffer data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       java.nio.ByteBuffer data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       com.google.protobuf.ByteString data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       com.google.protobuf.ByteString data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(byte[] data)
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(byte[] data)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       byte[] data,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws com.google.protobuf.InvalidProtocolBufferException {
     return PARSER.parseFrom(data, extensionRegistry);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(java.io.InputStream input)
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -224,26 +187,26 @@ private static final long serialVersionUID = 0L;
         .parseWithIOException(PARSER, input, extensionRegistry);
   }
 
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseDelimitedFrom(java.io.InputStream input)
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseDelimitedFrom(java.io.InputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input);
   }
 
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseDelimitedFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseDelimitedFrom(
       java.io.InputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       com.google.protobuf.CodedInputStream input)
       throws java.io.IOException {
     return com.google.protobuf.GeneratedMessageV3
         .parseWithIOException(PARSER, input);
   }
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File parseFrom(
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse parseFrom(
       com.google.protobuf.CodedInputStream input,
       com.google.protobuf.ExtensionRegistryLite extensionRegistry)
       throws java.io.IOException {
@@ -256,7 +219,7 @@ private static final long serialVersionUID = 0L;
   public static Builder newBuilder() {
     return DEFAULT_INSTANCE.toBuilder();
   }
-  public static Builder newBuilder(com.github.saturn_xiv.palm.plugins.lily.v1.File prototype) {
+  public static Builder newBuilder(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse prototype) {
     return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
   }
   @java.lang.Override
@@ -272,26 +235,26 @@ private static final long serialVersionUID = 0L;
     return builder;
   }
   /**
-   * Protobuf type {@code palm.lily.v1.File}
+   * Protobuf type {@code palm.lily.v1.S3GetFileResponse}
    */
   public static final class Builder extends
       com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
-      // @@protoc_insertion_point(builder_implements:palm.lily.v1.File)
-      com.github.saturn_xiv.palm.plugins.lily.v1.FileOrBuilder {
+      // @@protoc_insertion_point(builder_implements:palm.lily.v1.S3GetFileResponse)
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponseOrBuilder {
     public static final com.google.protobuf.Descriptors.Descriptor
         getDescriptor() {
-      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_File_descriptor;
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileResponse_descriptor;
     }
 
     @java.lang.Override
     protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
         internalGetFieldAccessorTable() {
-      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_File_fieldAccessorTable
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileResponse_fieldAccessorTable
           .ensureFieldAccessorsInitialized(
-              com.github.saturn_xiv.palm.plugins.lily.v1.File.class, com.github.saturn_xiv.palm.plugins.lily.v1.File.Builder.class);
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.class, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.Builder.class);
     }
 
-    // Construct using com.github.saturn_xiv.palm.plugins.lily.v1.File.newBuilder()
+    // Construct using com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.newBuilder()
     private Builder() {
 
     }
@@ -305,25 +268,24 @@ private static final long serialVersionUID = 0L;
     public Builder clear() {
       super.clear();
       bitField0_ = 0;
-      contentType_ = "";
-      payload_ = com.google.protobuf.ByteString.EMPTY;
+      url_ = "";
       return this;
     }
 
     @java.lang.Override
     public com.google.protobuf.Descriptors.Descriptor
         getDescriptorForType() {
-      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_File_descriptor;
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.internal_static_palm_lily_v1_S3GetFileResponse_descriptor;
     }
 
     @java.lang.Override
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File getDefaultInstanceForType() {
-      return com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance();
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse getDefaultInstanceForType() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.getDefaultInstance();
     }
 
     @java.lang.Override
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File build() {
-      com.github.saturn_xiv.palm.plugins.lily.v1.File result = buildPartial();
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse build() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse result = buildPartial();
       if (!result.isInitialized()) {
         throw newUninitializedMessageException(result);
       }
@@ -331,24 +293,18 @@ private static final long serialVersionUID = 0L;
     }
 
     @java.lang.Override
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File buildPartial() {
-      com.github.saturn_xiv.palm.plugins.lily.v1.File result = new com.github.saturn_xiv.palm.plugins.lily.v1.File(this);
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse buildPartial() {
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse result = new com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse(this);
       if (bitField0_ != 0) { buildPartial0(result); }
       onBuilt();
       return result;
     }
 
-    private void buildPartial0(com.github.saturn_xiv.palm.plugins.lily.v1.File result) {
+    private void buildPartial0(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse result) {
       int from_bitField0_ = bitField0_;
-      int to_bitField0_ = 0;
       if (((from_bitField0_ & 0x00000001) != 0)) {
-        result.contentType_ = contentType_;
-        to_bitField0_ |= 0x00000001;
+        result.url_ = url_;
       }
-      if (((from_bitField0_ & 0x00000002) != 0)) {
-        result.payload_ = payload_;
-      }
-      result.bitField0_ |= to_bitField0_;
     }
 
     @java.lang.Override
@@ -385,24 +341,21 @@ private static final long serialVersionUID = 0L;
     }
     @java.lang.Override
     public Builder mergeFrom(com.google.protobuf.Message other) {
-      if (other instanceof com.github.saturn_xiv.palm.plugins.lily.v1.File) {
-        return mergeFrom((com.github.saturn_xiv.palm.plugins.lily.v1.File)other);
+      if (other instanceof com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse) {
+        return mergeFrom((com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse)other);
       } else {
         super.mergeFrom(other);
         return this;
       }
     }
 
-    public Builder mergeFrom(com.github.saturn_xiv.palm.plugins.lily.v1.File other) {
-      if (other == com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()) return this;
-      if (other.hasContentType()) {
-        contentType_ = other.contentType_;
+    public Builder mergeFrom(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse other) {
+      if (other == com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.getDefaultInstance()) return this;
+      if (!other.getUrl().isEmpty()) {
+        url_ = other.url_;
         bitField0_ |= 0x00000001;
         onChanged();
       }
-      if (other.getPayload() != com.google.protobuf.ByteString.EMPTY) {
-        setPayload(other.getPayload());
-      }
       this.mergeUnknownFields(other.getUnknownFields());
       onChanged();
       return this;
@@ -430,15 +383,10 @@ private static final long serialVersionUID = 0L;
               done = true;
               break;
             case 10: {
-              contentType_ = input.readStringRequireUtf8();
+              url_ = input.readStringRequireUtf8();
               bitField0_ |= 0x00000001;
               break;
             } // case 10
-            case 18: {
-              payload_ = input.readBytes();
-              bitField0_ |= 0x00000002;
-              break;
-            } // case 18
             default: {
               if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                 done = true; // was an endgroup tag
@@ -456,116 +404,77 @@ private static final long serialVersionUID = 0L;
     }
     private int bitField0_;
 
-    private java.lang.Object contentType_ = "";
-    /**
-     * <code>optional string content_type = 1;</code>
-     * @return Whether the contentType field is set.
-     */
-    public boolean hasContentType() {
-      return ((bitField0_ & 0x00000001) != 0);
-    }
+    private java.lang.Object url_ = "";
     /**
-     * <code>optional string content_type = 1;</code>
-     * @return The contentType.
+     * <code>string url = 1;</code>
+     * @return The url.
      */
-    public java.lang.String getContentType() {
-      java.lang.Object ref = contentType_;
+    public java.lang.String getUrl() {
+      java.lang.Object ref = url_;
       if (!(ref instanceof java.lang.String)) {
         com.google.protobuf.ByteString bs =
             (com.google.protobuf.ByteString) ref;
         java.lang.String s = bs.toStringUtf8();
-        contentType_ = s;
+        url_ = s;
         return s;
       } else {
         return (java.lang.String) ref;
       }
     }
     /**
-     * <code>optional string content_type = 1;</code>
-     * @return The bytes for contentType.
+     * <code>string url = 1;</code>
+     * @return The bytes for url.
      */
     public com.google.protobuf.ByteString
-        getContentTypeBytes() {
-      java.lang.Object ref = contentType_;
+        getUrlBytes() {
+      java.lang.Object ref = url_;
       if (ref instanceof String) {
         com.google.protobuf.ByteString b = 
             com.google.protobuf.ByteString.copyFromUtf8(
                 (java.lang.String) ref);
-        contentType_ = b;
+        url_ = b;
         return b;
       } else {
         return (com.google.protobuf.ByteString) ref;
       }
     }
     /**
-     * <code>optional string content_type = 1;</code>
-     * @param value The contentType to set.
+     * <code>string url = 1;</code>
+     * @param value The url to set.
      * @return This builder for chaining.
      */
-    public Builder setContentType(
+    public Builder setUrl(
         java.lang.String value) {
       if (value == null) { throw new NullPointerException(); }
-      contentType_ = value;
+      url_ = value;
       bitField0_ |= 0x00000001;
       onChanged();
       return this;
     }
     /**
-     * <code>optional string content_type = 1;</code>
+     * <code>string url = 1;</code>
      * @return This builder for chaining.
      */
-    public Builder clearContentType() {
-      contentType_ = getDefaultInstance().getContentType();
+    public Builder clearUrl() {
+      url_ = getDefaultInstance().getUrl();
       bitField0_ = (bitField0_ & ~0x00000001);
       onChanged();
       return this;
     }
     /**
-     * <code>optional string content_type = 1;</code>
-     * @param value The bytes for contentType to set.
+     * <code>string url = 1;</code>
+     * @param value The bytes for url to set.
      * @return This builder for chaining.
      */
-    public Builder setContentTypeBytes(
+    public Builder setUrlBytes(
         com.google.protobuf.ByteString value) {
       if (value == null) { throw new NullPointerException(); }
       checkByteStringIsUtf8(value);
-      contentType_ = value;
+      url_ = value;
       bitField0_ |= 0x00000001;
       onChanged();
       return this;
     }
-
-    private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY;
-    /**
-     * <code>bytes payload = 2;</code>
-     * @return The payload.
-     */
-    @java.lang.Override
-    public com.google.protobuf.ByteString getPayload() {
-      return payload_;
-    }
-    /**
-     * <code>bytes payload = 2;</code>
-     * @param value The payload to set.
-     * @return This builder for chaining.
-     */
-    public Builder setPayload(com.google.protobuf.ByteString value) {
-      if (value == null) { throw new NullPointerException(); }
-      payload_ = value;
-      bitField0_ |= 0x00000002;
-      onChanged();
-      return this;
-    }
-    /**
-     * <code>bytes payload = 2;</code>
-     * @return This builder for chaining.
-     */
-    public Builder clearPayload() {
-      bitField0_ = (bitField0_ & ~0x00000002);
-      payload_ = getDefaultInstance().getPayload();
-      onChanged();
-      return this;
-    }
     @java.lang.Override
     public final Builder setUnknownFields(
         final com.google.protobuf.UnknownFieldSet unknownFields) {
@@ -579,23 +488,23 @@ private static final long serialVersionUID = 0L;
     }
 
 
-    // @@protoc_insertion_point(builder_scope:palm.lily.v1.File)
+    // @@protoc_insertion_point(builder_scope:palm.lily.v1.S3GetFileResponse)
   }
 
-  // @@protoc_insertion_point(class_scope:palm.lily.v1.File)
-  private static final com.github.saturn_xiv.palm.plugins.lily.v1.File DEFAULT_INSTANCE;
+  // @@protoc_insertion_point(class_scope:palm.lily.v1.S3GetFileResponse)
+  private static final com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse DEFAULT_INSTANCE;
   static {
-    DEFAULT_INSTANCE = new com.github.saturn_xiv.palm.plugins.lily.v1.File();
+    DEFAULT_INSTANCE = new com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse();
   }
 
-  public static com.github.saturn_xiv.palm.plugins.lily.v1.File getDefaultInstance() {
+  public static com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse getDefaultInstance() {
     return DEFAULT_INSTANCE;
   }
 
-  private static final com.google.protobuf.Parser<File>
-      PARSER = new com.google.protobuf.AbstractParser<File>() {
+  private static final com.google.protobuf.Parser<S3GetFileResponse>
+      PARSER = new com.google.protobuf.AbstractParser<S3GetFileResponse>() {
     @java.lang.Override
-    public File parsePartialFrom(
+    public S3GetFileResponse parsePartialFrom(
         com.google.protobuf.CodedInputStream input,
         com.google.protobuf.ExtensionRegistryLite extensionRegistry)
         throws com.google.protobuf.InvalidProtocolBufferException {
@@ -614,17 +523,17 @@ private static final long serialVersionUID = 0L;
     }
   };
 
-  public static com.google.protobuf.Parser<File> parser() {
+  public static com.google.protobuf.Parser<S3GetFileResponse> parser() {
     return PARSER;
   }
 
   @java.lang.Override
-  public com.google.protobuf.Parser<File> getParserForType() {
+  public com.google.protobuf.Parser<S3GetFileResponse> getParserForType() {
     return PARSER;
   }
 
   @java.lang.Override
-  public com.github.saturn_xiv.palm.plugins.lily.v1.File getDefaultInstanceForType() {
+  public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse getDefaultInstanceForType() {
     return DEFAULT_INSTANCE;
   }
 

+ 21 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3GetFileResponseOrBuilder.java

@@ -0,0 +1,21 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: lily.proto
+
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+public interface S3GetFileResponseOrBuilder extends
+    // @@protoc_insertion_point(interface_extends:palm.lily.v1.S3GetFileResponse)
+    com.google.protobuf.MessageOrBuilder {
+
+  /**
+   * <code>string url = 1;</code>
+   * @return The url.
+   */
+  java.lang.String getUrl();
+  /**
+   * <code>string url = 1;</code>
+   * @return The bytes for url.
+   */
+  com.google.protobuf.ByteString
+      getUrlBytes();
+}

+ 293 - 0
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/S3Grpc.java

@@ -0,0 +1,293 @@
+package com.github.saturn_xiv.palm.plugins.lily.v1;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+
+/**
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.58.0)",
+    comments = "Source: lily.proto")
+@io.grpc.stub.annotations.GrpcGenerated
+public final class S3Grpc {
+
+  private S3Grpc() {}
+
+  public static final java.lang.String SERVICE_NAME = "palm.lily.v1.S3";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest,
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> getGetFileMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "GetFile",
+      requestType = com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.class,
+      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest,
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> getGetFileMethod() {
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> getGetFileMethod;
+    if ((getGetFileMethod = S3Grpc.getGetFileMethod) == null) {
+      synchronized (S3Grpc.class) {
+        if ((getGetFileMethod = S3Grpc.getGetFileMethod) == null) {
+          S3Grpc.getGetFileMethod = getGetFileMethod =
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetFile"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse.getDefaultInstance()))
+              .setSchemaDescriptor(new S3MethodDescriptorSupplier("GetFile"))
+              .build();
+        }
+      }
+    }
+    return getGetFileMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static S3Stub newStub(io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<S3Stub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<S3Stub>() {
+        @java.lang.Override
+        public S3Stub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new S3Stub(channel, callOptions);
+        }
+      };
+    return S3Stub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static S3BlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<S3BlockingStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<S3BlockingStub>() {
+        @java.lang.Override
+        public S3BlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new S3BlockingStub(channel, callOptions);
+        }
+      };
+    return S3BlockingStub.newStub(factory, channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static S3FutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    io.grpc.stub.AbstractStub.StubFactory<S3FutureStub> factory =
+      new io.grpc.stub.AbstractStub.StubFactory<S3FutureStub>() {
+        @java.lang.Override
+        public S3FutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+          return new S3FutureStub(channel, callOptions);
+        }
+      };
+    return S3FutureStub.newStub(factory, channel);
+  }
+
+  /**
+   */
+  public interface AsyncService {
+
+    /**
+     */
+    default void getFile(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest request,
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> responseObserver) {
+      io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getGetFileMethod(), responseObserver);
+    }
+  }
+
+  /**
+   * Base class for the server implementation of the service S3.
+   */
+  public static abstract class S3ImplBase
+      implements io.grpc.BindableService, AsyncService {
+
+    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+      return S3Grpc.bindService(this);
+    }
+  }
+
+  /**
+   * A stub to allow clients to do asynchronous rpc calls to service S3.
+   */
+  public static final class S3Stub
+      extends io.grpc.stub.AbstractAsyncStub<S3Stub> {
+    private S3Stub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected S3Stub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new S3Stub(channel, callOptions);
+    }
+
+    /**
+     */
+    public void getFile(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest request,
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> responseObserver) {
+      io.grpc.stub.ClientCalls.asyncUnaryCall(
+          getChannel().newCall(getGetFileMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   * A stub to allow clients to do synchronous rpc calls to service S3.
+   */
+  public static final class S3BlockingStub
+      extends io.grpc.stub.AbstractBlockingStub<S3BlockingStub> {
+    private S3BlockingStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected S3BlockingStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new S3BlockingStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse getFile(com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest request) {
+      return io.grpc.stub.ClientCalls.blockingUnaryCall(
+          getChannel(), getGetFileMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   * A stub to allow clients to do ListenableFuture-style rpc calls to service S3.
+   */
+  public static final class S3FutureStub
+      extends io.grpc.stub.AbstractFutureStub<S3FutureStub> {
+    private S3FutureStub(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected S3FutureStub build(
+        io.grpc.Channel channel, io.grpc.CallOptions callOptions) {
+      return new S3FutureStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse> getFile(
+        com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest request) {
+      return io.grpc.stub.ClientCalls.futureUnaryCall(
+          getChannel().newCall(getGetFileMethod(), getCallOptions()), request);
+    }
+  }
+
+  private static final int METHODID_GET_FILE = 0;
+
+  private static final class MethodHandlers<Req, Resp> implements
+      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+    private final AsyncService serviceImpl;
+    private final int methodId;
+
+    MethodHandlers(AsyncService serviceImpl, int methodId) {
+      this.serviceImpl = serviceImpl;
+      this.methodId = methodId;
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        case METHODID_GET_FILE:
+          serviceImpl.getFile((com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest) request,
+              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse>) responseObserver);
+          break;
+        default:
+          throw new AssertionError();
+      }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver<Req> invoke(
+        io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        default:
+          throw new AssertionError();
+      }
+    }
+  }
+
+  public static final io.grpc.ServerServiceDefinition bindService(AsyncService service) {
+    return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+        .addMethod(
+          getGetFileMethod(),
+          io.grpc.stub.ServerCalls.asyncUnaryCall(
+            new MethodHandlers<
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileRequest,
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3GetFileResponse>(
+                service, METHODID_GET_FILE)))
+        .build();
+  }
+
+  private static abstract class S3BaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+    S3BaseDescriptorSupplier() {}
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+      return com.github.saturn_xiv.palm.plugins.lily.v1.Lily.getDescriptor();
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+      return getFileDescriptor().findServiceByName("S3");
+    }
+  }
+
+  private static final class S3FileDescriptorSupplier
+      extends S3BaseDescriptorSupplier {
+    S3FileDescriptorSupplier() {}
+  }
+
+  private static final class S3MethodDescriptorSupplier
+      extends S3BaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+    private final java.lang.String methodName;
+
+    S3MethodDescriptorSupplier(java.lang.String methodName) {
+      this.methodName = methodName;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+      return getServiceDescriptor().findMethodByName(methodName);
+    }
+  }
+
+  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+    io.grpc.ServiceDescriptor result = serviceDescriptor;
+    if (result == null) {
+      synchronized (S3Grpc.class) {
+        result = serviceDescriptor;
+        if (result == null) {
+          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+              .setSchemaDescriptor(new S3FileDescriptorSupplier())
+              .addMethod(getGetFileMethod())
+              .build();
+        }
+      }
+    }
+    return result;
+  }
+}

+ 24 - 24
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexGrpc.java

@@ -16,28 +16,28 @@ public final class TexGrpc {
 
   // Static method descriptors that strictly reflect the proto.
   private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getToPdfMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToPdfMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "ToPdf",
       requestType = com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.class,
-      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.File.class,
+      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getToPdfMethod() {
-    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File> getToPdfMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToPdfMethod() {
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToPdfMethod;
     if ((getToPdfMethod = TexGrpc.getToPdfMethod) == null) {
       synchronized (TexGrpc.class) {
         if ((getToPdfMethod = TexGrpc.getToPdfMethod) == null) {
           TexGrpc.getToPdfMethod = getToPdfMethod =
-              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File>newBuilder()
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ToPdf"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()))
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()))
               .setSchemaDescriptor(new TexMethodDescriptorSupplier("ToPdf"))
               .build();
         }
@@ -47,28 +47,28 @@ public final class TexGrpc {
   }
 
   private static volatile io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getToWordMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToWordMethod;
 
   @io.grpc.stub.annotations.RpcMethod(
       fullMethodName = SERVICE_NAME + '/' + "ToWord",
       requestType = com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.class,
-      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.File.class,
+      responseType = com.github.saturn_xiv.palm.plugins.lily.v1.S3File.class,
       methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
   public static io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-      com.github.saturn_xiv.palm.plugins.lily.v1.File> getToWordMethod() {
-    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File> getToWordMethod;
+      com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToWordMethod() {
+    io.grpc.MethodDescriptor<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File> getToWordMethod;
     if ((getToWordMethod = TexGrpc.getToWordMethod) == null) {
       synchronized (TexGrpc.class) {
         if ((getToWordMethod = TexGrpc.getToWordMethod) == null) {
           TexGrpc.getToWordMethod = getToWordMethod =
-              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.File>newBuilder()
+              io.grpc.MethodDescriptor.<com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest, com.github.saturn_xiv.palm.plugins.lily.v1.S3File>newBuilder()
               .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
               .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ToWord"))
               .setSampledToLocalTracing(true)
               .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
                   com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.getDefaultInstance()))
               .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
-                  com.github.saturn_xiv.palm.plugins.lily.v1.File.getDefaultInstance()))
+                  com.github.saturn_xiv.palm.plugins.lily.v1.S3File.getDefaultInstance()))
               .setSchemaDescriptor(new TexMethodDescriptorSupplier("ToWord"))
               .build();
         }
@@ -128,14 +128,14 @@ public final class TexGrpc {
     /**
      */
     default void toPdf(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getToPdfMethod(), responseObserver);
     }
 
     /**
      */
     default void toWord(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall(getToWordMethod(), responseObserver);
     }
   }
@@ -170,7 +170,7 @@ public final class TexGrpc {
     /**
      */
     public void toPdf(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getToPdfMethod(), getCallOptions()), request, responseObserver);
     }
@@ -178,7 +178,7 @@ public final class TexGrpc {
     /**
      */
     public void toWord(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request,
-        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File> responseObserver) {
+        io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> responseObserver) {
       io.grpc.stub.ClientCalls.asyncUnaryCall(
           getChannel().newCall(getToWordMethod(), getCallOptions()), request, responseObserver);
     }
@@ -202,14 +202,14 @@ public final class TexGrpc {
 
     /**
      */
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File toPdf(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File toPdf(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getToPdfMethod(), getCallOptions(), request);
     }
 
     /**
      */
-    public com.github.saturn_xiv.palm.plugins.lily.v1.File toWord(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
+    public com.github.saturn_xiv.palm.plugins.lily.v1.S3File toWord(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
       return io.grpc.stub.ClientCalls.blockingUnaryCall(
           getChannel(), getToWordMethod(), getCallOptions(), request);
     }
@@ -233,7 +233,7 @@ public final class TexGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.File> toPdf(
+    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> toPdf(
         com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getToPdfMethod(), getCallOptions()), request);
@@ -241,7 +241,7 @@ public final class TexGrpc {
 
     /**
      */
-    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.File> toWord(
+    public com.google.common.util.concurrent.ListenableFuture<com.github.saturn_xiv.palm.plugins.lily.v1.S3File> toWord(
         com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest request) {
       return io.grpc.stub.ClientCalls.futureUnaryCall(
           getChannel().newCall(getToWordMethod(), getCallOptions()), request);
@@ -270,11 +270,11 @@ public final class TexGrpc {
       switch (methodId) {
         case METHODID_TO_PDF:
           serviceImpl.toPdf((com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest) request,
-              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File>) responseObserver);
+              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File>) responseObserver);
           break;
         case METHODID_TO_WORD:
           serviceImpl.toWord((com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest) request,
-              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.File>) responseObserver);
+              (io.grpc.stub.StreamObserver<com.github.saturn_xiv.palm.plugins.lily.v1.S3File>) responseObserver);
           break;
         default:
           throw new AssertionError();
@@ -299,14 +299,14 @@ public final class TexGrpc {
           io.grpc.stub.ServerCalls.asyncUnaryCall(
             new MethodHandlers<
               com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-              com.github.saturn_xiv.palm.plugins.lily.v1.File>(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File>(
                 service, METHODID_TO_PDF)))
         .addMethod(
           getToWordMethod(),
           io.grpc.stub.ServerCalls.asyncUnaryCall(
             new MethodHandlers<
               com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest,
-              com.github.saturn_xiv.palm.plugins.lily.v1.File>(
+              com.github.saturn_xiv.palm.plugins.lily.v1.S3File>(
                 service, METHODID_TO_WORD)))
         .build();
   }

+ 580 - 27
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexToRequest.java

@@ -16,6 +16,8 @@ private static final long serialVersionUID = 0L;
     super(builder);
   }
   private TexToRequest() {
+    title_ = "";
+    owner_ = "";
   }
 
   @java.lang.Override
@@ -35,7 +37,7 @@ private static final long serialVersionUID = 0L;
   protected com.google.protobuf.MapField internalGetMapField(
       int number) {
     switch (number) {
-      case 1:
+      case 2:
         return internalGetFiles();
       default:
         throw new RuntimeException(
@@ -50,7 +52,47 @@ private static final long serialVersionUID = 0L;
             com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.class, com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.Builder.class);
   }
 
-  public static final int FILES_FIELD_NUMBER = 1;
+  private int bitField0_;
+  public static final int TITLE_FIELD_NUMBER = 1;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object title_ = "";
+  /**
+   * <code>string title = 1;</code>
+   * @return The title.
+   */
+  @java.lang.Override
+  public java.lang.String getTitle() {
+    java.lang.Object ref = title_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      title_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>string title = 1;</code>
+   * @return The bytes for title.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getTitleBytes() {
+    java.lang.Object ref = title_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      title_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int FILES_FIELD_NUMBER = 2;
   private static final class FilesDefaultEntryHolder {
     static final com.google.protobuf.MapEntry<
         java.lang.String, com.google.protobuf.ByteString> defaultEntry =
@@ -77,7 +119,7 @@ private static final long serialVersionUID = 0L;
     return internalGetFiles().getMap().size();
   }
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   @java.lang.Override
   public boolean containsFiles(
@@ -94,14 +136,14 @@ private static final long serialVersionUID = 0L;
     return getFilesMap();
   }
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   @java.lang.Override
   public java.util.Map<java.lang.String, com.google.protobuf.ByteString> getFilesMap() {
     return internalGetFiles().getMap();
   }
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   @java.lang.Override
   public /* nullable */
@@ -115,7 +157,7 @@ com.google.protobuf.ByteString defaultValue) {
     return map.containsKey(key) ? map.get(key) : defaultValue;
   }
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   @java.lang.Override
   public com.google.protobuf.ByteString getFilesOrThrow(
@@ -129,6 +171,90 @@ com.google.protobuf.ByteString defaultValue) {
     return map.get(key);
   }
 
+  public static final int TTL_FIELD_NUMBER = 7;
+  private com.google.protobuf.Duration ttl_;
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   * @return Whether the ttl field is set.
+   */
+  @java.lang.Override
+  public boolean hasTtl() {
+    return ((bitField0_ & 0x00000001) != 0);
+  }
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   * @return The ttl.
+   */
+  @java.lang.Override
+  public com.google.protobuf.Duration getTtl() {
+    return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+  }
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   */
+  @java.lang.Override
+  public com.google.protobuf.DurationOrBuilder getTtlOrBuilder() {
+    return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+  }
+
+  public static final int OWNER_FIELD_NUMBER = 8;
+  @SuppressWarnings("serial")
+  private volatile java.lang.Object owner_ = "";
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return Whether the owner field is set.
+   */
+  @java.lang.Override
+  public boolean hasOwner() {
+    return ((bitField0_ & 0x00000002) != 0);
+  }
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return The owner.
+   */
+  @java.lang.Override
+  public java.lang.String getOwner() {
+    java.lang.Object ref = owner_;
+    if (ref instanceof java.lang.String) {
+      return (java.lang.String) ref;
+    } else {
+      com.google.protobuf.ByteString bs = 
+          (com.google.protobuf.ByteString) ref;
+      java.lang.String s = bs.toStringUtf8();
+      owner_ = s;
+      return s;
+    }
+  }
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return The bytes for owner.
+   */
+  @java.lang.Override
+  public com.google.protobuf.ByteString
+      getOwnerBytes() {
+    java.lang.Object ref = owner_;
+    if (ref instanceof java.lang.String) {
+      com.google.protobuf.ByteString b = 
+          com.google.protobuf.ByteString.copyFromUtf8(
+              (java.lang.String) ref);
+      owner_ = b;
+      return b;
+    } else {
+      return (com.google.protobuf.ByteString) ref;
+    }
+  }
+
+  public static final int PUBLISHED_FIELD_NUMBER = 9;
+  private boolean published_ = false;
+  /**
+   * <code>bool published = 9;</code>
+   * @return The published.
+   */
+  @java.lang.Override
+  public boolean getPublished() {
+    return published_;
+  }
+
   private byte memoizedIsInitialized = -1;
   @java.lang.Override
   public final boolean isInitialized() {
@@ -143,12 +269,24 @@ com.google.protobuf.ByteString defaultValue) {
   @java.lang.Override
   public void writeTo(com.google.protobuf.CodedOutputStream output)
                       throws java.io.IOException {
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(title_)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 1, title_);
+    }
     com.google.protobuf.GeneratedMessageV3
       .serializeStringMapTo(
         output,
         internalGetFiles(),
         FilesDefaultEntryHolder.defaultEntry,
-        1);
+        2);
+    if (((bitField0_ & 0x00000001) != 0)) {
+      output.writeMessage(7, getTtl());
+    }
+    if (((bitField0_ & 0x00000002) != 0)) {
+      com.google.protobuf.GeneratedMessageV3.writeString(output, 8, owner_);
+    }
+    if (published_ != false) {
+      output.writeBool(9, published_);
+    }
     getUnknownFields().writeTo(output);
   }
 
@@ -158,6 +296,9 @@ com.google.protobuf.ByteString defaultValue) {
     if (size != -1) return size;
 
     size = 0;
+    if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(title_)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, title_);
+    }
     for (java.util.Map.Entry<java.lang.String, com.google.protobuf.ByteString> entry
          : internalGetFiles().getMap().entrySet()) {
       com.google.protobuf.MapEntry<java.lang.String, com.google.protobuf.ByteString>
@@ -166,7 +307,18 @@ com.google.protobuf.ByteString defaultValue) {
           .setValue(entry.getValue())
           .build();
       size += com.google.protobuf.CodedOutputStream
-          .computeMessageSize(1, files__);
+          .computeMessageSize(2, files__);
+    }
+    if (((bitField0_ & 0x00000001) != 0)) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeMessageSize(7, getTtl());
+    }
+    if (((bitField0_ & 0x00000002) != 0)) {
+      size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, owner_);
+    }
+    if (published_ != false) {
+      size += com.google.protobuf.CodedOutputStream
+        .computeBoolSize(9, published_);
     }
     size += getUnknownFields().getSerializedSize();
     memoizedSize = size;
@@ -183,8 +335,22 @@ com.google.protobuf.ByteString defaultValue) {
     }
     com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest other = (com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest) obj;
 
+    if (!getTitle()
+        .equals(other.getTitle())) return false;
     if (!internalGetFiles().equals(
         other.internalGetFiles())) return false;
+    if (hasTtl() != other.hasTtl()) return false;
+    if (hasTtl()) {
+      if (!getTtl()
+          .equals(other.getTtl())) return false;
+    }
+    if (hasOwner() != other.hasOwner()) return false;
+    if (hasOwner()) {
+      if (!getOwner()
+          .equals(other.getOwner())) return false;
+    }
+    if (getPublished()
+        != other.getPublished()) return false;
     if (!getUnknownFields().equals(other.getUnknownFields())) return false;
     return true;
   }
@@ -196,10 +362,23 @@ com.google.protobuf.ByteString defaultValue) {
     }
     int hash = 41;
     hash = (19 * hash) + getDescriptor().hashCode();
+    hash = (37 * hash) + TITLE_FIELD_NUMBER;
+    hash = (53 * hash) + getTitle().hashCode();
     if (!internalGetFiles().getMap().isEmpty()) {
       hash = (37 * hash) + FILES_FIELD_NUMBER;
       hash = (53 * hash) + internalGetFiles().hashCode();
     }
+    if (hasTtl()) {
+      hash = (37 * hash) + TTL_FIELD_NUMBER;
+      hash = (53 * hash) + getTtl().hashCode();
+    }
+    if (hasOwner()) {
+      hash = (37 * hash) + OWNER_FIELD_NUMBER;
+      hash = (53 * hash) + getOwner().hashCode();
+    }
+    hash = (37 * hash) + PUBLISHED_FIELD_NUMBER;
+    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+        getPublished());
     hash = (29 * hash) + getUnknownFields().hashCode();
     memoizedHashCode = hash;
     return hash;
@@ -313,7 +492,7 @@ com.google.protobuf.ByteString defaultValue) {
     protected com.google.protobuf.MapField internalGetMapField(
         int number) {
       switch (number) {
-        case 1:
+        case 2:
           return internalGetFiles();
         default:
           throw new RuntimeException(
@@ -324,7 +503,7 @@ com.google.protobuf.ByteString defaultValue) {
     protected com.google.protobuf.MapField internalGetMutableMapField(
         int number) {
       switch (number) {
-        case 1:
+        case 2:
           return internalGetMutableFiles();
         default:
           throw new RuntimeException(
@@ -341,19 +520,33 @@ com.google.protobuf.ByteString defaultValue) {
 
     // Construct using com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.newBuilder()
     private Builder() {
-
+      maybeForceBuilderInitialization();
     }
 
     private Builder(
         com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
       super(parent);
-
+      maybeForceBuilderInitialization();
+    }
+    private void maybeForceBuilderInitialization() {
+      if (com.google.protobuf.GeneratedMessageV3
+              .alwaysUseFieldBuilders) {
+        getTtlFieldBuilder();
+      }
     }
     @java.lang.Override
     public Builder clear() {
       super.clear();
       bitField0_ = 0;
+      title_ = "";
       internalGetMutableFiles().clear();
+      ttl_ = null;
+      if (ttlBuilder_ != null) {
+        ttlBuilder_.dispose();
+        ttlBuilder_ = null;
+      }
+      owner_ = "";
+      published_ = false;
       return this;
     }
 
@@ -388,9 +581,27 @@ com.google.protobuf.ByteString defaultValue) {
     private void buildPartial0(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest result) {
       int from_bitField0_ = bitField0_;
       if (((from_bitField0_ & 0x00000001) != 0)) {
+        result.title_ = title_;
+      }
+      if (((from_bitField0_ & 0x00000002) != 0)) {
         result.files_ = internalGetFiles();
         result.files_.makeImmutable();
       }
+      int to_bitField0_ = 0;
+      if (((from_bitField0_ & 0x00000004) != 0)) {
+        result.ttl_ = ttlBuilder_ == null
+            ? ttl_
+            : ttlBuilder_.build();
+        to_bitField0_ |= 0x00000001;
+      }
+      if (((from_bitField0_ & 0x00000008) != 0)) {
+        result.owner_ = owner_;
+        to_bitField0_ |= 0x00000002;
+      }
+      if (((from_bitField0_ & 0x00000010) != 0)) {
+        result.published_ = published_;
+      }
+      result.bitField0_ |= to_bitField0_;
     }
 
     @java.lang.Override
@@ -437,9 +648,25 @@ com.google.protobuf.ByteString defaultValue) {
 
     public Builder mergeFrom(com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest other) {
       if (other == com.github.saturn_xiv.palm.plugins.lily.v1.TexToRequest.getDefaultInstance()) return this;
+      if (!other.getTitle().isEmpty()) {
+        title_ = other.title_;
+        bitField0_ |= 0x00000001;
+        onChanged();
+      }
       internalGetMutableFiles().mergeFrom(
           other.internalGetFiles());
-      bitField0_ |= 0x00000001;
+      bitField0_ |= 0x00000002;
+      if (other.hasTtl()) {
+        mergeTtl(other.getTtl());
+      }
+      if (other.hasOwner()) {
+        owner_ = other.owner_;
+        bitField0_ |= 0x00000008;
+        onChanged();
+      }
+      if (other.getPublished() != false) {
+        setPublished(other.getPublished());
+      }
       this.mergeUnknownFields(other.getUnknownFields());
       onChanged();
       return this;
@@ -467,14 +694,36 @@ com.google.protobuf.ByteString defaultValue) {
               done = true;
               break;
             case 10: {
+              title_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000001;
+              break;
+            } // case 10
+            case 18: {
               com.google.protobuf.MapEntry<java.lang.String, com.google.protobuf.ByteString>
               files__ = input.readMessage(
                   FilesDefaultEntryHolder.defaultEntry.getParserForType(), extensionRegistry);
               internalGetMutableFiles().getMutableMap().put(
                   files__.getKey(), files__.getValue());
-              bitField0_ |= 0x00000001;
+              bitField0_ |= 0x00000002;
               break;
-            } // case 10
+            } // case 18
+            case 58: {
+              input.readMessage(
+                  getTtlFieldBuilder().getBuilder(),
+                  extensionRegistry);
+              bitField0_ |= 0x00000004;
+              break;
+            } // case 58
+            case 66: {
+              owner_ = input.readStringRequireUtf8();
+              bitField0_ |= 0x00000008;
+              break;
+            } // case 66
+            case 72: {
+              published_ = input.readBool();
+              bitField0_ |= 0x00000010;
+              break;
+            } // case 72
             default: {
               if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                 done = true; // was an endgroup tag
@@ -492,6 +741,78 @@ com.google.protobuf.ByteString defaultValue) {
     }
     private int bitField0_;
 
+    private java.lang.Object title_ = "";
+    /**
+     * <code>string title = 1;</code>
+     * @return The title.
+     */
+    public java.lang.String getTitle() {
+      java.lang.Object ref = title_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        title_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>string title = 1;</code>
+     * @return The bytes for title.
+     */
+    public com.google.protobuf.ByteString
+        getTitleBytes() {
+      java.lang.Object ref = title_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        title_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>string title = 1;</code>
+     * @param value The title to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTitle(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      title_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string title = 1;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearTitle() {
+      title_ = getDefaultInstance().getTitle();
+      bitField0_ = (bitField0_ & ~0x00000001);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>string title = 1;</code>
+     * @param value The bytes for title to set.
+     * @return This builder for chaining.
+     */
+    public Builder setTitleBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      title_ = value;
+      bitField0_ |= 0x00000001;
+      onChanged();
+      return this;
+    }
+
     private com.google.protobuf.MapField<
         java.lang.String, com.google.protobuf.ByteString> files_;
     private com.google.protobuf.MapField<java.lang.String, com.google.protobuf.ByteString>
@@ -511,7 +832,7 @@ com.google.protobuf.ByteString defaultValue) {
       if (!files_.isMutable()) {
         files_ = files_.copy();
       }
-      bitField0_ |= 0x00000001;
+      bitField0_ |= 0x00000002;
       onChanged();
       return files_;
     }
@@ -519,7 +840,7 @@ com.google.protobuf.ByteString defaultValue) {
       return internalGetFiles().getMap().size();
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     @java.lang.Override
     public boolean containsFiles(
@@ -536,14 +857,14 @@ com.google.protobuf.ByteString defaultValue) {
       return getFilesMap();
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     @java.lang.Override
     public java.util.Map<java.lang.String, com.google.protobuf.ByteString> getFilesMap() {
       return internalGetFiles().getMap();
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     @java.lang.Override
     public /* nullable */
@@ -557,7 +878,7 @@ com.google.protobuf.ByteString defaultValue) {
       return map.containsKey(key) ? map.get(key) : defaultValue;
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     @java.lang.Override
     public com.google.protobuf.ByteString getFilesOrThrow(
@@ -571,13 +892,13 @@ com.google.protobuf.ByteString defaultValue) {
       return map.get(key);
     }
     public Builder clearFiles() {
-      bitField0_ = (bitField0_ & ~0x00000001);
+      bitField0_ = (bitField0_ & ~0x00000002);
       internalGetMutableFiles().getMutableMap()
           .clear();
       return this;
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     public Builder removeFiles(
         java.lang.String key) {
@@ -592,11 +913,11 @@ com.google.protobuf.ByteString defaultValue) {
     @java.lang.Deprecated
     public java.util.Map<java.lang.String, com.google.protobuf.ByteString>
         getMutableFiles() {
-      bitField0_ |= 0x00000001;
+      bitField0_ |= 0x00000002;
       return internalGetMutableFiles().getMutableMap();
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     public Builder putFiles(
         java.lang.String key,
@@ -605,17 +926,249 @@ com.google.protobuf.ByteString defaultValue) {
       if (value == null) { throw new NullPointerException("map value"); }
       internalGetMutableFiles().getMutableMap()
           .put(key, value);
-      bitField0_ |= 0x00000001;
+      bitField0_ |= 0x00000002;
       return this;
     }
     /**
-     * <code>map&lt;string, bytes&gt; files = 1;</code>
+     * <code>map&lt;string, bytes&gt; files = 2;</code>
      */
     public Builder putAllFiles(
         java.util.Map<java.lang.String, com.google.protobuf.ByteString> values) {
       internalGetMutableFiles().getMutableMap()
           .putAll(values);
-      bitField0_ |= 0x00000001;
+      bitField0_ |= 0x00000002;
+      return this;
+    }
+
+    private com.google.protobuf.Duration ttl_;
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> ttlBuilder_;
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     * @return Whether the ttl field is set.
+     */
+    public boolean hasTtl() {
+      return ((bitField0_ & 0x00000004) != 0);
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     * @return The ttl.
+     */
+    public com.google.protobuf.Duration getTtl() {
+      if (ttlBuilder_ == null) {
+        return ttl_ == null ? com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+      } else {
+        return ttlBuilder_.getMessage();
+      }
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public Builder setTtl(com.google.protobuf.Duration value) {
+      if (ttlBuilder_ == null) {
+        if (value == null) {
+          throw new NullPointerException();
+        }
+        ttl_ = value;
+      } else {
+        ttlBuilder_.setMessage(value);
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public Builder setTtl(
+        com.google.protobuf.Duration.Builder builderForValue) {
+      if (ttlBuilder_ == null) {
+        ttl_ = builderForValue.build();
+      } else {
+        ttlBuilder_.setMessage(builderForValue.build());
+      }
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public Builder mergeTtl(com.google.protobuf.Duration value) {
+      if (ttlBuilder_ == null) {
+        if (((bitField0_ & 0x00000004) != 0) &&
+          ttl_ != null &&
+          ttl_ != com.google.protobuf.Duration.getDefaultInstance()) {
+          getTtlBuilder().mergeFrom(value);
+        } else {
+          ttl_ = value;
+        }
+      } else {
+        ttlBuilder_.mergeFrom(value);
+      }
+      if (ttl_ != null) {
+        bitField0_ |= 0x00000004;
+        onChanged();
+      }
+      return this;
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public Builder clearTtl() {
+      bitField0_ = (bitField0_ & ~0x00000004);
+      ttl_ = null;
+      if (ttlBuilder_ != null) {
+        ttlBuilder_.dispose();
+        ttlBuilder_ = null;
+      }
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public com.google.protobuf.Duration.Builder getTtlBuilder() {
+      bitField0_ |= 0x00000004;
+      onChanged();
+      return getTtlFieldBuilder().getBuilder();
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    public com.google.protobuf.DurationOrBuilder getTtlOrBuilder() {
+      if (ttlBuilder_ != null) {
+        return ttlBuilder_.getMessageOrBuilder();
+      } else {
+        return ttl_ == null ?
+            com.google.protobuf.Duration.getDefaultInstance() : ttl_;
+      }
+    }
+    /**
+     * <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    private com.google.protobuf.SingleFieldBuilderV3<
+        com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder> 
+        getTtlFieldBuilder() {
+      if (ttlBuilder_ == null) {
+        ttlBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+            com.google.protobuf.Duration, com.google.protobuf.Duration.Builder, com.google.protobuf.DurationOrBuilder>(
+                getTtl(),
+                getParentForChildren(),
+                isClean());
+        ttl_ = null;
+      }
+      return ttlBuilder_;
+    }
+
+    private java.lang.Object owner_ = "";
+    /**
+     * <code>optional string owner = 8;</code>
+     * @return Whether the owner field is set.
+     */
+    public boolean hasOwner() {
+      return ((bitField0_ & 0x00000008) != 0);
+    }
+    /**
+     * <code>optional string owner = 8;</code>
+     * @return The owner.
+     */
+    public java.lang.String getOwner() {
+      java.lang.Object ref = owner_;
+      if (!(ref instanceof java.lang.String)) {
+        com.google.protobuf.ByteString bs =
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        owner_ = s;
+        return s;
+      } else {
+        return (java.lang.String) ref;
+      }
+    }
+    /**
+     * <code>optional string owner = 8;</code>
+     * @return The bytes for owner.
+     */
+    public com.google.protobuf.ByteString
+        getOwnerBytes() {
+      java.lang.Object ref = owner_;
+      if (ref instanceof String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        owner_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+    /**
+     * <code>optional string owner = 8;</code>
+     * @param value The owner to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOwner(
+        java.lang.String value) {
+      if (value == null) { throw new NullPointerException(); }
+      owner_ = value;
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>optional string owner = 8;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearOwner() {
+      owner_ = getDefaultInstance().getOwner();
+      bitField0_ = (bitField0_ & ~0x00000008);
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>optional string owner = 8;</code>
+     * @param value The bytes for owner to set.
+     * @return This builder for chaining.
+     */
+    public Builder setOwnerBytes(
+        com.google.protobuf.ByteString value) {
+      if (value == null) { throw new NullPointerException(); }
+      checkByteStringIsUtf8(value);
+      owner_ = value;
+      bitField0_ |= 0x00000008;
+      onChanged();
+      return this;
+    }
+
+    private boolean published_ ;
+    /**
+     * <code>bool published = 9;</code>
+     * @return The published.
+     */
+    @java.lang.Override
+    public boolean getPublished() {
+      return published_;
+    }
+    /**
+     * <code>bool published = 9;</code>
+     * @param value The published to set.
+     * @return This builder for chaining.
+     */
+    public Builder setPublished(boolean value) {
+
+      published_ = value;
+      bitField0_ |= 0x00000010;
+      onChanged();
+      return this;
+    }
+    /**
+     * <code>bool published = 9;</code>
+     * @return This builder for chaining.
+     */
+    public Builder clearPublished() {
+      bitField0_ = (bitField0_ & ~0x00000010);
+      published_ = false;
+      onChanged();
       return this;
     }
     @java.lang.Override

+ 55 - 5
rpc/sdk/java/com/github/saturn_xiv/palm/plugins/lily/v1/TexToRequestOrBuilder.java

@@ -8,11 +8,23 @@ public interface TexToRequestOrBuilder extends
     com.google.protobuf.MessageOrBuilder {
 
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>string title = 1;</code>
+   * @return The title.
+   */
+  java.lang.String getTitle();
+  /**
+   * <code>string title = 1;</code>
+   * @return The bytes for title.
+   */
+  com.google.protobuf.ByteString
+      getTitleBytes();
+
+  /**
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   int getFilesCount();
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   boolean containsFiles(
       java.lang.String key);
@@ -23,12 +35,12 @@ public interface TexToRequestOrBuilder extends
   java.util.Map<java.lang.String, com.google.protobuf.ByteString>
   getFiles();
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   java.util.Map<java.lang.String, com.google.protobuf.ByteString>
   getFilesMap();
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   /* nullable */
 com.google.protobuf.ByteString getFilesOrDefault(
@@ -36,8 +48,46 @@ com.google.protobuf.ByteString getFilesOrDefault(
       /* nullable */
 com.google.protobuf.ByteString defaultValue);
   /**
-   * <code>map&lt;string, bytes&gt; files = 1;</code>
+   * <code>map&lt;string, bytes&gt; files = 2;</code>
    */
   com.google.protobuf.ByteString getFilesOrThrow(
       java.lang.String key);
+
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   * @return Whether the ttl field is set.
+   */
+  boolean hasTtl();
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   * @return The ttl.
+   */
+  com.google.protobuf.Duration getTtl();
+  /**
+   * <code>optional .google.protobuf.Duration ttl = 7;</code>
+   */
+  com.google.protobuf.DurationOrBuilder getTtlOrBuilder();
+
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return Whether the owner field is set.
+   */
+  boolean hasOwner();
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return The owner.
+   */
+  java.lang.String getOwner();
+  /**
+   * <code>optional string owner = 8;</code>
+   * @return The bytes for owner.
+   */
+  com.google.protobuf.ByteString
+      getOwnerBytes();
+
+  /**
+   * <code>bool published = 9;</code>
+   * @return The published.
+   */
+  boolean getPublished();
 }

BIN
rpc/sdk/php/GPBMetadata/Lily.php


BIN
rpc/sdk/php/GPBMetadata/Morus.php


+ 34 - 0
rpc/sdk/php/Mint/Morus/V1/MarkdownClient.php

@@ -0,0 +1,34 @@
+<?php
+// GENERATED CODE -- DO NOT EDIT!
+
+namespace Mint\Morus\V1;
+
+/**
+ * ----------------------------------------------------------------------------
+ */
+class MarkdownClient extends \Grpc\BaseStub {
+
+    /**
+     * @param string $hostname hostname
+     * @param array $opts channel options
+     * @param \Grpc\Channel $channel (optional) re-use channel object
+     */
+    public function __construct($hostname, $opts, $channel = null) {
+        parent::__construct($hostname, $opts, $channel);
+    }
+
+    /**
+     * @param \Mint\Morus\V1\MarkdownToHtmlRequest $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function ToHtml(\Mint\Morus\V1\MarkdownToHtmlRequest $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/mint.morus.v1.Markdown/ToHtml',
+        $argument,
+        ['\Mint\Morus\V1\MarkdownToHtmlResponse', 'decode'],
+        $metadata, $options);
+    }
+
+}

+ 85 - 0
rpc/sdk/php/Mint/Morus/V1/MarkdownToHtmlRequest.php

@@ -0,0 +1,85 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: morus.proto
+
+namespace Mint\Morus\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>mint.morus.v1.MarkdownToHtmlRequest</code>
+ */
+class MarkdownToHtmlRequest extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     */
+    protected $payload = '';
+    /**
+     * Generated from protobuf field <code>bool sanitize = 2;</code>
+     */
+    protected $sanitize = false;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $payload
+     *     @type bool $sanitize
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Morus::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     * @return string
+     */
+    public function getPayload()
+    {
+        return $this->payload;
+    }
+
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setPayload($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->payload = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>bool sanitize = 2;</code>
+     * @return bool
+     */
+    public function getSanitize()
+    {
+        return $this->sanitize;
+    }
+
+    /**
+     * Generated from protobuf field <code>bool sanitize = 2;</code>
+     * @param bool $var
+     * @return $this
+     */
+    public function setSanitize($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->sanitize = $var;
+
+        return $this;
+    }
+
+}
+

+ 58 - 0
rpc/sdk/php/Mint/Morus/V1/MarkdownToHtmlResponse.php

@@ -0,0 +1,58 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: morus.proto
+
+namespace Mint\Morus\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>mint.morus.v1.MarkdownToHtmlResponse</code>
+ */
+class MarkdownToHtmlResponse extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     */
+    protected $payload = '';
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $payload
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Morus::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     * @return string
+     */
+    public function getPayload()
+    {
+        return $this->payload;
+    }
+
+    /**
+     * Generated from protobuf field <code>string payload = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setPayload($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->payload = $var;
+
+        return $this;
+    }
+
+}
+

+ 31 - 0
rpc/sdk/php/Palm/Lily/V1/EpubBuildRequest.php

@@ -0,0 +1,31 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.EpubBuildRequest</code>
+ */
+class EpubBuildRequest extends \Google\Protobuf\Internal\Message
+{
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+}
+

+ 35 - 0
rpc/sdk/php/Palm/Lily/V1/EpubClient.php

@@ -0,0 +1,35 @@
+<?php
+// GENERATED CODE -- DO NOT EDIT!
+
+namespace Palm\Lily\V1;
+
+/**
+ * ----------------------------------------------------------------------------
+ *
+ */
+class EpubClient extends \Grpc\BaseStub {
+
+    /**
+     * @param string $hostname hostname
+     * @param array $opts channel options
+     * @param \Grpc\Channel $channel (optional) re-use channel object
+     */
+    public function __construct($hostname, $opts, $channel = null) {
+        parent::__construct($hostname, $opts, $channel);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\EpubBuildRequest $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function Build(\Palm\Lily\V1\EpubBuildRequest $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.Epub/Build',
+        $argument,
+        ['\Palm\Lily\V1\S3File', 'decode'],
+        $metadata, $options);
+    }
+
+}

+ 49 - 0
rpc/sdk/php/Palm/Lily/V1/ExcelClient.php

@@ -0,0 +1,49 @@
+<?php
+// GENERATED CODE -- DO NOT EDIT!
+
+namespace Palm\Lily\V1;
+
+/**
+ * ----------------------------------------------------------------------------
+ *
+ */
+class ExcelClient extends \Grpc\BaseStub {
+
+    /**
+     * @param string $hostname hostname
+     * @param array $opts channel options
+     * @param \Grpc\Channel $channel (optional) re-use channel object
+     */
+    public function __construct($hostname, $opts, $channel = null) {
+        parent::__construct($hostname, $opts, $channel);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\S3File $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function Parse(\Palm\Lily\V1\S3File $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.Excel/Parse',
+        $argument,
+        ['\Palm\Lily\V1\ExcelModel', 'decode'],
+        $metadata, $options);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\ExcelModel $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function Generate(\Palm\Lily\V1\ExcelModel $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.Excel/Generate',
+        $argument,
+        ['\Palm\Lily\V1\S3File', 'decode'],
+        $metadata, $options);
+    }
+
+}

+ 58 - 0
rpc/sdk/php/Palm/Lily/V1/ExcelModel.php

@@ -0,0 +1,58 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.ExcelModel</code>
+ */
+class ExcelModel extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet sheets = 1;</code>
+     */
+    private $sheets;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type array<\Palm\Lily\V1\ExcelModel\Sheet>|\Google\Protobuf\Internal\RepeatedField $sheets
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet sheets = 1;</code>
+     * @return \Google\Protobuf\Internal\RepeatedField
+     */
+    public function getSheets()
+    {
+        return $this->sheets;
+    }
+
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet sheets = 1;</code>
+     * @param array<\Palm\Lily\V1\ExcelModel\Sheet>|\Google\Protobuf\Internal\RepeatedField $var
+     * @return $this
+     */
+    public function setSheets($var)
+    {
+        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Palm\Lily\V1\ExcelModel\Sheet::class);
+        $this->sheets = $arr;
+
+        return $this;
+    }
+
+}
+

+ 88 - 0
rpc/sdk/php/Palm/Lily/V1/ExcelModel/Sheet.php

@@ -0,0 +1,88 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1\ExcelModel;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.ExcelModel.Sheet</code>
+ */
+class Sheet extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string name = 1;</code>
+     */
+    protected $name = '';
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet.Cell cells = 2;</code>
+     */
+    private $cells;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $name
+     *     @type array<\Palm\Lily\V1\ExcelModel\Sheet\Cell>|\Google\Protobuf\Internal\RepeatedField $cells
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 1;</code>
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet.Cell cells = 2;</code>
+     * @return \Google\Protobuf\Internal\RepeatedField
+     */
+    public function getCells()
+    {
+        return $this->cells;
+    }
+
+    /**
+     * Generated from protobuf field <code>repeated .palm.lily.v1.ExcelModel.Sheet.Cell cells = 2;</code>
+     * @param array<\Palm\Lily\V1\ExcelModel\Sheet\Cell>|\Google\Protobuf\Internal\RepeatedField $var
+     * @return $this
+     */
+    public function setCells($var)
+    {
+        $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Palm\Lily\V1\ExcelModel\Sheet\Cell::class);
+        $this->cells = $arr;
+
+        return $this;
+    }
+
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(Sheet::class, \Palm\Lily\V1\ExcelModel_Sheet::class);
+

+ 115 - 0
rpc/sdk/php/Palm/Lily/V1/ExcelModel/Sheet/Cell.php

@@ -0,0 +1,115 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1\ExcelModel\Sheet;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.ExcelModel.Sheet.Cell</code>
+ */
+class Cell extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>uint32 row = 1;</code>
+     */
+    protected $row = 0;
+    /**
+     * Generated from protobuf field <code>uint32 col = 2;</code>
+     */
+    protected $col = 0;
+    /**
+     * Generated from protobuf field <code>string val = 3;</code>
+     */
+    protected $val = '';
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type int $row
+     *     @type int $col
+     *     @type string $val
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>uint32 row = 1;</code>
+     * @return int
+     */
+    public function getRow()
+    {
+        return $this->row;
+    }
+
+    /**
+     * Generated from protobuf field <code>uint32 row = 1;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setRow($var)
+    {
+        GPBUtil::checkUint32($var);
+        $this->row = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>uint32 col = 2;</code>
+     * @return int
+     */
+    public function getCol()
+    {
+        return $this->col;
+    }
+
+    /**
+     * Generated from protobuf field <code>uint32 col = 2;</code>
+     * @param int $var
+     * @return $this
+     */
+    public function setCol($var)
+    {
+        GPBUtil::checkUint32($var);
+        $this->col = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string val = 3;</code>
+     * @return string
+     */
+    public function getVal()
+    {
+        return $this->val;
+    }
+
+    /**
+     * Generated from protobuf field <code>string val = 3;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setVal($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->val = $var;
+
+        return $this;
+    }
+
+}
+
+// Adding a class alias for backwards compatibility with the previous class name.
+class_alias(Cell::class, \Palm\Lily\V1\ExcelModel_Sheet_Cell::class);
+

+ 33 - 0
rpc/sdk/php/Palm/Lily/V1/S3Client.php

@@ -0,0 +1,33 @@
+<?php
+// GENERATED CODE -- DO NOT EDIT!
+
+namespace Palm\Lily\V1;
+
+/**
+ */
+class S3Client extends \Grpc\BaseStub {
+
+    /**
+     * @param string $hostname hostname
+     * @param array $opts channel options
+     * @param \Grpc\Channel $channel (optional) re-use channel object
+     */
+    public function __construct($hostname, $opts, $channel = null) {
+        parent::__construct($hostname, $opts, $channel);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\S3GetFileRequest $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function GetFile(\Palm\Lily\V1\S3GetFileRequest $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.S3/GetFile',
+        $argument,
+        ['\Palm\Lily\V1\S3GetFileResponse', 'decode'],
+        $metadata, $options);
+    }
+
+}

+ 112 - 0
rpc/sdk/php/Palm/Lily/V1/S3File.php

@@ -0,0 +1,112 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.S3File</code>
+ */
+class S3File extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     */
+    protected $bucket = '';
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     */
+    protected $name = '';
+    /**
+     * Generated from protobuf field <code>string content_type = 9;</code>
+     */
+    protected $content_type = '';
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $bucket
+     *     @type string $name
+     *     @type string $content_type
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     * @return string
+     */
+    public function getBucket()
+    {
+        return $this->bucket;
+    }
+
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setBucket($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->bucket = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string content_type = 9;</code>
+     * @return string
+     */
+    public function getContentType()
+    {
+        return $this->content_type;
+    }
+
+    /**
+     * Generated from protobuf field <code>string content_type = 9;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setContentType($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->content_type = $var;
+
+        return $this;
+    }
+
+}
+

+ 122 - 0
rpc/sdk/php/Palm/Lily/V1/S3GetFileRequest.php

@@ -0,0 +1,122 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.S3GetFileRequest</code>
+ */
+class S3GetFileRequest extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     */
+    protected $bucket = '';
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     */
+    protected $name = '';
+    /**
+     * Generated from protobuf field <code>.google.protobuf.Duration ttl = 9;</code>
+     */
+    protected $ttl = null;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $bucket
+     *     @type string $name
+     *     @type \Google\Protobuf\Duration $ttl
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     * @return string
+     */
+    public function getBucket()
+    {
+        return $this->bucket;
+    }
+
+    /**
+     * Generated from protobuf field <code>string bucket = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setBucket($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->bucket = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Generated from protobuf field <code>string name = 2;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setName($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->name = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>.google.protobuf.Duration ttl = 9;</code>
+     * @return \Google\Protobuf\Duration|null
+     */
+    public function getTtl()
+    {
+        return $this->ttl;
+    }
+
+    public function hasTtl()
+    {
+        return isset($this->ttl);
+    }
+
+    public function clearTtl()
+    {
+        unset($this->ttl);
+    }
+
+    /**
+     * Generated from protobuf field <code>.google.protobuf.Duration ttl = 9;</code>
+     * @param \Google\Protobuf\Duration $var
+     * @return $this
+     */
+    public function setTtl($var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class);
+        $this->ttl = $var;
+
+        return $this;
+    }
+
+}
+

+ 58 - 0
rpc/sdk/php/Palm/Lily/V1/S3GetFileResponse.php

@@ -0,0 +1,58 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.S3GetFileResponse</code>
+ */
+class S3GetFileResponse extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string url = 1;</code>
+     */
+    protected $url = '';
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $url
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string url = 1;</code>
+     * @return string
+     */
+    public function getUrl()
+    {
+        return $this->url;
+    }
+
+    /**
+     * Generated from protobuf field <code>string url = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setUrl($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->url = $var;
+
+        return $this;
+    }
+
+}
+

+ 47 - 0
rpc/sdk/php/Palm/Lily/V1/TexClient.php

@@ -0,0 +1,47 @@
+<?php
+// GENERATED CODE -- DO NOT EDIT!
+
+namespace Palm\Lily\V1;
+
+/**
+ */
+class TexClient extends \Grpc\BaseStub {
+
+    /**
+     * @param string $hostname hostname
+     * @param array $opts channel options
+     * @param \Grpc\Channel $channel (optional) re-use channel object
+     */
+    public function __construct($hostname, $opts, $channel = null) {
+        parent::__construct($hostname, $opts, $channel);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\TexToRequest $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function ToPdf(\Palm\Lily\V1\TexToRequest $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.Tex/ToPdf',
+        $argument,
+        ['\Palm\Lily\V1\S3File', 'decode'],
+        $metadata, $options);
+    }
+
+    /**
+     * @param \Palm\Lily\V1\TexToRequest $argument input argument
+     * @param array $metadata metadata
+     * @param array $options call options
+     * @return \Grpc\UnaryCall
+     */
+    public function ToWord(\Palm\Lily\V1\TexToRequest $argument,
+      $metadata = [], $options = []) {
+        return $this->_simpleRequest('/palm.lily.v1.Tex/ToWord',
+        $argument,
+        ['\Palm\Lily\V1\S3File', 'decode'],
+        $metadata, $options);
+    }
+
+}

+ 186 - 0
rpc/sdk/php/Palm/Lily/V1/TexToRequest.php

@@ -0,0 +1,186 @@
+<?php
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: lily.proto
+
+namespace Palm\Lily\V1;
+
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+/**
+ * Generated from protobuf message <code>palm.lily.v1.TexToRequest</code>
+ */
+class TexToRequest extends \Google\Protobuf\Internal\Message
+{
+    /**
+     * Generated from protobuf field <code>string title = 1;</code>
+     */
+    protected $title = '';
+    /**
+     * Generated from protobuf field <code>map<string, bytes> files = 2;</code>
+     */
+    private $files;
+    /**
+     * Generated from protobuf field <code>optional .google.protobuf.Duration ttl = 7;</code>
+     */
+    protected $ttl = null;
+    /**
+     * Generated from protobuf field <code>optional string owner = 8;</code>
+     */
+    protected $owner = null;
+    /**
+     * Generated from protobuf field <code>bool published = 9;</code>
+     */
+    protected $published = false;
+
+    /**
+     * Constructor.
+     *
+     * @param array $data {
+     *     Optional. Data for populating the Message object.
+     *
+     *     @type string $title
+     *     @type array|\Google\Protobuf\Internal\MapField $files
+     *     @type \Google\Protobuf\Duration $ttl
+     *     @type string $owner
+     *     @type bool $published
+     * }
+     */
+    public function __construct($data = NULL) {
+        \GPBMetadata\Lily::initOnce();
+        parent::__construct($data);
+    }
+
+    /**
+     * Generated from protobuf field <code>string title = 1;</code>
+     * @return string
+     */
+    public function getTitle()
+    {
+        return $this->title;
+    }
+
+    /**
+     * Generated from protobuf field <code>string title = 1;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setTitle($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->title = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>map<string, bytes> files = 2;</code>
+     * @return \Google\Protobuf\Internal\MapField
+     */
+    public function getFiles()
+    {
+        return $this->files;
+    }
+
+    /**
+     * Generated from protobuf field <code>map<string, bytes> files = 2;</code>
+     * @param array|\Google\Protobuf\Internal\MapField $var
+     * @return $this
+     */
+    public function setFiles($var)
+    {
+        $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::BYTES);
+        $this->files = $arr;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>optional .google.protobuf.Duration ttl = 7;</code>
+     * @return \Google\Protobuf\Duration|null
+     */
+    public function getTtl()
+    {
+        return $this->ttl;
+    }
+
+    public function hasTtl()
+    {
+        return isset($this->ttl);
+    }
+
+    public function clearTtl()
+    {
+        unset($this->ttl);
+    }
+
+    /**
+     * Generated from protobuf field <code>optional .google.protobuf.Duration ttl = 7;</code>
+     * @param \Google\Protobuf\Duration $var
+     * @return $this
+     */
+    public function setTtl($var)
+    {
+        GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class);
+        $this->ttl = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>optional string owner = 8;</code>
+     * @return string
+     */
+    public function getOwner()
+    {
+        return isset($this->owner) ? $this->owner : '';
+    }
+
+    public function hasOwner()
+    {
+        return isset($this->owner);
+    }
+
+    public function clearOwner()
+    {
+        unset($this->owner);
+    }
+
+    /**
+     * Generated from protobuf field <code>optional string owner = 8;</code>
+     * @param string $var
+     * @return $this
+     */
+    public function setOwner($var)
+    {
+        GPBUtil::checkString($var, True);
+        $this->owner = $var;
+
+        return $this;
+    }
+
+    /**
+     * Generated from protobuf field <code>bool published = 9;</code>
+     * @return bool
+     */
+    public function getPublished()
+    {
+        return $this->published;
+    }
+
+    /**
+     * Generated from protobuf field <code>bool published = 9;</code>
+     * @param bool $var
+     * @return $this
+     */
+    public function setPublished($var)
+    {
+        GPBUtil::checkBool($var);
+        $this->published = $var;
+
+        return $this;
+    }
+
+}
+

+ 28 - 22
rpc/sdk/python/lily_pb2.py

@@ -11,37 +11,43 @@ from google.protobuf.internal import builder as _builder
 _sym_db = _symbol_database.Default()
 
 
+from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nlily.proto\x12\x0cpalm.lily.v1\"C\n\x04\x46ile\x12\x19\n\x0c\x63ontent_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x42\x0f\n\r_content_type\"\xb6\x01\n\nExcelModel\x12.\n\x06sheets\x18\x01 \x03(\x0b\x32\x1e.palm.lily.v1.ExcelModel.Sheet\x1ax\n\x05Sheet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32#.palm.lily.v1.ExcelModel.Sheet.Cell\x1a-\n\x04\x43\x65ll\x12\x0b\n\x03row\x18\x01 \x01(\r\x12\x0b\n\x03\x63ol\x18\x02 \x01(\r\x12\x0b\n\x03val\x18\x03 \x01(\t\"r\n\x0cTexToRequest\x12\x34\n\x05\x66iles\x18\x01 \x03(\x0b\x32%.palm.lily.v1.TexToRequest.FilesEntry\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\x12\n\x10\x45pubBuildRequest2|\n\x05\x45xcel\x12\x37\n\x05Parse\x12\x12.palm.lily.v1.File\x1a\x18.palm.lily.v1.ExcelModel\"\x00\x12:\n\x08Generate\x12\x18.palm.lily.v1.ExcelModel\x1a\x12.palm.lily.v1.File\"\x00\x32|\n\x03Tex\x12\x39\n\x05ToPdf\x12\x1a.palm.lily.v1.TexToRequest\x1a\x12.palm.lily.v1.File\"\x00\x12:\n\x06ToWord\x12\x1a.palm.lily.v1.TexToRequest\x1a\x12.palm.lily.v1.File\"\x00\x32\x45\n\x04\x45pub\x12=\n\x05\x42uild\x12\x1e.palm.lily.v1.EpubBuildRequest\x1a\x12.palm.lily.v1.File\"\x00\x42.\n*com.github.saturn_xiv.palm.plugins.lily.v1P\x01\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\nlily.proto\x12\x0cpalm.lily.v1\x1a\x1egoogle/protobuf/duration.proto\"\xb6\x01\n\nExcelModel\x12.\n\x06sheets\x18\x01 \x03(\x0b\x32\x1e.palm.lily.v1.ExcelModel.Sheet\x1ax\n\x05Sheet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32#.palm.lily.v1.ExcelModel.Sheet.Cell\x1a-\n\x04\x43\x65ll\x12\x0b\n\x03row\x18\x01 \x01(\r\x12\x0b\n\x03\x63ol\x18\x02 \x01(\r\x12\x0b\n\x03val\x18\x03 \x01(\t\"<\n\x06S3File\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\t \x01(\t\"X\n\x10S3GetFileRequest\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12&\n\x03ttl\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\" \n\x11S3GetFileResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\"\xe7\x01\n\x0cTexToRequest\x12\r\n\x05title\x18\x01 \x01(\t\x12\x34\n\x05\x66iles\x18\x02 \x03(\x0b\x32%.palm.lily.v1.TexToRequest.FilesEntry\x12+\n\x03ttl\x18\x07 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x12\n\x05owner\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\tpublished\x18\t \x01(\x08\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x06\n\x04_ttlB\x08\n\x06_owner\"\x12\n\x10\x45pubBuildRequest2\x80\x01\n\x05\x45xcel\x12\x39\n\x05Parse\x12\x14.palm.lily.v1.S3File\x1a\x18.palm.lily.v1.ExcelModel\"\x00\x12<\n\x08Generate\x12\x18.palm.lily.v1.ExcelModel\x1a\x14.palm.lily.v1.S3File\"\x00\x32R\n\x02S3\x12L\n\x07GetFile\x12\x1e.palm.lily.v1.S3GetFileRequest\x1a\x1f.palm.lily.v1.S3GetFileResponse\"\x00\x32\x80\x01\n\x03Tex\x12;\n\x05ToPdf\x12\x1a.palm.lily.v1.TexToRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x12<\n\x06ToWord\x12\x1a.palm.lily.v1.TexToRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x32G\n\x04\x45pub\x12?\n\x05\x42uild\x12\x1e.palm.lily.v1.EpubBuildRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x42.\n*com.github.saturn_xiv.palm.plugins.lily.v1P\x01\x62\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
 _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'lily_pb2', _globals)
 if _descriptor._USE_C_DESCRIPTORS == False:
-
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'\n*com.github.saturn_xiv.palm.plugins.lily.v1P\001'
   _TEXTOREQUEST_FILESENTRY._options = None
   _TEXTOREQUEST_FILESENTRY._serialized_options = b'8\001'
-  _globals['_FILE']._serialized_start=28
-  _globals['_FILE']._serialized_end=95
-  _globals['_EXCELMODEL']._serialized_start=98
-  _globals['_EXCELMODEL']._serialized_end=280
-  _globals['_EXCELMODEL_SHEET']._serialized_start=160
-  _globals['_EXCELMODEL_SHEET']._serialized_end=280
-  _globals['_EXCELMODEL_SHEET_CELL']._serialized_start=235
-  _globals['_EXCELMODEL_SHEET_CELL']._serialized_end=280
-  _globals['_TEXTOREQUEST']._serialized_start=282
-  _globals['_TEXTOREQUEST']._serialized_end=396
-  _globals['_TEXTOREQUEST_FILESENTRY']._serialized_start=352
-  _globals['_TEXTOREQUEST_FILESENTRY']._serialized_end=396
-  _globals['_EPUBBUILDREQUEST']._serialized_start=398
-  _globals['_EPUBBUILDREQUEST']._serialized_end=416
-  _globals['_EXCEL']._serialized_start=418
-  _globals['_EXCEL']._serialized_end=542
-  _globals['_TEX']._serialized_start=544
-  _globals['_TEX']._serialized_end=668
-  _globals['_EPUB']._serialized_start=670
-  _globals['_EPUB']._serialized_end=739
+  _globals['_EXCELMODEL']._serialized_start=61
+  _globals['_EXCELMODEL']._serialized_end=243
+  _globals['_EXCELMODEL_SHEET']._serialized_start=123
+  _globals['_EXCELMODEL_SHEET']._serialized_end=243
+  _globals['_EXCELMODEL_SHEET_CELL']._serialized_start=198
+  _globals['_EXCELMODEL_SHEET_CELL']._serialized_end=243
+  _globals['_S3FILE']._serialized_start=245
+  _globals['_S3FILE']._serialized_end=305
+  _globals['_S3GETFILEREQUEST']._serialized_start=307
+  _globals['_S3GETFILEREQUEST']._serialized_end=395
+  _globals['_S3GETFILERESPONSE']._serialized_start=397
+  _globals['_S3GETFILERESPONSE']._serialized_end=429
+  _globals['_TEXTOREQUEST']._serialized_start=432
+  _globals['_TEXTOREQUEST']._serialized_end=663
+  _globals['_TEXTOREQUEST_FILESENTRY']._serialized_start=601
+  _globals['_TEXTOREQUEST_FILESENTRY']._serialized_end=645
+  _globals['_EPUBBUILDREQUEST']._serialized_start=665
+  _globals['_EPUBBUILDREQUEST']._serialized_end=683
+  _globals['_EXCEL']._serialized_start=686
+  _globals['_EXCEL']._serialized_end=814
+  _globals['_S3']._serialized_start=816
+  _globals['_S3']._serialized_end=898
+  _globals['_TEX']._serialized_start=901
+  _globals['_TEX']._serialized_end=1029
+  _globals['_EPUB']._serialized_start=1031
+  _globals['_EPUB']._serialized_end=1102
 # @@protoc_insertion_point(module_scope)

+ 79 - 24
rpc/sdk/python/lily_pb2_grpc.py

@@ -18,13 +18,13 @@ class ExcelStub(object):
         """
         self.Parse = channel.unary_unary(
                 '/palm.lily.v1.Excel/Parse',
-                request_serializer=lily__pb2.File.SerializeToString,
+                request_serializer=lily__pb2.S3File.SerializeToString,
                 response_deserializer=lily__pb2.ExcelModel.FromString,
                 )
         self.Generate = channel.unary_unary(
                 '/palm.lily.v1.Excel/Generate',
                 request_serializer=lily__pb2.ExcelModel.SerializeToString,
-                response_deserializer=lily__pb2.File.FromString,
+                response_deserializer=lily__pb2.S3File.FromString,
                 )
 
 
@@ -50,13 +50,13 @@ def add_ExcelServicer_to_server(servicer, server):
     rpc_method_handlers = {
             'Parse': grpc.unary_unary_rpc_method_handler(
                     servicer.Parse,
-                    request_deserializer=lily__pb2.File.FromString,
+                    request_deserializer=lily__pb2.S3File.FromString,
                     response_serializer=lily__pb2.ExcelModel.SerializeToString,
             ),
             'Generate': grpc.unary_unary_rpc_method_handler(
                     servicer.Generate,
                     request_deserializer=lily__pb2.ExcelModel.FromString,
-                    response_serializer=lily__pb2.File.SerializeToString,
+                    response_serializer=lily__pb2.S3File.SerializeToString,
             ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
@@ -82,7 +82,7 @@ class Excel(object):
             timeout=None,
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.Excel/Parse',
-            lily__pb2.File.SerializeToString,
+            lily__pb2.S3File.SerializeToString,
             lily__pb2.ExcelModel.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
@@ -100,15 +100,74 @@ class Excel(object):
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.Excel/Generate',
             lily__pb2.ExcelModel.SerializeToString,
-            lily__pb2.File.FromString,
+            lily__pb2.S3File.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
 
-class TexStub(object):
-    """----------------------------------------------------------------------------
+class S3Stub(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetFile = channel.unary_unary(
+                '/palm.lily.v1.S3/GetFile',
+                request_serializer=lily__pb2.S3GetFileRequest.SerializeToString,
+                response_deserializer=lily__pb2.S3GetFileResponse.FromString,
+                )
+
+
+class S3Servicer(object):
+    """Missing associated documentation comment in .proto file."""
+
+    def GetFile(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+
+def add_S3Servicer_to_server(servicer, server):
+    rpc_method_handlers = {
+            'GetFile': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetFile,
+                    request_deserializer=lily__pb2.S3GetFileRequest.FromString,
+                    response_serializer=lily__pb2.S3GetFileResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'palm.lily.v1.S3', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
 
-    """
+
+ # This class is part of an EXPERIMENTAL API.
+class S3(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def GetFile(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.S3/GetFile',
+            lily__pb2.S3GetFileRequest.SerializeToString,
+            lily__pb2.S3GetFileResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+
+class TexStub(object):
+    """Missing associated documentation comment in .proto file."""
 
     def __init__(self, channel):
         """Constructor.
@@ -119,19 +178,17 @@ class TexStub(object):
         self.ToPdf = channel.unary_unary(
                 '/palm.lily.v1.Tex/ToPdf',
                 request_serializer=lily__pb2.TexToRequest.SerializeToString,
-                response_deserializer=lily__pb2.File.FromString,
+                response_deserializer=lily__pb2.S3File.FromString,
                 )
         self.ToWord = channel.unary_unary(
                 '/palm.lily.v1.Tex/ToWord',
                 request_serializer=lily__pb2.TexToRequest.SerializeToString,
-                response_deserializer=lily__pb2.File.FromString,
+                response_deserializer=lily__pb2.S3File.FromString,
                 )
 
 
 class TexServicer(object):
-    """----------------------------------------------------------------------------
-
-    """
+    """Missing associated documentation comment in .proto file."""
 
     def ToPdf(self, request, context):
         """Missing associated documentation comment in .proto file."""
@@ -151,12 +208,12 @@ def add_TexServicer_to_server(servicer, server):
             'ToPdf': grpc.unary_unary_rpc_method_handler(
                     servicer.ToPdf,
                     request_deserializer=lily__pb2.TexToRequest.FromString,
-                    response_serializer=lily__pb2.File.SerializeToString,
+                    response_serializer=lily__pb2.S3File.SerializeToString,
             ),
             'ToWord': grpc.unary_unary_rpc_method_handler(
                     servicer.ToWord,
                     request_deserializer=lily__pb2.TexToRequest.FromString,
-                    response_serializer=lily__pb2.File.SerializeToString,
+                    response_serializer=lily__pb2.S3File.SerializeToString,
             ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
@@ -166,9 +223,7 @@ def add_TexServicer_to_server(servicer, server):
 
  # This class is part of an EXPERIMENTAL API.
 class Tex(object):
-    """----------------------------------------------------------------------------
-
-    """
+    """Missing associated documentation comment in .proto file."""
 
     @staticmethod
     def ToPdf(request,
@@ -183,7 +238,7 @@ class Tex(object):
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.Tex/ToPdf',
             lily__pb2.TexToRequest.SerializeToString,
-            lily__pb2.File.FromString,
+            lily__pb2.S3File.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -200,7 +255,7 @@ class Tex(object):
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.Tex/ToWord',
             lily__pb2.TexToRequest.SerializeToString,
-            lily__pb2.File.FromString,
+            lily__pb2.S3File.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
 
@@ -219,7 +274,7 @@ class EpubStub(object):
         self.Build = channel.unary_unary(
                 '/palm.lily.v1.Epub/Build',
                 request_serializer=lily__pb2.EpubBuildRequest.SerializeToString,
-                response_deserializer=lily__pb2.File.FromString,
+                response_deserializer=lily__pb2.S3File.FromString,
                 )
 
 
@@ -240,7 +295,7 @@ def add_EpubServicer_to_server(servicer, server):
             'Build': grpc.unary_unary_rpc_method_handler(
                     servicer.Build,
                     request_deserializer=lily__pb2.EpubBuildRequest.FromString,
-                    response_serializer=lily__pb2.File.SerializeToString,
+                    response_serializer=lily__pb2.S3File.SerializeToString,
             ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
@@ -267,6 +322,6 @@ class Epub(object):
             metadata=None):
         return grpc.experimental.unary_unary(request, target, '/palm.lily.v1.Epub/Build',
             lily__pb2.EpubBuildRequest.SerializeToString,
-            lily__pb2.File.FromString,
+            lily__pb2.S3File.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

+ 0 - 1
rpc/sdk/python/morus_pb2.py

@@ -19,7 +19,6 @@ _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
 _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'morus_pb2', _globals)
 if _descriptor._USE_C_DESCRIPTORS == False:
-
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'\n.com.github.iapt_platform.mint.plugins.morus.v1P\001'
   _globals['_MARKDOWNTOHTMLREQUEST']._serialized_start=30

+ 7 - 2
rpc/sdk/ruby/lily_pb.rb

@@ -4,8 +4,10 @@
 
 require 'google/protobuf'
 
+require 'google/protobuf/duration_pb'
 
-descriptor_data = "\n\nlily.proto\x12\x0cpalm.lily.v1\"C\n\x04\x46ile\x12\x19\n\x0c\x63ontent_type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x42\x0f\n\r_content_type\"\xb6\x01\n\nExcelModel\x12.\n\x06sheets\x18\x01 \x03(\x0b\x32\x1e.palm.lily.v1.ExcelModel.Sheet\x1ax\n\x05Sheet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32#.palm.lily.v1.ExcelModel.Sheet.Cell\x1a-\n\x04\x43\x65ll\x12\x0b\n\x03row\x18\x01 \x01(\r\x12\x0b\n\x03\x63ol\x18\x02 \x01(\r\x12\x0b\n\x03val\x18\x03 \x01(\t\"r\n\x0cTexToRequest\x12\x34\n\x05\x66iles\x18\x01 \x03(\x0b\x32%.palm.lily.v1.TexToRequest.FilesEntry\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\"\x12\n\x10\x45pubBuildRequest2|\n\x05\x45xcel\x12\x37\n\x05Parse\x12\x12.palm.lily.v1.File\x1a\x18.palm.lily.v1.ExcelModel\"\x00\x12:\n\x08Generate\x12\x18.palm.lily.v1.ExcelModel\x1a\x12.palm.lily.v1.File\"\x00\x32|\n\x03Tex\x12\x39\n\x05ToPdf\x12\x1a.palm.lily.v1.TexToRequest\x1a\x12.palm.lily.v1.File\"\x00\x12:\n\x06ToWord\x12\x1a.palm.lily.v1.TexToRequest\x1a\x12.palm.lily.v1.File\"\x00\x32\x45\n\x04\x45pub\x12=\n\x05\x42uild\x12\x1e.palm.lily.v1.EpubBuildRequest\x1a\x12.palm.lily.v1.File\"\x00\x42.\n*com.github.saturn_xiv.palm.plugins.lily.v1P\x01\x62\x06proto3"
+
+descriptor_data = "\n\nlily.proto\x12\x0cpalm.lily.v1\x1a\x1egoogle/protobuf/duration.proto\"\xb6\x01\n\nExcelModel\x12.\n\x06sheets\x18\x01 \x03(\x0b\x32\x1e.palm.lily.v1.ExcelModel.Sheet\x1ax\n\x05Sheet\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x32\n\x05\x63\x65lls\x18\x02 \x03(\x0b\x32#.palm.lily.v1.ExcelModel.Sheet.Cell\x1a-\n\x04\x43\x65ll\x12\x0b\n\x03row\x18\x01 \x01(\r\x12\x0b\n\x03\x63ol\x18\x02 \x01(\r\x12\x0b\n\x03val\x18\x03 \x01(\t\"<\n\x06S3File\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\t \x01(\t\"X\n\x10S3GetFileRequest\x12\x0e\n\x06\x62ucket\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12&\n\x03ttl\x18\t \x01(\x0b\x32\x19.google.protobuf.Duration\" \n\x11S3GetFileResponse\x12\x0b\n\x03url\x18\x01 \x01(\t\"\xe7\x01\n\x0cTexToRequest\x12\r\n\x05title\x18\x01 \x01(\t\x12\x34\n\x05\x66iles\x18\x02 \x03(\x0b\x32%.palm.lily.v1.TexToRequest.FilesEntry\x12+\n\x03ttl\x18\x07 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x12\n\x05owner\x18\x08 \x01(\tH\x01\x88\x01\x01\x12\x11\n\tpublished\x18\t \x01(\x08\x1a,\n\nFilesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c:\x02\x38\x01\x42\x06\n\x04_ttlB\x08\n\x06_owner\"\x12\n\x10\x45pubBuildRequest2\x80\x01\n\x05\x45xcel\x12\x39\n\x05Parse\x12\x14.palm.lily.v1.S3File\x1a\x18.palm.lily.v1.ExcelModel\"\x00\x12<\n\x08Generate\x12\x18.palm.lily.v1.ExcelModel\x1a\x14.palm.lily.v1.S3File\"\x00\x32R\n\x02S3\x12L\n\x07GetFile\x12\x1e.palm.lily.v1.S3GetFileRequest\x1a\x1f.palm.lily.v1.S3GetFileResponse\"\x00\x32\x80\x01\n\x03Tex\x12;\n\x05ToPdf\x12\x1a.palm.lily.v1.TexToRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x12<\n\x06ToWord\x12\x1a.palm.lily.v1.TexToRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x32G\n\x04\x45pub\x12?\n\x05\x42uild\x12\x1e.palm.lily.v1.EpubBuildRequest\x1a\x14.palm.lily.v1.S3File\"\x00\x42.\n*com.github.saturn_xiv.palm.plugins.lily.v1P\x01\x62\x06proto3"
 
 pool = Google::Protobuf::DescriptorPool.generated_pool
 
@@ -20,6 +22,7 @@ rescue TypeError => e
   file = pool.add_serialized_file(serialized)
   warn "Warning: Protobuf detected an import path issue while loading generated file #{__FILE__}"
   imports = [
+    ["google.protobuf.Duration", "google/protobuf/duration.proto"],
   ]
   imports.each do |type_name, expected_filename|
     import_file = pool.lookup(type_name).file_descriptor
@@ -34,10 +37,12 @@ end
 module Palm
   module Lily
     module V1
-      File = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.File").msgclass
       ExcelModel = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.ExcelModel").msgclass
       ExcelModel::Sheet = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.ExcelModel.Sheet").msgclass
       ExcelModel::Sheet::Cell = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.ExcelModel.Sheet.Cell").msgclass
+      S3File = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.S3File").msgclass
+      S3GetFileRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.S3GetFileRequest").msgclass
+      S3GetFileResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.S3GetFileResponse").msgclass
       TexToRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.TexToRequest").msgclass
       EpubBuildRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("palm.lily.v1.EpubBuildRequest").msgclass
     end

+ 19 - 7
rpc/sdk/ruby/lily_services_pb.rb

@@ -18,15 +18,27 @@ module Palm
           self.unmarshal_class_method = :decode
           self.service_name = 'palm.lily.v1.Excel'
 
-          rpc :Parse, ::Palm::Lily::V1::File, ::Palm::Lily::V1::ExcelModel
-          rpc :Generate, ::Palm::Lily::V1::ExcelModel, ::Palm::Lily::V1::File
+          rpc :Parse, ::Palm::Lily::V1::S3File, ::Palm::Lily::V1::ExcelModel
+          rpc :Generate, ::Palm::Lily::V1::ExcelModel, ::Palm::Lily::V1::S3File
+        end
+
+        Stub = Service.rpc_stub_class
+      end
+      module S3
+        class Service
+
+          include ::GRPC::GenericService
+
+          self.marshal_class_method = :encode
+          self.unmarshal_class_method = :decode
+          self.service_name = 'palm.lily.v1.S3'
+
+          rpc :GetFile, ::Palm::Lily::V1::S3GetFileRequest, ::Palm::Lily::V1::S3GetFileResponse
         end
 
         Stub = Service.rpc_stub_class
       end
       module Tex
-        # ----------------------------------------------------------------------------
-        #
         class Service
 
           include ::GRPC::GenericService
@@ -35,8 +47,8 @@ module Palm
           self.unmarshal_class_method = :decode
           self.service_name = 'palm.lily.v1.Tex'
 
-          rpc :ToPdf, ::Palm::Lily::V1::TexToRequest, ::Palm::Lily::V1::File
-          rpc :ToWord, ::Palm::Lily::V1::TexToRequest, ::Palm::Lily::V1::File
+          rpc :ToPdf, ::Palm::Lily::V1::TexToRequest, ::Palm::Lily::V1::S3File
+          rpc :ToWord, ::Palm::Lily::V1::TexToRequest, ::Palm::Lily::V1::S3File
         end
 
         Stub = Service.rpc_stub_class
@@ -52,7 +64,7 @@ module Palm
           self.unmarshal_class_method = :decode
           self.service_name = 'palm.lily.v1.Epub'
 
-          rpc :Build, ::Palm::Lily::V1::EpubBuildRequest, ::Palm::Lily::V1::File
+          rpc :Build, ::Palm::Lily::V1::EpubBuildRequest, ::Palm::Lily::V1::S3File
         end
 
         Stub = Service.rpc_stub_class

Някои файлове не бяха показани, защото твърде много файлове са промени