diff --git a/.gitignore b/.gitignore index 2a59512090f..0288438941d 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ vendor # Generated travis files .travis.yml + diff --git a/MODULE.bazel b/MODULE.bazel index d6ac458d856..a82ba4021c0 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -54,6 +54,7 @@ use_repo( go_deps, "com_github_antihax_optional", "com_github_bazelbuild_buildtools_v7", + "com_github_getkin_kin_openapi", "com_github_golang_protobuf", "com_github_google_go_cmp", "com_github_rogpeppe_fastuuid", diff --git a/WORKSPACE b/WORKSPACE index 4c4a979d569..4774fc75918 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -109,13 +109,97 @@ http_archive( ], ) -load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") # Use gazelle to declare Go dependencies in Bazel. # gazelle:repository_macro repositories.bzl%go_repositories load("//:repositories.bzl", "go_repositories") +go_repository( + name = "com_github_getkin_kin_openapi", + importpath = "github.com/getkin/kin-openapi", + sum = "h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=", + version = "v0.132.0", +) + +go_repository( + name = "com_github_go_openapi_jsonpointer", + importpath = "github.com/go-openapi/jsonpointer", + sum = "h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=", + version = "v0.21.0", +) + +go_repository( + name = "com_github_go_openapi_swag", + importpath = "github.com/go-openapi/swag", + sum = "h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=", + version = "v0.23.0", +) + +go_repository( + name = "com_github_go_test_deep", + importpath = "github.com/go-test/deep", + sum = "h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=", + version = "v1.0.8", +) + +go_repository( + name = "com_github_gorilla_mux", + importpath = "github.com/gorilla/mux", + sum = "h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=", + version = "v1.8.0", +) + +go_repository( + name = "com_github_josharian_intern", + importpath = "github.com/josharian/intern", + sum = "h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=", + version = "v1.0.0", +) + +go_repository( + name = "com_github_mailru_easyjson", + importpath = "github.com/mailru/easyjson", + sum = "h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=", + version = "v0.7.7", +) + +go_repository( + name = "com_github_mohae_deepcopy", + importpath = "github.com/mohae/deepcopy", + sum = "h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=", + version = "v0.0.0-20170929034955-c48cc78d4826", +) + +go_repository( + name = "com_github_oasdiff_yaml", + importpath = "github.com/oasdiff/yaml", + sum = "h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=", + version = "v0.0.0-20250309154309-f31be36b4037", +) + +go_repository( + name = "com_github_oasdiff_yaml3", + importpath = "github.com/oasdiff/yaml3", + sum = "h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c=", + version = "v0.0.0-20250309153720-d2182401db90", +) + +go_repository( + name = "com_github_perimeterx_marshmallow", + importpath = "github.com/perimeterx/marshmallow", + sum = "h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=", + version = "v1.1.5", +) + +go_repository( + name = "com_github_ugorji_go_codec", + importpath = "github.com/ugorji/go/codec", + sum = "h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0=", + version = "v1.2.7", +) + go_repositories() # This must be invoked after our explicit dependencies diff --git a/go.mod b/go.mod index 20783ca9a10..29e8e6b5b2f 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,10 @@ go 1.23.0 require ( github.com/antihax/optional v1.0.0 + github.com/getkin/kin-openapi v0.132.0 github.com/google/go-cmp v0.7.0 github.com/rogpeppe/fastuuid v1.2.0 + github.com/stretchr/testify v1.9.0 golang.org/x/oauth2 v0.30.0 golang.org/x/text v0.25.0 google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9 @@ -16,8 +18,16 @@ require ( ) require ( - github.com/kr/pretty v0.3.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect + github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect + github.com/perimeterx/marshmallow v1.1.5 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/net v0.37.0 // indirect golang.org/x/sys v0.31.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect ) diff --git a/go.sum b/go.sum index eac167948ed..f218d1ee5cd 100644 --- a/go.sum +++ b/go.sum @@ -1,28 +1,51 @@ github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= +github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= +github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= +github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= diff --git a/internal/descriptor/registry.go b/internal/descriptor/registry.go index 743cea8f126..23e914794d8 100644 --- a/internal/descriptor/registry.go +++ b/internal/descriptor/registry.go @@ -181,6 +181,9 @@ type Registry struct { // generateXGoType is a global generator option for generating x-go-type annotations generateXGoType bool + + // indicates how the one ofs are handled + oneOfStrategy string } type repeatedFieldSeparator struct { @@ -930,3 +933,11 @@ func (r *Registry) SetGenerateXGoType(generateXGoType bool) { func (r *Registry) GetGenerateXGoType() bool { return r.generateXGoType } + +func (r *Registry) SetOneOfStrategy(oneOfStrategy string) { + r.oneOfStrategy = oneOfStrategy +} + +func (r *Registry) GetOneOfStrategy() string { + return r.oneOfStrategy +} diff --git a/protoc-gen-openapiv3/BUILD.bazel b/protoc-gen-openapiv3/BUILD.bazel new file mode 100644 index 00000000000..bfed40a918e --- /dev/null +++ b/protoc-gen-openapiv3/BUILD.bazel @@ -0,0 +1,16 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") + +package(default_visibility = ["//visibility:private"]) + +go_library( + name = "protoc-gen-openapiv3_lib", + srcs = ["main.go"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3", + deps = ["//utilities"], +) + +go_binary( + name = "protoc-gen-openapiv3", + embed = [":protoc-gen-openapiv3_lib"], + visibility = ["//visibility:public"], +) diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/BUILD.bazel b/protoc-gen-openapiv3/internal/genopenapiv3/BUILD.bazel new file mode 100644 index 00000000000..44688141a85 --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/BUILD.bazel @@ -0,0 +1,16 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +package(default_visibility = ["//protoc-gen-openapiv3:__subpackages__"]) + +alias( + name = "go_default_library", + actual = ":genopenapiv3", + visibility = ["//protoc-gen-openapiv3:__subpackages__"], +) + +go_library( + name = "genopenapiv3", + srcs = ["openapi_doc.go"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/internal/genopenapiv3", + deps = ["@com_github_getkin_kin_openapi//openapi3"], +) diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/consts.go b/protoc-gen-openapiv3/internal/genopenapiv3/consts.go new file mode 100644 index 00000000000..5af7fd7239e --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/consts.go @@ -0,0 +1,7 @@ +package genopenapiv3 + +const ( + OpenAPIVersion = "3.0.2" + + statusProtoFQMN = ".google.rpc.Status" +) diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/convertors.go b/protoc-gen-openapiv3/internal/genopenapiv3/convertors.go new file mode 100644 index 00000000000..10008fc36cd --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/convertors.go @@ -0,0 +1,94 @@ +package genopenapiv3 + +import ( + "github.com/getkin/kin-openapi/openapi3" + "github.com/grpc-ecosystem/grpc-gateway/v2/internal/descriptor" + "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options" + "google.golang.org/protobuf/proto" +) + +func convertFileOptions(target *descriptor.File) *openapi3.T { + if openAPIAno := proto.GetExtension(target.GetOptions(), options.E_Openapiv3Document).(*options.OpenAPI); openAPIAno != nil { + return &openapi3.T{ + OpenAPI: OpenAPIVersion, + Info: convertInfo(openAPIAno.GetInfo()), + Security: *convertSecurityRequiremnt(openAPIAno.GetSecurity()), + Servers: convertServers(openAPIAno.GetServers()), + } + } + + return &openapi3.T{OpenAPI: OpenAPIVersion} +} + +func convertServers(servers []*options.Server) openapi3.Servers { + oAPIservers := make(openapi3.Servers, len(servers)) + + for i, srv := range servers { + vars := map[string]*openapi3.ServerVariable{} + + for k, v := range srv.GetVariables() { + vars[k] = &openapi3.ServerVariable{ + Enum: v.GetEnum(), + Default: v.GetDefault(), + Description: v.GetDescription(), + } + } + + oAPIservers[i] = &openapi3.Server{ + URL: srv.GetUrl(), + Description: srv.GetDescription(), + Variables: vars, + } + } + + return oAPIservers +} + +func convertInfo(openAPIInfo *options.Info) *openapi3.Info { + return &openapi3.Info{ + Title: openAPIInfo.GetTitle(), + Description: openAPIInfo.GetDescription(), + Version: openAPIInfo.GetVersion(), + TermsOfService: openAPIInfo.GetTermsOfService(), + Contact: convertContact(openAPIInfo.GetContact()), + License: convertLicense(openAPIInfo.GetLicense()), + } +} + +func convertContact(contactOption *options.Contact) *openapi3.Contact { + if contactOption == nil { + return nil + } + + return &openapi3.Contact{ + Name: contactOption.GetName(), + URL: contactOption.GetUrl(), + Email: contactOption.GetEmail(), + } +} + +func convertLicense(licenseOption *options.License) *openapi3.License { + if licenseOption == nil { + return nil + } + + return &openapi3.License{ + Name: licenseOption.GetName(), + URL: licenseOption.GetUrl(), + } +} +func convertSecurityRequiremnt(requirements []*options.SecurityRequirement) *openapi3.SecurityRequirements { + oAPIReqs := openapi3.NewSecurityRequirements() + + for _, req := range requirements { + oAPISecReq := openapi3.NewSecurityRequirement() + for authenticator, scopes := range req.GetAdditionalProperties() { + oAPISecReq.Authenticate(authenticator, scopes.GetScopes()...) + } + + oAPIReqs.With(oAPISecReq) + } + + return oAPIReqs +} + diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/file_generator.go b/protoc-gen-openapiv3/internal/genopenapiv3/file_generator.go new file mode 100644 index 00000000000..5345d392565 --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/file_generator.go @@ -0,0 +1,449 @@ +package genopenapiv3 + +import ( + "fmt" + "maps" + "slices" + "strings" + + "github.com/getkin/kin-openapi/openapi3" + "github.com/grpc-ecosystem/grpc-gateway/v2/internal/descriptor" + "google.golang.org/grpc/grpclog" + "google.golang.org/protobuf/types/descriptorpb" +) + +type fileGenerator struct { + *generator + + spec *openapi3.T +} + +func (fg *fileGenerator) generateFileSpec(file *descriptor.File) *openapi3.T { + + fg.spec = convertFileOptions(file) + + fg.spec.Components = &openapi3.Components{} + fg.spec.Components.Schemas = make(openapi3.Schemas) + fg.spec.Components.RequestBodies = make(openapi3.RequestBodies) + + if fg.spec.Paths == nil { + fg.spec.Paths = &openapi3.Paths{} + } + + for _, svc := range file.Services { + if fg.IsServiceVisible(svc) { + err := fg.generateServiceSpec(svc) + if err != nil { + grpclog.Errorf("could not generate service document: %v", err) + } + } + } + + for _, msg := range file.Messages { + if fg.IsMessageVisible(msg) { + fg.generateMessageSchemaRef(msg) + } + } + + for _, enum := range file.Enums { + if fg.IsEnumVisible(enum) { + fg.generateEnumSchemaRef(enum) + } + } + + return fg.spec +} + +func (fg *fileGenerator) generateMessageSchemaRef(msg *descriptor.Message) *openapi3.SchemaRef { + name := fg.resolveName(msg.FQMN()) + resultRef := openapi3.NewSchemaRef(fmt.Sprintf("#/components/schemas/%s", name), nil) + + _, ok := fg.spec.Components.Schemas[name] + if ok { + return resultRef + } + + fg.spec.Components.Schemas[name] = fg.generateMessageSchema(msg, nil).NewRef() + + return resultRef +} + +func (fg *fileGenerator) generateMessageSchema(msg *descriptor.Message, excludeFields []string) *openapi3.Schema { + msgName := fg.resolveName(msg.FQMN()) + if scheme, ok := wktSchemas[msgName]; ok { + return scheme + } + + schema := &openapi3.Schema{ + Type: &openapi3.Types{openapi3.TypeObject}, + } + + properties := make(openapi3.Schemas) + tempOneOfsProperties := make(map[int32]openapi3.Schemas) + for _, field := range msg.Fields { + if slices.Contains(excludeFields, field.FQFN()) { + continue + } + + fieldDoc := fg.generateFieldDoc(field) + if field.OneofIndex != nil { + if tempOneOfsProperties[*field.OneofIndex] == nil { + tempOneOfsProperties[*field.OneofIndex] = make(openapi3.Schemas) + } + + tempOneOfsProperties[*field.OneofIndex][field.GetName()] = fieldDoc + } else { + properties[field.GetName()] = fieldDoc + } + } + + allOneOfsProperties := make(map[int32]openapi3.Schemas) + + for oneOfKey, oneOfProperties := range tempOneOfsProperties { + if len(oneOfProperties) == 1 { + keys := slices.Collect(maps.Keys(oneOfProperties)) + key := keys[0] + value := oneOfProperties[key] + properties[key] = value + } else { + allOneOfsProperties[oneOfKey] = oneOfProperties + } + } + + if len(allOneOfsProperties) == 0 { + schema.Properties = properties + } else { + switch fg.reg.GetOneOfStrategy() { + case "oneOf": + return &openapi3.Schema{ + OneOf: fg.generateMessageWithOneOfsSchemas(allOneOfsProperties, properties, msg.GetOneofDecl(), ""), + } + default: + grpclog.Fatal("unknown oneof strategy") + } + } + + return schema +} + +/* +this type of oneof strategy, creates a oneof object for every possible combination of oneof fields +e.g.: if you have a proto like this: + + message sample{ + oneof one { + string field_one = 1; + string field_two = 2; + } + + oneof two { + string field_three = 3; + string field_four = 4; + } + } + +2 * 2 = 4, object schemas will be generate for each combination of set {field_one, field_two} and {field_three, field_four} +*/ +func (fg *fileGenerator) generateMessageWithOneOfsSchemas(allOneOfsProperties map[int32]openapi3.Schemas, properties openapi3.Schemas, + oneOfs []*descriptorpb.OneofDescriptorProto, namePrefix string) openapi3.SchemaRefs { + if len(oneOfs) == 0 { + return openapi3.SchemaRefs{&openapi3.SchemaRef{ + Value: &openapi3.Schema{ + Type: &openapi3.Types{openapi3.TypeObject}, + Properties: properties, + }, + }} + } + + oneOfId := len(oneOfs) - 1 + newOneOfs := oneOfs[:oneOfId] + + oneOfProperties := allOneOfsProperties[int32(oneOfId)] + + newAllOneOfsProperties := maps.Clone(allOneOfsProperties) + delete(newAllOneOfsProperties, int32(oneOfId)) + + var res openapi3.SchemaRefs + + for fieldName, fieldSchema := range oneOfProperties { + newProperties := maps.Clone(properties) + newProperties[fieldName] = fieldSchema + res = append(res, fg.generateMessageWithOneOfsSchemas(newAllOneOfsProperties, newProperties, newOneOfs, namePrefix + fieldName)...) + } + + return res +} + +func (fg *fileGenerator) generateFieldDoc(field *descriptor.Field) *openapi3.SchemaRef { + location := fg.fqmnToLocation(field.Message.FQMN()) + if m, err := fg.reg.LookupMsg(location, field.GetTypeName()); err == nil { + if opt := m.GetOptions(); opt != nil && opt.MapEntry != nil && *opt.MapEntry { + FieldDesc := m.GetField()[1] + + return &openapi3.SchemaRef{ + Value: &openapi3.Schema{ + Type: &openapi3.Types{openapi3.TypeObject}, + AdditionalProperties: openapi3.AdditionalProperties{ + Schema: fg.generateFieldTypeSchema(FieldDesc, location), + }, + }, + } + } + } + + if field.GetLabel() == descriptorpb.FieldDescriptorProto_LABEL_REPEATED { + return &openapi3.SchemaRef{ + Value: &openapi3.Schema{ + Type: &openapi3.Types{openapi3.TypeArray}, + Items: fg.generateFieldTypeSchema(field.FieldDescriptorProto, location), + }, + } + } + + return fg.generateFieldTypeSchema(field.FieldDescriptorProto, location) +} + +func (fg *fileGenerator) generateFieldTypeSchema(fd *descriptorpb.FieldDescriptorProto, location string) *openapi3.SchemaRef { + if schema, ok := primitiveTypeSchemas[fd.GetType()]; ok { + return schema.NewRef() + } + + switch ft := fd.GetType(); ft { + case descriptorpb.FieldDescriptorProto_TYPE_ENUM, descriptorpb.FieldDescriptorProto_TYPE_MESSAGE, descriptorpb.FieldDescriptorProto_TYPE_GROUP: + openAPIRef := fg.resolveType(fd.GetTypeName()) + if schema, ok := fg.spec.Components.Schemas[openAPIRef]; ok { + return schema + } else { + if fd.GetType() == descriptorpb.FieldDescriptorProto_TYPE_ENUM { + fieldTypeEnum, err := fg.reg.LookupEnum(location, fd.GetTypeName()) + if err != nil { + panic(err) + } + + return fg.generateEnumSchemaRef(fieldTypeEnum) + } else { + fieldTypeMsg, err := fg.reg.LookupMsg(location, fd.GetTypeName()) + if err != nil { + panic(err) + } + return fg.generateMessageSchemaRef(fieldTypeMsg) + } + } + default: + return &openapi3.SchemaRef{ + Value: &openapi3.Schema{Type: &openapi3.Types{ft.String()}, Format: "UNKNOWN"}, + } + } +} + +func (fg *fileGenerator) generateEnumSchemaRef(enum *descriptor.Enum) *openapi3.SchemaRef { + name := fg.resolveName(enum.FQEN()) + + schemaRef, ok := fg.spec.Components.Schemas[name] + if ok { + return schemaRef + } + + schemaRef = fg.generateEnumSchema(enum).NewRef() + fg.spec.Components.Schemas[name] = schemaRef + + return schemaRef +} + +func (fg *fileGenerator) generateEnumSchema(enum *descriptor.Enum) *openapi3.Schema { + var enumValues []any + for _, value := range enum.GetValue() { + enumValues = append(enumValues, value.GetName()) + } + + return &openapi3.Schema{ + Type: &openapi3.Types{openapi3.TypeString}, + Enum: enumValues, + } +} + +func (fg *fileGenerator) generateServiceSpec(svc *descriptor.Service) error { + for _, meth := range svc.Methods { + if fg.IsMethodVisible(meth) { + err := fg.generateMethodDoc(meth) + if err != nil { + return fmt.Errorf("could not generate method %s doc: %w", meth.GetName(), err) + } + } + } + + return nil +} + +func (fg *fileGenerator) generateMethodDoc(meth *descriptor.Method) error { + for bindingIdx, binding := range meth.Bindings { + opOpts, err := extractOperationOptionFromMethodDescriptor(meth.MethodDescriptorProto) + if err != nil { + return fmt.Errorf("error extracting method %s operations: %v", meth.GetName(), err) + } + + var params openapi3.Parameters + var requestBody *openapi3.RequestBodyRef + + if meth.RequestType != nil { + tmpParams, err := fg.messageToParameters(meth.RequestType, binding.PathParams, binding.Body, + binding.HTTPMethod, "") + if err != nil { + grpclog.Errorf("error generating query parameters for method %s: %v", meth.GetName(), err) + } else { + params = append(params, tmpParams...) + } + + pathParamsFQFNs := make([]string, len(binding.PathParams)) + for i, param := range binding.PathParams { + pathParamsFQFNs[i] = param.Target.FQFN() + } + + switch binding.HTTPMethod { + case "POST", "PUT", "PATCH": + // For POST, PUT, PATCH, add request body + if len(pathParamsFQFNs) > 0 { + messageSchema := fg.generateMessageSchema(meth.RequestType, pathParamsFQFNs) + + name := fg.resolveName(meth.RequestType.FQMN()) + resultRef := fmt.Sprintf("#/components/requestBodies/%s", name) + + fg.spec.Components.RequestBodies[name] = &openapi3.RequestBodyRef{Value: openapi3.NewRequestBody().WithContent( + openapi3.NewContentWithJSONSchemaRef(messageSchema.NewRef()))} + + requestBody = &openapi3.RequestBodyRef{Ref: resultRef} + } else { + requestBody = &openapi3.RequestBodyRef{Value: openapi3.NewRequestBody(). + WithJSONSchemaRef(fg.generateMessageSchemaRef(meth.RequestType))} + } + } + } + + defaultResponse, err := fg.defaultResponse() + if err != nil { + return fmt.Errorf("could not get default response: %w", err) + } + + successResponseSchema := openapi3.NewResponse(). + WithJSONSchemaRef(fg.generateMessageSchemaRef(meth.ResponseType)) + + defaultResponseSchema := openapi3.NewResponse(). + WithJSONSchemaRef(fg.generateMessageSchemaRef(defaultResponse)) + + responses := openapi3.NewResponses(openapi3.WithStatus(200, &openapi3.ResponseRef{Value: successResponseSchema}), + openapi3.WithName("default", defaultResponseSchema)) + + operation := &openapi3.Operation{ + Tags: []string{meth.Service.GetName()}, + Summary: opOpts.GetSummary(), + Description: opOpts.GetDescription(), + OperationID: fg.getOperationName(meth.Service.GetName(), meth.GetName(), bindingIdx), + RequestBody: requestBody, + Responses: responses, + Parameters: params, + } + + if opOpts.GetSecurity() != nil { + operation.Security = convertSecurityRequiremnt(opOpts.GetSecurity()) + } + + path := fg.convertPathTemplate(binding.PathTmpl.Template) + pathItem := fg.spec.Paths.Find(path) + if pathItem == nil { + pathItem = &openapi3.PathItem{} + fg.spec.Paths.Set(path, pathItem) + } + + switch binding.HTTPMethod { + case "GET": + pathItem.Get = operation + case "POST": + pathItem.Post = operation + case "PUT": + pathItem.Put = operation + case "PATCH": + pathItem.Patch = operation + case "DELETE": + pathItem.Delete = operation + case "HEAD": + pathItem.Head = operation + case "OPTIONS": + pathItem.Options = operation + } + } + + return nil +} + +func (fg *fileGenerator) convertPathTemplate(template string) string { + // TODO: handle /{arg=foo/*} and /{arg=foo/**} + return template +} + +func (fg *fileGenerator) messageToParameters(message *descriptor.Message, + pathParams []descriptor.Parameter, body *descriptor.Body, + httpMethod string, paramPrefix string) (openapi3.Parameters, error) { + + // TODO: remove this after handling nested path parameters + _ = paramPrefix + + params := openapi3.NewParameters() + for _, field := range message.Fields { + paramType, isParam := fg.getParamType(field, pathParams, body, message, httpMethod) + if !isParam { + // TODO: handle nested path parameter reference + continue + } + + schema := fg.generateFieldTypeSchema(field.FieldDescriptorProto, fg.fqmnToLocation(field.FQFN())) + + switch paramType { + case openapi3.ParameterInPath: + param := openapi3.NewPathParameter(field.GetName()) + param.Schema = schema + params = append(params, &openapi3.ParameterRef{ + Value: param, + }) + case openapi3.ParameterInQuery: + param := openapi3.NewQueryParameter(field.GetName()) + param.Schema = schema + params = append(params, &openapi3.ParameterRef{ + Value: param, + }) + } + } + + return params, nil +} + +func (fg *fileGenerator) getParamType(field *descriptor.Field, pathParams []descriptor.Parameter, body *descriptor.Body, + message *descriptor.Message, httpMethod string) (string, bool) { + + for _, pathParam := range pathParams { + if pathParam.Target.FQFN() == field.FQFN() { + return openapi3.ParameterInPath, true + } + + if strings.HasSuffix(pathParam.Target.FQFN(), message.FQMN()) { + return "", false + } + } + + if httpMethod == "GET" || httpMethod == "DELETE" { + return openapi3.ParameterInQuery, true + } + + if body == nil { + return openapi3.ParameterInQuery, true + } + + if len(body.FieldPath) == 0 { + return "", false + } + + if body.FieldPath[len(body.FieldPath)-1].Target.FQFN() == field.FQFN() { + return "", false + } + + return openapi3.ParameterInQuery, true +} diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/generator.go b/protoc-gen-openapiv3/internal/genopenapiv3/generator.go new file mode 100644 index 00000000000..5d70fa90245 --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/generator.go @@ -0,0 +1,216 @@ +package genopenapiv3 + +import ( + "fmt" + "path/filepath" + "strings" + + "github.com/getkin/kin-openapi/openapi3" + "github.com/grpc-ecosystem/grpc-gateway/v2/internal/descriptor" + gen "github.com/grpc-ecosystem/grpc-gateway/v2/internal/generator" + "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options" + "google.golang.org/genproto/googleapis/api/visibility" + statuspb "google.golang.org/genproto/googleapis/rpc/status" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protodesc" + "google.golang.org/protobuf/types/descriptorpb" + "google.golang.org/protobuf/types/known/anypb" + "google.golang.org/protobuf/types/pluginpb" +) + +type generator struct { + reg *descriptor.Registry + format Format +} + + +func NewGenerator(reg *descriptor.Registry, format Format) gen.Generator { + return &generator{ + reg: reg, + format: format, + } +} + +func (g *generator) Generate(targets []*descriptor.File) ([]*descriptor.ResponseFile, error) { + err := g.loadPrequisiteProtos() + if err != nil { + return nil, fmt.Errorf("could not load prequisite proto files in registry: %w", err) + } + + respFiles := make([]*descriptor.ResponseFile, 0, len(targets)) + docs := make([]*openapi3.T, 0, len(targets)) + for _, t := range targets { + fileGenerator := &fileGenerator{generator: g, spec: &openapi3.T{}} + doc := fileGenerator.generateFileSpec(t) + docs = append(docs, doc) + + contentBytes, err := g.format.MarshalOpenAPIDoc(doc) + if err != nil { + return nil, err + } + + base := filepath.Base(t.GetName()) + ext := filepath.Ext(base) + fileName := fmt.Sprintf("%s.openapiv3.%s", base[:len(base)-len(ext)], g.format) + + respFiles = append(respFiles, &descriptor.ResponseFile{ + CodeGeneratorResponse_File: &pluginpb.CodeGeneratorResponse_File{ + Name: proto.String(fileName), + Content: proto.String(string(contentBytes)), + }, + }) + + } + + mergedDocs, err := MergeOpenAPISpecs(docs...) + if err != nil { + return nil, fmt.Errorf("could not merge docs: %w", err) + } + + contentBytes, err := g.format.MarshalOpenAPIDoc(mergedDocs) + if err != nil { + return nil, err + } + + respFiles = append(respFiles, &descriptor.ResponseFile{ + CodeGeneratorResponse_File: &pluginpb.CodeGeneratorResponse_File{ + Name: proto.String(fmt.Sprintf("merged.openapiv3.%s", g.format)), + Content: proto.String(string(contentBytes)), + }, + }) + + return respFiles, nil +} + +func (g *generator) IsMessageVisible(msg *descriptor.Message) bool { + if !proto.HasExtension(msg, visibility.E_MessageVisibility) { + return true + } + + ext := proto.GetExtension(msg.DescriptorProto, visibility.E_MessageVisibility) + visibilityOpt, ok := ext.(*visibility.VisibilityRule) + if ok { + return g.isVisible(visibilityOpt) + } + + return true +} + +func (g *generator) IsFieldVisible(field *descriptor.Field) bool { + if !proto.HasExtension(field, visibility.E_MessageVisibility) { + return true + } + + ext := proto.GetExtension(field.FieldDescriptorProto, visibility.E_MessageVisibility) + visibilityOpt, ok := ext.(*visibility.VisibilityRule) + if ok { + return g.isVisible(visibilityOpt) + } + + return true +} +func (g *generator) IsEnumVisible(enum *descriptor.Enum) bool { + + if !proto.HasExtension(enum, visibility.E_MessageVisibility) { + return true + } + + ext := proto.GetExtension(enum.EnumDescriptorProto, visibility.E_EnumVisibility) + visibilityOpt, ok := ext.(*visibility.VisibilityRule) + if ok { + return g.isVisible(visibilityOpt) + } + + return true +} + +func (g *generator) IsMethodVisible(meth *descriptor.Method) bool { + if !proto.HasExtension(meth, visibility.E_MessageVisibility) { + return true + } + + ext := proto.GetExtension(meth.MethodDescriptorProto, visibility.E_MethodVisibility) + visibilityOpt, ok := ext.(*visibility.VisibilityRule) + if ok { + return g.isVisible(visibilityOpt) + } + + return true +} + +func (g *generator) IsServiceVisible(svc *descriptor.Service) bool { + if !proto.HasExtension(svc, visibility.E_ApiVisibility) { + return true + } + + ext := proto.GetExtension(svc.ServiceDescriptorProto, visibility.E_ApiVisibility) + visibilityOpt, ok := ext.(*visibility.VisibilityRule) + if ok { + return g.isVisible(visibilityOpt) + } + + return true +} + +func (g *generator) isVisible(rule *visibility.VisibilityRule) bool { + if rule == nil { + return true + } + + return g.reg.GetVisibilityRestrictionSelectors()[rule.GetRestriction()] +} + +func (g *generator) getOperationName(serviceName, methodName string, bindingIdx int) string { + if bindingIdx == 0 { + return fmt.Sprintf("%s_%s", serviceName, methodName) + } + return fmt.Sprintf("%s_%s_%d", serviceName, methodName, bindingIdx) +} + +func (g *generator) fqmnToLocation(fqmn string) string { + location := "" + if ix := strings.LastIndex(fqmn, "."); ix > 0 { + location = fqmn[0:ix] + } + return location +} + +func (g *generator) resolveName(fqmn string) string { + return fqmn +} + +func (g *generator) resolveType(typeName string) string { + return typeName +} + +func (g *generator) loadPrequisiteProtos() error { + any := protodesc.ToFileDescriptorProto((&anypb.Any{}).ProtoReflect().Descriptor().ParentFile()) + any.SourceCodeInfo = new(descriptorpb.SourceCodeInfo) + status := protodesc.ToFileDescriptorProto((&statuspb.Status{}).ProtoReflect().Descriptor().ParentFile()) + status.SourceCodeInfo = new(descriptorpb.SourceCodeInfo) + return g.reg.Load(&pluginpb.CodeGeneratorRequest{ + ProtoFile: []*descriptorpb.FileDescriptorProto{ + any, + status, + }, + }) +} + +func (g *generator) defaultResponse() (*descriptor.Message, error) { + return g.reg.LookupMsg("", statusProtoFQMN) +} + +func extractOperationOptionFromMethodDescriptor(meth *descriptorpb.MethodDescriptorProto) (*options.Operation, error) { + if meth.Options == nil { + return &options.Operation{}, nil + } + if !proto.HasExtension(meth.Options, options.E_Openapiv3Operation) { + return &options.Operation{}, nil + } + ext := proto.GetExtension(meth.Options, options.E_Openapiv3Operation) + opts, ok := ext.(*options.Operation) + if !ok { + return nil, fmt.Errorf("extension is %T; want an Operation", ext) + } + return opts, nil +} diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/merge.go b/protoc-gen-openapiv3/internal/genopenapiv3/merge.go new file mode 100644 index 00000000000..11a0dc27dc3 --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/merge.go @@ -0,0 +1,279 @@ +package genopenapiv3 + +import ( + "fmt" + "maps" + + "github.com/getkin/kin-openapi/openapi3" +) + +func MergeOpenAPISpecs(specs ...*openapi3.T) (*openapi3.T, error) { + if len(specs) == 0 { + return nil, fmt.Errorf("at least one OpenAPI spec is required") + } + + merged := &openapi3.T{ + OpenAPI: specs[0].OpenAPI, + Info: specs[0].Info, + Servers: make(openapi3.Servers, 0), + Paths: new(openapi3.Paths), + Components: &openapi3.Components{ + Schemas: make(openapi3.Schemas), + Parameters: make(openapi3.ParametersMap), + Headers: make(openapi3.Headers), + RequestBodies: make(openapi3.RequestBodies), + Responses: make(openapi3.ResponseBodies), + SecuritySchemes: make(openapi3.SecuritySchemes), + Examples: make(openapi3.Examples), + Links: make(openapi3.Links), + Callbacks: make(openapi3.Callbacks), + }, + Security: make(openapi3.SecurityRequirements, 0), + Tags: make(openapi3.Tags, 0), + } + + serverMap := make(map[string]bool) + tagMap := make(map[string]bool) + + for i, spec := range specs { + if spec == nil { + continue + } + + if spec.Servers != nil { + for _, server := range spec.Servers { + serverKey := server.URL + if !serverMap[serverKey] { + merged.Servers = append(merged.Servers, server) + serverMap[serverKey] = true + } + } + } + + if spec.Paths != nil { + for path, pathItem := range spec.Paths.Map() { + if existingPathItem, exists := merged.Paths.Map()[path]; exists { + mergedPathItem, err := mergePathItems(existingPathItem, pathItem) + if err != nil { + return nil, fmt.Errorf("error merging path %s from spec %d: %v", path, i, err) + } + + merged.Paths.Set(path, mergedPathItem) + } else { + + merged.Paths.Set(path, pathItem) + } + } + } + + if spec.Components != nil { + if err := mergeComponents(merged.Components, spec.Components, i); err != nil { + return nil, fmt.Errorf("error merging components from spec %d: %v", i, err) + } + } + + if spec.Tags != nil { + for _, tag := range spec.Tags { + if !tagMap[tag.Name] { + merged.Tags = append(merged.Tags, tag) + tagMap[tag.Name] = true + } + } + } + + if spec.Security != nil { + merged.Security = append(merged.Security, spec.Security...) + } + } + + return merged, nil +} + +// mergePathItems merges two path items, combining their operations +func mergePathItems(existing, new *openapi3.PathItem) (*openapi3.PathItem, error) { + merged := &openapi3.PathItem{ + Ref: existing.Ref, + Summary: existing.Summary, + Description: existing.Description, + Servers: existing.Servers, + Parameters: existing.Parameters, + } + + // Copy existing operations + if existing.Get != nil { + merged.Get = existing.Get + } + if existing.Put != nil { + merged.Put = existing.Put + } + if existing.Post != nil { + merged.Post = existing.Post + } + if existing.Delete != nil { + merged.Delete = existing.Delete + } + if existing.Options != nil { + merged.Options = existing.Options + } + if existing.Head != nil { + merged.Head = existing.Head + } + if existing.Patch != nil { + merged.Patch = existing.Patch + } + if existing.Trace != nil { + merged.Trace = existing.Trace + } + + // Add new operations (will overwrite if same method exists) + if new.Get != nil { + if merged.Get != nil { + return nil, fmt.Errorf("conflicting GET operation") + } + merged.Get = new.Get + } + if new.Put != nil { + if merged.Put != nil { + return nil, fmt.Errorf("conflicting PUT operation") + } + merged.Put = new.Put + } + if new.Post != nil { + if merged.Post != nil { + return nil, fmt.Errorf("conflicting POST operation") + } + merged.Post = new.Post + } + if new.Delete != nil { + if merged.Delete != nil { + return nil, fmt.Errorf("conflicting DELETE operation") + } + merged.Delete = new.Delete + } + if new.Options != nil { + if merged.Options != nil { + return nil, fmt.Errorf("conflicting OPTIONS operation") + } + merged.Options = new.Options + } + if new.Head != nil { + if merged.Head != nil { + return nil, fmt.Errorf("conflicting HEAD operation") + } + merged.Head = new.Head + } + if new.Patch != nil { + if merged.Patch != nil { + return nil, fmt.Errorf("conflicting PATCH operation") + } + merged.Patch = new.Patch + } + if new.Trace != nil { + if merged.Trace != nil { + return nil, fmt.Errorf("conflicting TRACE operation") + } + merged.Trace = new.Trace + } + + // Merge parameters + if new.Parameters != nil { + merged.Parameters = append(merged.Parameters, new.Parameters...) + } + + // Merge servers + if new.Servers != nil { + merged.Servers = append(merged.Servers, new.Servers...) + } + + return merged, nil +} + +// mergeComponents merges components from source into target +func mergeComponents(target, source *openapi3.Components, specIndex int) error { + // Merge schemas + if source.Schemas != nil { + maps.Copy(target.Schemas, source.Schemas) + } + + // Merge parameters + if source.Parameters != nil { + for name, param := range source.Parameters { + if _, exists := target.Parameters[name]; exists { + return fmt.Errorf("parameter %s already exists (from spec %d)", name, specIndex) + } + target.Parameters[name] = param + } + } + + // Merge headers + if source.Headers != nil { + for name, header := range source.Headers { + if _, exists := target.Headers[name]; exists { + return fmt.Errorf("header %s already exists (from spec %d)", name, specIndex) + } + target.Headers[name] = header + } + } + + // Merge request bodies + if source.RequestBodies != nil { + for name, requestBody := range source.RequestBodies { + if _, exists := target.RequestBodies[name]; exists { + return fmt.Errorf("request body %s already exists (from spec %d)", name, specIndex) + } + target.RequestBodies[name] = requestBody + } + } + + // Merge responses + if source.Responses != nil { + for name, response := range source.Responses { + if _, exists := target.Responses[name]; exists { + return fmt.Errorf("response %s already exists (from spec %d)", name, specIndex) + } + target.Responses[name] = response + } + } + + // Merge security schemes + if source.SecuritySchemes != nil { + for name, securityScheme := range source.SecuritySchemes { + if _, exists := target.SecuritySchemes[name]; exists { + return fmt.Errorf("security scheme %s already exists (from spec %d)", name, specIndex) + } + target.SecuritySchemes[name] = securityScheme + } + } + + // Merge examples + if source.Examples != nil { + for name, example := range source.Examples { + if _, exists := target.Examples[name]; exists { + return fmt.Errorf("example %s already exists (from spec %d)", name, specIndex) + } + target.Examples[name] = example + } + } + + // Merge links + if source.Links != nil { + for name, link := range source.Links { + if _, exists := target.Links[name]; exists { + return fmt.Errorf("link %s already exists (from spec %d)", name, specIndex) + } + target.Links[name] = link + } + } + + // Merge callbacks + if source.Callbacks != nil { + for name, callback := range source.Callbacks { + if _, exists := target.Callbacks[name]; exists { + return fmt.Errorf("callback %s already exists (from spec %d)", name, specIndex) + } + target.Callbacks[name] = callback + } + } + + return nil +} diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/schema_mappings.go b/protoc-gen-openapiv3/internal/genopenapiv3/schema_mappings.go new file mode 100644 index 00000000000..2e210c9fb52 --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/schema_mappings.go @@ -0,0 +1,147 @@ +package genopenapiv3 + +import ( + "github.com/getkin/kin-openapi/openapi3" + "google.golang.org/protobuf/types/descriptorpb" +) + +var primitiveTypeSchemas = map[descriptorpb.FieldDescriptorProto_Type]*openapi3.Schema{ + descriptorpb.FieldDescriptorProto_TYPE_DOUBLE: { + Type: &openapi3.Types{"number"}, + Format: "double", + }, + descriptorpb.FieldDescriptorProto_TYPE_FLOAT: { + Type: &openapi3.Types{"number"}, + Format: "float", + }, + // 64bit integer types are marshaled as string in the default JSONPb marshaler. + // This maintains compatibility with JSON's limited number precision. + descriptorpb.FieldDescriptorProto_TYPE_INT64: { + Type: &openapi3.Types{"string"}, + Format: "int64", + }, + // 64bit integer types are marshaled as string in the default JSONPb marshaler. + // TODO(yugui) Add an option to declare 64bit integers as int64. + // + // NOTE: uint64 is not a standard format in OpenAPI spec. + // So we cannot expect that uint64 is commonly supported by OpenAPI processors. + descriptorpb.FieldDescriptorProto_TYPE_UINT64: { + Type: &openapi3.Types{"string"}, + Format: "uint64", + }, + descriptorpb.FieldDescriptorProto_TYPE_INT32: { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + // 64bit types marshaled as string for JSON compatibility + descriptorpb.FieldDescriptorProto_TYPE_FIXED64: { + Type: &openapi3.Types{"string"}, + Format: "uint64", + }, + // Fixed 32-bit unsigned integer + descriptorpb.FieldDescriptorProto_TYPE_FIXED32: { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + // NOTE: In OpenAPI v3 specification, format should be empty on boolean type + descriptorpb.FieldDescriptorProto_TYPE_BOOL: { + Type: &openapi3.Types{"boolean"}, + }, + // NOTE: In OpenAPI v3 specification, format can be empty on string type + descriptorpb.FieldDescriptorProto_TYPE_STRING: { + Type: &openapi3.Types{"string"}, + }, + // Base64 encoded string representation + descriptorpb.FieldDescriptorProto_TYPE_BYTES: { + Type: &openapi3.Types{"string"}, + Format: "byte", + }, + // 32-bit unsigned integer + descriptorpb.FieldDescriptorProto_TYPE_UINT32: { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + descriptorpb.FieldDescriptorProto_TYPE_SFIXED32: { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + // 64bit types marshaled as string for JSON compatibility + descriptorpb.FieldDescriptorProto_TYPE_SFIXED64: { + Type: &openapi3.Types{"string"}, + Format: "int64", + }, + descriptorpb.FieldDescriptorProto_TYPE_SINT32: { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + // 64bit types marshaled as string for JSON compatibility + descriptorpb.FieldDescriptorProto_TYPE_SINT64: { + Type: &openapi3.Types{"string"}, + Format: "int64", + }, +} + +var wktSchemas = map[string]*openapi3.Schema{ + ".google.protobuf.FieldMask": { + Type: &openapi3.Types{"string"}, + }, + ".google.protobuf.Timestamp": { + Type: &openapi3.Types{"string"}, + Format: "date-time", + }, + ".google.protobuf.Duration": { + Type: &openapi3.Types{"string"}, + }, + ".google.protobuf.StringValue": { + Type: &openapi3.Types{"string"}, + }, + ".google.protobuf.BytesValue": { + Type: &openapi3.Types{"string"}, + Format: "byte", + }, + ".google.protobuf.Int32Value": { + Type: &openapi3.Types{"integer"}, + Format: "int32", + }, + ".google.protobuf.UInt32Value": { + Type: &openapi3.Types{"integer"}, + Format: "int64", + }, + ".google.protobuf.Int64Value": { + Type: &openapi3.Types{"string"}, + Format: "int64", + }, + ".google.protobuf.UInt64Value": { + Type: &openapi3.Types{"string"}, + Format: "uint64", + }, + ".google.protobuf.FloatValue": { + Type: &openapi3.Types{"number"}, + Format: "float", + }, + ".google.protobuf.DoubleValue": { + Type: &openapi3.Types{"number"}, + Format: "double", + }, + ".google.protobuf.BoolValue": { + Type: &openapi3.Types{"boolean"}, + }, + ".google.protobuf.Empty": { + Type: &openapi3.Types{"object"}, + }, + ".google.protobuf.Struct": { + Type: &openapi3.Types{"object"}, + }, + ".google.protobuf.Value": {}, + ".google.protobuf.ListValue": { + Type: &openapi3.Types{"array"}, + Items: &openapi3.SchemaRef{ + Value: &openapi3.Schema{ + Type: &openapi3.Types{"object"}, + }, + }, + }, + ".google.protobuf.NullValue": { + Type: &openapi3.Types{"string"}, + }, +} diff --git a/protoc-gen-openapiv3/internal/genopenapiv3/types.go b/protoc-gen-openapiv3/internal/genopenapiv3/types.go new file mode 100644 index 00000000000..42494ddd91a --- /dev/null +++ b/protoc-gen-openapiv3/internal/genopenapiv3/types.go @@ -0,0 +1,42 @@ +package genopenapiv3 + +import ( + "errors" + + "github.com/getkin/kin-openapi/openapi3" + "google.golang.org/grpc/grpclog" + "gopkg.in/yaml.v3" +) + +type Format string + +const ( + FormatJSON Format = "json" + FormatYAML Format = "yaml" +) + +var ErrUnSupportedFormat = errors.New("unsupported format provided") + + +func (f Format) MarshalOpenAPIDoc(doc *openapi3.T) ([]byte, error) { + switch f { + case FormatJSON: + return doc.MarshalJSON() + case FormatYAML: + openapiDoc, err := doc.MarshalYAML() + if err != nil { + return nil, err + } + return yaml.Marshal(openapiDoc) + default: + grpclog.Errorf("unsupported format: %s\n", f) + return nil, ErrUnSupportedFormat + } +} + +type OneOfStrategy string + +const ( + OneOfStrategyOneOf = "oneof" + OneOfStrategyAllOf = "allof" +) diff --git a/protoc-gen-openapiv3/main.go b/protoc-gen-openapiv3/main.go new file mode 100644 index 00000000000..a413569d608 --- /dev/null +++ b/protoc-gen-openapiv3/main.go @@ -0,0 +1,142 @@ +package main + +import ( + "flag" + "fmt" + "os" + "strings" + + "github.com/grpc-ecosystem/grpc-gateway/v2/internal/codegenerator" + "github.com/grpc-ecosystem/grpc-gateway/v2/internal/descriptor" + "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/internal/genopenapiv3" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc/grpclog" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/pluginpb" +) + +var ( + file = flag.String("file", "-", "where to load data from") + openAPIConfiguration = flag.String("openapi_configuration", "", "path to file which describes the OpenAPI Configuration in YAML format") + oneOfStrategy = flag.String("oneof_strategy", "oneOf", "how to handle oneofs") + outputFormat = flag.String("output_format", string(genopenapiv3.FormatJSON), fmt.Sprintf("output content format. Allowed values are: `%s`, `%s`", genopenapiv3.FormatJSON, genopenapiv3.FormatYAML)) + visibilityRestrictionSelectors = utilities.StringArrayFlag(flag.CommandLine, "visibility_restriction_selectors", "list of `google.api.VisibilityRule` visibility labels to include in the generated output when a visibility annotation is defined. Repeat this option to supply multiple values. Elements without visibility annotations are unaffected by this setting.") +) + +// Variables set by goreleaser at build time +var ( + version = "dev" + commit = "unknown" + date = "unknown" +) + +func main() { + + flag.Parse() + + var openFile *os.File + var err error + + if *file == "-" { + openFile = os.Stdin + } else { + openFile, err = os.Open(*file) + if err != nil { + grpclog.Fatal("could not open file", err) + os.Exit(1) + } + + defer openFile.Close() + } + + reg := descriptor.NewRegistry() + if grpclog.V(1) { + grpclog.Info("Processing code generator request") + } + + req, err := codegenerator.ParseRequest(openFile) + if err != nil { + grpclog.Fatal(err) + } + + if req.Parameter != nil { + err := parseReqParam(req.GetParameter(), flag.CommandLine) + if err != nil { + emitError(err) + return + } + } + + reg.SetOneOfStrategy(*oneOfStrategy) + reg.SetVisibilityRestrictionSelectors(*visibilityRestrictionSelectors) + + if err := reg.Load(req); err != nil { + emitError(err) + return + } + + generator := genopenapiv3.NewGenerator(reg, genopenapiv3.Format(*outputFormat)) + + targets := make([]*descriptor.File, 0, len(req.FileToGenerate)) + for _, target := range req.FileToGenerate { + f, err := reg.LookupFile(target) + if err != nil { + grpclog.Fatal(err) + } + targets = append(targets, f) + } + + out, err := generator.Generate(targets) + if grpclog.V(1) { + grpclog.Info("Processed code generator request") + } + if err != nil { + emitError(err) + return + } + emitFiles(out) +} + +// parseReqParam parses a CodeGeneratorRequest parameter and adds the +// extracted values to the given FlagSet and pkgMap. Returns a non-nil +// error if setting a flag failed. +func parseReqParam(param string, f *flag.FlagSet) error { + if param == "" { + return nil + } + for _, p := range strings.Split(param, ",") { + flagName, value, valueExists := strings.Cut(p, "=") + if !valueExists { + return fmt.Errorf("no value exists for flag: %s", flagName) + } + + if err := f.Set(flagName, value); err != nil { + return fmt.Errorf("cannot set flag %s: %w", p, err) + } + } + return nil +} + +func emitError(err error) { + emitResp(&pluginpb.CodeGeneratorResponse{Error: proto.String(err.Error())}) +} + +func emitFiles(out []*descriptor.ResponseFile) { + files := make([]*pluginpb.CodeGeneratorResponse_File, len(out)) + for idx, item := range out { + files[idx] = item.CodeGeneratorResponse_File + } + resp := &pluginpb.CodeGeneratorResponse{File: files} + codegenerator.SetSupportedFeaturesOnCodeGeneratorResponse(resp) + emitResp(resp) +} + +func emitResp(resp *pluginpb.CodeGeneratorResponse) { + buf, err := proto.Marshal(resp) + if err != nil { + grpclog.Fatal(err) + } + if _, err := os.Stdout.Write(buf); err != nil { + grpclog.Fatal(err) + } +} diff --git a/protoc-gen-openapiv3/options/BUILD.bazel b/protoc-gen-openapiv3/options/BUILD.bazel new file mode 100644 index 00000000000..2d645e5fee7 --- /dev/null +++ b/protoc-gen-openapiv3/options/BUILD.bazel @@ -0,0 +1,45 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "options_proto_files", + srcs = [ + "annotations.proto", + "openapiv3.proto", + ], +) + +go_library( + name = "options", + embed = [":options_go_proto"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options", +) + +proto_library( + name = "options_proto", + srcs = [ + "annotations.proto", + "openapiv3.proto", + ], + deps = [ + "@com_google_protobuf//:any_proto", + "@com_google_protobuf//:descriptor_proto", + "@com_google_protobuf//:struct_proto", + ], +) + +go_proto_library( + name = "options_go_proto", + compilers = ["//:go_apiv2"], + importpath = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options", + proto = ":options_proto", +) + +alias( + name = "go_default_library", + actual = ":options", + visibility = ["//visibility:public"], +) diff --git a/protoc-gen-openapiv3/options/annotations.pb.go b/protoc-gen-openapiv3/options/annotations.pb.go new file mode 100644 index 00000000000..542c353eef8 --- /dev/null +++ b/protoc-gen-openapiv3/options/annotations.pb.go @@ -0,0 +1,272 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc (unknown) +// source: protoc-gen-openapiv3/options/annotations.proto + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + descriptorpb "google.golang.org/protobuf/types/descriptorpb" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var file_protoc_gen_openapiv3_options_annotations_proto_extTypes = []protoimpl.ExtensionInfo{ + { + ExtendedType: (*descriptorpb.FileOptions)(nil), + ExtensionType: (*OpenAPI)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_document", + Tag: "bytes,1043,opt,name=openapiv3_document", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MethodOptions)(nil), + ExtensionType: (*Operation)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_operation", + Tag: "bytes,1043,opt,name=openapiv3_operation", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.MessageOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_schema", + Tag: "bytes,1043,opt,name=openapiv3_schema", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.EnumOptions)(nil), + ExtensionType: (*Enum)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_enum", + Tag: "bytes,1043,opt,name=openapiv3_enum", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.ServiceOptions)(nil), + ExtensionType: (*Tag)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_tag", + Tag: "bytes,1043,opt,name=openapiv3_tag", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, + { + ExtendedType: (*descriptorpb.FieldOptions)(nil), + ExtensionType: (*Schema)(nil), + Field: 1043, + Name: "grpc.gateway.protoc_gen_openapiv3.options.openapiv3_field", + Tag: "bytes,1043,opt,name=openapiv3_field", + Filename: "protoc-gen-openapiv3/options/annotations.proto", + }, +} + +// Extension fields to descriptorpb.FileOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.OpenAPI openapiv3_document = 1043; + E_Openapiv3Document = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[0] +) + +// Extension fields to descriptorpb.MethodOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.Operation openapiv3_operation = 1043; + E_Openapiv3Operation = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[1] +) + +// Extension fields to descriptorpb.MessageOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.Schema openapiv3_schema = 1043; + E_Openapiv3Schema = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[2] +) + +// Extension fields to descriptorpb.EnumOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.Enum openapiv3_enum = 1043; + E_Openapiv3Enum = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[3] +) + +// Extension fields to descriptorpb.ServiceOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.Tag openapiv3_tag = 1043; + E_Openapiv3Tag = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[4] +) + +// Extension fields to descriptorpb.FieldOptions. +var ( + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + // + // optional grpc.gateway.protoc_gen_openapiv3.options.Schema openapiv3_field = 1043; + E_Openapiv3Field = &file_protoc_gen_openapiv3_options_annotations_proto_extTypes[5] +) + +var File_protoc_gen_openapiv3_options_annotations_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv3_options_annotations_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x29, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3a, 0x80, 0x01, 0x0a, 0x12, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x52, 0x11, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x86, + 0x01, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x5f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x7e, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x93, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x3a, 0x75, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6e, 0x75, 0x6d, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, + 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x45, 0x6e, 0x75, 0x6d, 0x3a, 0x75, + 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x5f, 0x74, 0x61, 0x67, 0x12, + 0x1f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x54, 0x61, 0x67, 0x3a, 0x7a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x93, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x42, 0x48, 0x5a, 0x46, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, + 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var file_protoc_gen_openapiv3_options_annotations_proto_goTypes = []any{ + (*descriptorpb.FileOptions)(nil), // 0: google.protobuf.FileOptions + (*descriptorpb.MethodOptions)(nil), // 1: google.protobuf.MethodOptions + (*descriptorpb.MessageOptions)(nil), // 2: google.protobuf.MessageOptions + (*descriptorpb.EnumOptions)(nil), // 3: google.protobuf.EnumOptions + (*descriptorpb.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions + (*descriptorpb.FieldOptions)(nil), // 5: google.protobuf.FieldOptions + (*OpenAPI)(nil), // 6: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI + (*Operation)(nil), // 7: grpc.gateway.protoc_gen_openapiv3.options.Operation + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv3.options.Schema + (*Enum)(nil), // 9: grpc.gateway.protoc_gen_openapiv3.options.Enum + (*Tag)(nil), // 10: grpc.gateway.protoc_gen_openapiv3.options.Tag +} +var file_protoc_gen_openapiv3_options_annotations_proto_depIdxs = []int32{ + 0, // 0: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_document:extendee -> google.protobuf.FileOptions + 1, // 1: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_operation:extendee -> google.protobuf.MethodOptions + 2, // 2: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_schema:extendee -> google.protobuf.MessageOptions + 3, // 3: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_enum:extendee -> google.protobuf.EnumOptions + 4, // 4: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_tag:extendee -> google.protobuf.ServiceOptions + 5, // 5: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_field:extendee -> google.protobuf.FieldOptions + 6, // 6: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_document:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OpenAPI + 7, // 7: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_operation:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 8, // 8: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 9, // 9: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_enum:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Enum + 10, // 10: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_tag:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Tag + 8, // 11: grpc.gateway.protoc_gen_openapiv3.options.openapiv3_field:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 6, // [6:12] is the sub-list for extension type_name + 0, // [0:6] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv3_options_annotations_proto_init() } +func file_protoc_gen_openapiv3_options_annotations_proto_init() { + if File_protoc_gen_openapiv3_options_annotations_proto != nil { + return + } + file_protoc_gen_openapiv3_options_openapiv3_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv3_options_annotations_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 6, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv3_options_annotations_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv3_options_annotations_proto_depIdxs, + ExtensionInfos: file_protoc_gen_openapiv3_options_annotations_proto_extTypes, + }.Build() + File_protoc_gen_openapiv3_options_annotations_proto = out.File + file_protoc_gen_openapiv3_options_annotations_proto_rawDesc = nil + file_protoc_gen_openapiv3_options_annotations_proto_goTypes = nil + file_protoc_gen_openapiv3_options_annotations_proto_depIdxs = nil +} diff --git a/protoc-gen-openapiv3/options/annotations.proto b/protoc-gen-openapiv3/options/annotations.proto new file mode 100644 index 00000000000..590d60ea9ed --- /dev/null +++ b/protoc-gen-openapiv3/options/annotations.proto @@ -0,0 +1,57 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv3.options; + +import "google/protobuf/descriptor.proto"; +import "protoc-gen-openapiv3/options/openapiv3.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options"; + +extend google.protobuf.FileOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + OpenAPI openapiv3_document = 1043; +} +extend google.protobuf.MethodOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + Operation openapiv3_operation = 1043; +} +extend google.protobuf.MessageOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + Schema openapiv3_schema = 1043; +} +extend google.protobuf.EnumOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + Enum openapiv3_enum = 1043; +} +extend google.protobuf.ServiceOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + Tag openapiv3_tag = 1043; +} +extend google.protobuf.FieldOptions { + // ID assigned by protobuf-global-extension-registry@google.com for + // gRPC-Gateway project. + // + // All IDs are the same, as assigned. It is okay that they are the same, as + // they extend different descriptor messages. + Schema openapiv3_field = 1043; +} diff --git a/protoc-gen-openapiv3/options/buf.gen.yaml b/protoc-gen-openapiv3/options/buf.gen.yaml new file mode 100644 index 00000000000..07dfb958f1e --- /dev/null +++ b/protoc-gen-openapiv3/options/buf.gen.yaml @@ -0,0 +1,7 @@ +version: v2 +plugins: + - remote: buf.build/protocolbuffers/go:v1.36.0 + out: . + opt: + - paths=source_relative + - default_api_level=API_HYBRID diff --git a/protoc-gen-openapiv3/options/openapiv3.pb.go b/protoc-gen-openapiv3/options/openapiv3.pb.go new file mode 100644 index 00000000000..1b89c5301e1 --- /dev/null +++ b/protoc-gen-openapiv3/options/openapiv3.pb.go @@ -0,0 +1,4384 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc (unknown) +// source: protoc-gen-openapiv3/options/openapiv3.proto + +package options + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + structpb "google.golang.org/protobuf/types/known/structpb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OpenAPI struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. This string MUST be the version number of the OpenAPI + // Specification that the OpenAPI Document uses. The openapi field SHOULD be + // used by tooling to interpret the OpenAPI Document. This is not related to + // the API info.version string. + Openapi string `protobuf:"bytes,1,opt,name=openapi,proto3" json:"openapi,omitempty"` + // REQUIRED. Provides metadata about the API. The metadata MAY be used by + // tooling as required. + Info *Info `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + // The default value for the $schema keyword within Schema Objects contained + // within this OAS document. This MUST be in the form of a URI. + JsonSchemaDialect string `protobuf:"bytes,3,opt,name=json_schema_dialect,json=jsonSchemaDialect,proto3" json:"json_schema_dialect,omitempty"` + // An array of Server Objects, which provide connectivity information to a + // target server. If the servers field is not provided, or is an empty array, + // the default value would be a Server Object with a url value of /. + Servers []*Server `protobuf:"bytes,4,rep,name=servers,proto3" json:"servers,omitempty"` + // An element to hold various schemas for the specification. + Components *Components `protobuf:"bytes,7,opt,name=components,proto3" json:"components,omitempty"` + // A declaration of which security mechanisms can be used across the API. + Security []*SecurityRequirement `protobuf:"bytes,8,rep,name=security,proto3" json:"security,omitempty"` + // A list of tags used by the specification with additional metadata. + Tags []*Tag `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty"` + // Additional external documentation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,10,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` +} + +func (x *OpenAPI) Reset() { + *x = OpenAPI{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OpenAPI) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OpenAPI) ProtoMessage() {} + +func (x *OpenAPI) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OpenAPI.ProtoReflect.Descriptor instead. +func (*OpenAPI) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{0} +} + +func (x *OpenAPI) GetOpenapi() string { + if x != nil { + return x.Openapi + } + return "" +} + +func (x *OpenAPI) GetInfo() *Info { + if x != nil { + return x.Info + } + return nil +} + +func (x *OpenAPI) GetJsonSchemaDialect() string { + if x != nil { + return x.JsonSchemaDialect + } + return "" +} + +func (x *OpenAPI) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *OpenAPI) GetComponents() *Components { + if x != nil { + return x.Components + } + return nil +} + +func (x *OpenAPI) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *OpenAPI) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *OpenAPI) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +type Info struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The title of the API. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // A short summary of the API. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A description of the API. CommonMark syntax MAY be used for rich text + // representation. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // A URI for the Terms of Service for the API. This MUST be in the form of a + // URI. + TermsOfService string `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService,proto3" json:"terms_of_service,omitempty"` + // The contact information for the exposed API. + Contact *Contact `protobuf:"bytes,5,opt,name=contact,proto3" json:"contact,omitempty"` + // The license information for the exposed API. + License *License `protobuf:"bytes,6,opt,name=license,proto3" json:"license,omitempty"` + // REQUIRED. The version of the OpenAPI Document. + Version string `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *Info) Reset() { + *x = Info{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Info) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Info) ProtoMessage() {} + +func (x *Info) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Info.ProtoReflect.Descriptor instead. +func (*Info) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{1} +} + +func (x *Info) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Info) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Info) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Info) GetTermsOfService() string { + if x != nil { + return x.TermsOfService + } + return "" +} + +func (x *Info) GetContact() *Contact { + if x != nil { + return x.Contact + } + return nil +} + +func (x *Info) GetLicense() *License { + if x != nil { + return x.License + } + return nil +} + +func (x *Info) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +// Contact information for the exposed API. +type Contact struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The identifying name of the contact person/organization. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URI for the contact information. This MUST be in the form of a URI. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` + // The email address of the contact person/organization. This MUST be in the + // form of an email address. + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` +} + +func (x *Contact) Reset() { + *x = Contact{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Contact) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Contact) ProtoMessage() {} + +func (x *Contact) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Contact.ProtoReflect.Descriptor instead. +func (*Contact) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{2} +} + +func (x *Contact) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Contact) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Contact) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +// License information for the exposed API. +type License struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The license name used for the API. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // An SPDX-Licenses expression for the API. The identifier field is mutually + // exclusive of the url field. + Identifier string `protobuf:"bytes,2,opt,name=identifier,proto3" json:"identifier,omitempty"` + // A URI for the license used for the API. This MUST be in the form of a URI. + // The url field is mutually exclusive of the identifier field. + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *License) Reset() { + *x = License{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *License) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*License) ProtoMessage() {} + +func (x *License) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use License.ProtoReflect.Descriptor instead. +func (*License) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{3} +} + +func (x *License) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *License) GetIdentifier() string { + if x != nil { + return x.Identifier + } + return "" +} + +func (x *License) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// An object representing a Server. +type Server struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. A URL to the target host. This URL supports Server Variables and + // MAY be relative, to indicate that the host location is relative to the + // location where the document containing the Server Object is being served. + // Variable substitutions will be made when a variable is named in {braces}. + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + // An optional string describing the host designated by the URL. + // CommonMark syntax MAY be used for rich text representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // A map between a variable name and its value. The value is used for + // substitution in the server's URL template. + Variables map[string]*ServerVariable `protobuf:"bytes,3,rep,name=variables,proto3" json:"variables,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Server) Reset() { + *x = Server{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Server) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Server) ProtoMessage() {} + +func (x *Server) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Server.ProtoReflect.Descriptor instead. +func (*Server) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{4} +} + +func (x *Server) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +func (x *Server) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Server) GetVariables() map[string]*ServerVariable { + if x != nil { + return x.Variables + } + return nil +} + +// An object representing a Server Variable for server URL template +// substitution. +type ServerVariable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // An enumeration of string values to be used if the substitution options are + // from a limited set. The array MUST NOT be empty. + Enum []string `protobuf:"bytes,1,rep,name=enum,proto3" json:"enum,omitempty"` + // REQUIRED. The default value to use for substitution, which SHALL be sent if + // an alternate value is not supplied. If the enum is defined, the value MUST + // exist in the enum's values. Note that this behavior is different from the + // Schema Object's default keyword, which documents the receiver's behavior + // rather than inserting the value into the data. + Default string `protobuf:"bytes,2,opt,name=default,proto3" json:"default,omitempty"` + // An optional description for the server variable. + // CommonMark syntax MAY be used for rich text representation. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *ServerVariable) Reset() { + *x = ServerVariable{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ServerVariable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerVariable) ProtoMessage() {} + +func (x *ServerVariable) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerVariable.ProtoReflect.Descriptor instead. +func (*ServerVariable) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{5} +} + +func (x *ServerVariable) GetEnum() []string { + if x != nil { + return x.Enum + } + return nil +} + +func (x *ServerVariable) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *ServerVariable) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// Holds a set of reusable objects for different aspects of the OAS. +type Components struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // An object to hold reusable Schema Objects. + Schemas map[string]*Schema `protobuf:"bytes,1,rep,name=schemas,proto3" json:"schemas,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Response Objects. + Responses map[string]*Response `protobuf:"bytes,2,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Parameter Objects. + Parameters map[string]*Parameter `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Example Objects. + Examples map[string]*Example `protobuf:"bytes,4,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Request Body Objects. + RequestBodies map[string]*RequestBody `protobuf:"bytes,5,rep,name=request_bodies,json=requestBodies,proto3" json:"request_bodies,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Header Objects. + Headers map[string]*Header `protobuf:"bytes,6,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Security Scheme Objects. + SecuritySchemes map[string]*SecurityScheme `protobuf:"bytes,7,rep,name=security_schemes,json=securitySchemes,proto3" json:"security_schemes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Link Objects. + Links map[string]*Link `protobuf:"bytes,8,rep,name=links,proto3" json:"links,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // An object to hold reusable Callback Objects. + Callbacks map[string]*Callback `protobuf:"bytes,9,rep,name=callbacks,proto3" json:"callbacks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Components) Reset() { + *x = Components{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Components) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Components) ProtoMessage() {} + +func (x *Components) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Components.ProtoReflect.Descriptor instead. +func (*Components) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{6} +} + +func (x *Components) GetSchemas() map[string]*Schema { + if x != nil { + return x.Schemas + } + return nil +} + +func (x *Components) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Components) GetParameters() map[string]*Parameter { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Components) GetExamples() map[string]*Example { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Components) GetRequestBodies() map[string]*RequestBody { + if x != nil { + return x.RequestBodies + } + return nil +} + +func (x *Components) GetHeaders() map[string]*Header { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Components) GetSecuritySchemes() map[string]*SecurityScheme { + if x != nil { + return x.SecuritySchemes + } + return nil +} + +func (x *Components) GetLinks() map[string]*Link { + if x != nil { + return x.Links + } + return nil +} + +func (x *Components) GetCallbacks() map[string]*Callback { + if x != nil { + return x.Callbacks + } + return nil +} + +// AdditionalPropertiesValue represents the value of the additionalProperties +// keyword which can be either a boolean or a JSON Schema +type AdditionalPropertiesValue struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Value: + // + // *AdditionalPropertiesValue_Boolean + // *AdditionalPropertiesValue_Schema + Value isAdditionalPropertiesValue_Value `protobuf_oneof:"value"` +} + +func (x *AdditionalPropertiesValue) Reset() { + *x = AdditionalPropertiesValue{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdditionalPropertiesValue) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdditionalPropertiesValue) ProtoMessage() {} + +func (x *AdditionalPropertiesValue) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AdditionalPropertiesValue.ProtoReflect.Descriptor instead. +func (*AdditionalPropertiesValue) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{7} +} + +func (m *AdditionalPropertiesValue) GetValue() isAdditionalPropertiesValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (x *AdditionalPropertiesValue) GetBoolean() bool { + if x, ok := x.GetValue().(*AdditionalPropertiesValue_Boolean); ok { + return x.Boolean + } + return false +} + +func (x *AdditionalPropertiesValue) GetSchema() *Schema { + if x, ok := x.GetValue().(*AdditionalPropertiesValue_Schema); ok { + return x.Schema + } + return nil +} + +type isAdditionalPropertiesValue_Value interface { + isAdditionalPropertiesValue_Value() +} + +type AdditionalPropertiesValue_Boolean struct { + Boolean bool `protobuf:"varint,1,opt,name=boolean,proto3,oneof"` +} + +type AdditionalPropertiesValue_Schema struct { + Schema *Schema `protobuf:"bytes,2,opt,name=schema,proto3,oneof"` +} + +func (*AdditionalPropertiesValue_Boolean) isAdditionalPropertiesValue_Value() {} + +func (*AdditionalPropertiesValue_Schema) isAdditionalPropertiesValue_Value() {} + +// Schema represents JSON Schema Draft 2020-12, which is used by OpenAPI 3.1 +// This implementation covers the core schema keywords from the specification +type Schema struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The schema's URI identifier (corresponds to $id in JSON Schema) + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Schema dialect, typically "https://json-schema.org/draft/2020-12/schema" + // (corresponds to $schema in JSON Schema) + Schema string `protobuf:"bytes,2,opt,name=schema,proto3" json:"schema,omitempty"` + // Schema title + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + // Schema description + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + // If "true", the instance validates successfully + // If "false", the instance fails to validate + // (corresponds to $const in JSON Schema) + Const *structpb.Value `protobuf:"bytes,5,opt,name=const,proto3" json:"const,omitempty"` + // The value of this keyword MUST be a string. This string SHOULD be a valid + // URI-reference, and this URI-reference SHOULD be a URI Template according to + // RFC 6570. If this keyword is absent, it can be considered present with an + // empty string value. + Format string `protobuf:"bytes,6,opt,name=format,proto3" json:"format,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MaxLength int32 `protobuf:"varint,7,opt,name=max_length,json=maxLength,proto3" json:"max_length,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MinLength int32 `protobuf:"varint,8,opt,name=min_length,json=minLength,proto3" json:"min_length,omitempty"` + // The value of this keyword MUST be a string. This string SHOULD be a valid + // regular expression, according to the ECMA-262 regular expression dialect. + Pattern string `protobuf:"bytes,9,opt,name=pattern,proto3" json:"pattern,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MaxItems int32 `protobuf:"varint,10,opt,name=max_items,json=maxItems,proto3" json:"max_items,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MinItems int32 `protobuf:"varint,11,opt,name=min_items,json=minItems,proto3" json:"min_items,omitempty"` + // The value of this keyword MUST be a boolean. + UniqueItems bool `protobuf:"varint,12,opt,name=unique_items,json=uniqueItems,proto3" json:"unique_items,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MaxProperties int32 `protobuf:"varint,13,opt,name=max_properties,json=maxProperties,proto3" json:"max_properties,omitempty"` + // The value of this keyword MUST be a non-negative integer. + MinProperties int32 `protobuf:"varint,14,opt,name=min_properties,json=minProperties,proto3" json:"min_properties,omitempty"` + // The value of this keyword MUST be an array. Elements of this array, if any, + // MUST be strings, and MUST be unique. + Required []string `protobuf:"bytes,15,rep,name=required,proto3" json:"required,omitempty"` + // The value of this keyword MUST be a number, representing an inclusive upper + // limit for a numeric instance. + Maximum float64 `protobuf:"fixed64,16,opt,name=maximum,proto3" json:"maximum,omitempty"` + // The value of this keyword MUST be a number, representing an exclusive upper + // limit for a numeric instance. + ExclusiveMaximum float64 `protobuf:"fixed64,17,opt,name=exclusive_maximum,json=exclusiveMaximum,proto3" json:"exclusive_maximum,omitempty"` + // The value of this keyword MUST be a number, representing an inclusive lower + // limit for a numeric instance. + Minimum float64 `protobuf:"fixed64,18,opt,name=minimum,proto3" json:"minimum,omitempty"` + // The value of this keyword MUST be a number, representing an exclusive lower + // limit for a numeric instance. + ExclusiveMinimum float64 `protobuf:"fixed64,19,opt,name=exclusive_minimum,json=exclusiveMinimum,proto3" json:"exclusive_minimum,omitempty"` + // The value of this keyword MUST be a number. A numeric instance is valid + // only if division by this keyword's value results in an integer. + MultipleOf int32 `protobuf:"varint,20,opt,name=multiple_of,json=multipleOf,proto3" json:"multiple_of,omitempty"` + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + AllOf []*Schema `protobuf:"bytes,21,rep,name=all_of,json=allOf,proto3" json:"all_of,omitempty"` + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + AnyOf []*Schema `protobuf:"bytes,22,rep,name=any_of,json=anyOf,proto3" json:"any_of,omitempty"` + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + OneOf []*Schema `protobuf:"bytes,23,rep,name=one_of,json=oneOf,proto3" json:"one_of,omitempty"` + // The value of this keyword MUST be a valid JSON Schema. + Not *Schema `protobuf:"bytes,24,opt,name=not,proto3" json:"not,omitempty"` + // The value of this keyword MUST be a valid JSON Schema. + Items *Schema `protobuf:"bytes,25,opt,name=items,proto3" json:"items,omitempty"` + // The value of this keyword MUST be an object. Each value of this object MUST + // be a valid JSON Schema. + Properties map[string]*Schema `protobuf:"bytes,26,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // The value of this keyword MUST be either a boolean or a valid JSON Schema. + // If it's a boolean: false means no additional properties are allowed, + // true means any additional properties are allowed. + // If it's a schema: additional properties must validate against this schema. + AdditionalProperties *AdditionalPropertiesValue `protobuf:"bytes,27,opt,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty"` + // The value of this keyword MUST be an array. Each item of the array MUST be + // a string, and MUST be unique. + Enum []string `protobuf:"bytes,28,rep,name=enum,proto3" json:"enum,omitempty"` + // The value of this keyword MAY be of any type, including null. + Default *structpb.Value `protobuf:"bytes,29,opt,name=default,proto3" json:"default,omitempty"` + // The value of this keyword MUST be an array. There are no restrictions + // placed on the values within the array. + Examples []*structpb.Value `protobuf:"bytes,30,rep,name=examples,proto3" json:"examples,omitempty"` + // The value of this keyword MUST be a string. String values MUST be one of + // the seven primitive types defined by the core specification. + Type string `protobuf:"bytes,31,opt,name=type,proto3" json:"type,omitempty"` + // DEPRECATED: Use $defs instead. This keyword's value MUST be a valid JSON + // Schema. + Definitions map[string]*Schema `protobuf:"bytes,32,rep,name=definitions,proto3" json:"definitions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Reference to another schema (corresponds to $ref in JSON Schema) + Ref string `protobuf:"bytes,33,opt,name=ref,proto3" json:"ref,omitempty"` + // The modern replacement for definitions (corresponds to $defs in JSON + // Schema) + Defs map[string]*Schema `protobuf:"bytes,34,rep,name=defs,proto3" json:"defs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // For tuple validation - an array of schemas for validating positional items + PrefixItems []*Schema `protobuf:"bytes,35,rep,name=prefix_items,json=prefixItems,proto3" json:"prefix_items,omitempty"` + // A schema which must validate against at least one array item + Contains *Schema `protobuf:"bytes,36,opt,name=contains,proto3" json:"contains,omitempty"` + // Minimum number of items that must match the "contains" schema + MinContains int32 `protobuf:"varint,37,opt,name=min_contains,json=minContains,proto3" json:"min_contains,omitempty"` + // Maximum number of items that must match the "contains" schema + MaxContains int32 `protobuf:"varint,38,opt,name=max_contains,json=maxContains,proto3" json:"max_contains,omitempty"` + // Schema for validating all property names of an object + PropertyNames *Schema `protobuf:"bytes,39,opt,name=property_names,json=propertyNames,proto3" json:"property_names,omitempty"` + // Map of regex patterns to schemas for validating matching properties + PatternProperties map[string]*Schema `protobuf:"bytes,40,rep,name=pattern_properties,json=patternProperties,proto3" json:"pattern_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Schemas that must validate when a specified property is present + DependentSchemas map[string]*Schema `protobuf:"bytes,42,rep,name=dependent_schemas,json=dependentSchemas,proto3" json:"dependent_schemas,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Conditional validation - schema to test + IfSchema *Schema `protobuf:"bytes,43,opt,name=if_schema,json=ifSchema,proto3" json:"if_schema,omitempty"` + // Schema to use when if_schema validates successfully + ThenSchema *Schema `protobuf:"bytes,44,opt,name=then_schema,json=thenSchema,proto3" json:"then_schema,omitempty"` + // Schema to use when if_schema fails to validate + ElseSchema *Schema `protobuf:"bytes,45,opt,name=else_schema,json=elseSchema,proto3" json:"else_schema,omitempty"` + // Controls validation of properties not explicitly evaluated by properties or + // patternProperties + UnevaluatedProperties *AdditionalPropertiesValue `protobuf:"bytes,46,opt,name=unevaluated_properties,json=unevaluatedProperties,proto3" json:"unevaluated_properties,omitempty"` + // Controls validation of items not explicitly evaluated by items or + // prefixItems + UnevaluatedItems *AdditionalPropertiesValue `protobuf:"bytes,47,opt,name=unevaluated_items,json=unevaluatedItems,proto3" json:"unevaluated_items,omitempty"` + // Content encoding (e.g., "base64") + ContentEncoding string `protobuf:"bytes,48,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + // Content media type (e.g., "application/json") + ContentMediaType string `protobuf:"bytes,49,opt,name=content_media_type,json=contentMediaType,proto3" json:"content_media_type,omitempty"` + // Schema for validating the decoded, parsed content + ContentSchema *Schema `protobuf:"bytes,50,opt,name=content_schema,json=contentSchema,proto3" json:"content_schema,omitempty"` + // Indicates a property that can only be returned, not sent by the client + ReadOnly bool `protobuf:"varint,51,opt,name=read_only,json=readOnly,proto3" json:"read_only,omitempty"` + // Indicates a property that can only be sent, not returned by the server + WriteOnly bool `protobuf:"varint,52,opt,name=write_only,json=writeOnly,proto3" json:"write_only,omitempty"` + // Indicates a property is deprecated and should be avoided + Deprecated bool `protobuf:"varint,53,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // Annotation to provide additional information + Comment string `protobuf:"bytes,54,opt,name=comment,proto3" json:"comment,omitempty"` +} + +func (x *Schema) Reset() { + *x = Schema{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Schema) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Schema) ProtoMessage() {} + +func (x *Schema) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Schema.ProtoReflect.Descriptor instead. +func (*Schema) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{8} +} + +func (x *Schema) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Schema) GetSchema() string { + if x != nil { + return x.Schema + } + return "" +} + +func (x *Schema) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Schema) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Schema) GetConst() *structpb.Value { + if x != nil { + return x.Const + } + return nil +} + +func (x *Schema) GetFormat() string { + if x != nil { + return x.Format + } + return "" +} + +func (x *Schema) GetMaxLength() int32 { + if x != nil { + return x.MaxLength + } + return 0 +} + +func (x *Schema) GetMinLength() int32 { + if x != nil { + return x.MinLength + } + return 0 +} + +func (x *Schema) GetPattern() string { + if x != nil { + return x.Pattern + } + return "" +} + +func (x *Schema) GetMaxItems() int32 { + if x != nil { + return x.MaxItems + } + return 0 +} + +func (x *Schema) GetMinItems() int32 { + if x != nil { + return x.MinItems + } + return 0 +} + +func (x *Schema) GetUniqueItems() bool { + if x != nil { + return x.UniqueItems + } + return false +} + +func (x *Schema) GetMaxProperties() int32 { + if x != nil { + return x.MaxProperties + } + return 0 +} + +func (x *Schema) GetMinProperties() int32 { + if x != nil { + return x.MinProperties + } + return 0 +} + +func (x *Schema) GetRequired() []string { + if x != nil { + return x.Required + } + return nil +} + +func (x *Schema) GetMaximum() float64 { + if x != nil { + return x.Maximum + } + return 0 +} + +func (x *Schema) GetExclusiveMaximum() float64 { + if x != nil { + return x.ExclusiveMaximum + } + return 0 +} + +func (x *Schema) GetMinimum() float64 { + if x != nil { + return x.Minimum + } + return 0 +} + +func (x *Schema) GetExclusiveMinimum() float64 { + if x != nil { + return x.ExclusiveMinimum + } + return 0 +} + +func (x *Schema) GetMultipleOf() int32 { + if x != nil { + return x.MultipleOf + } + return 0 +} + +func (x *Schema) GetAllOf() []*Schema { + if x != nil { + return x.AllOf + } + return nil +} + +func (x *Schema) GetAnyOf() []*Schema { + if x != nil { + return x.AnyOf + } + return nil +} + +func (x *Schema) GetOneOf() []*Schema { + if x != nil { + return x.OneOf + } + return nil +} + +func (x *Schema) GetNot() *Schema { + if x != nil { + return x.Not + } + return nil +} + +func (x *Schema) GetItems() *Schema { + if x != nil { + return x.Items + } + return nil +} + +func (x *Schema) GetProperties() map[string]*Schema { + if x != nil { + return x.Properties + } + return nil +} + +func (x *Schema) GetAdditionalProperties() *AdditionalPropertiesValue { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +func (x *Schema) GetEnum() []string { + if x != nil { + return x.Enum + } + return nil +} + +func (x *Schema) GetDefault() *structpb.Value { + if x != nil { + return x.Default + } + return nil +} + +func (x *Schema) GetExamples() []*structpb.Value { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Schema) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *Schema) GetDefinitions() map[string]*Schema { + if x != nil { + return x.Definitions + } + return nil +} + +func (x *Schema) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *Schema) GetDefs() map[string]*Schema { + if x != nil { + return x.Defs + } + return nil +} + +func (x *Schema) GetPrefixItems() []*Schema { + if x != nil { + return x.PrefixItems + } + return nil +} + +func (x *Schema) GetContains() *Schema { + if x != nil { + return x.Contains + } + return nil +} + +func (x *Schema) GetMinContains() int32 { + if x != nil { + return x.MinContains + } + return 0 +} + +func (x *Schema) GetMaxContains() int32 { + if x != nil { + return x.MaxContains + } + return 0 +} + +func (x *Schema) GetPropertyNames() *Schema { + if x != nil { + return x.PropertyNames + } + return nil +} + +func (x *Schema) GetPatternProperties() map[string]*Schema { + if x != nil { + return x.PatternProperties + } + return nil +} + +func (x *Schema) GetDependentSchemas() map[string]*Schema { + if x != nil { + return x.DependentSchemas + } + return nil +} + +func (x *Schema) GetIfSchema() *Schema { + if x != nil { + return x.IfSchema + } + return nil +} + +func (x *Schema) GetThenSchema() *Schema { + if x != nil { + return x.ThenSchema + } + return nil +} + +func (x *Schema) GetElseSchema() *Schema { + if x != nil { + return x.ElseSchema + } + return nil +} + +func (x *Schema) GetUnevaluatedProperties() *AdditionalPropertiesValue { + if x != nil { + return x.UnevaluatedProperties + } + return nil +} + +func (x *Schema) GetUnevaluatedItems() *AdditionalPropertiesValue { + if x != nil { + return x.UnevaluatedItems + } + return nil +} + +func (x *Schema) GetContentEncoding() string { + if x != nil { + return x.ContentEncoding + } + return "" +} + +func (x *Schema) GetContentMediaType() string { + if x != nil { + return x.ContentMediaType + } + return "" +} + +func (x *Schema) GetContentSchema() *Schema { + if x != nil { + return x.ContentSchema + } + return nil +} + +func (x *Schema) GetReadOnly() bool { + if x != nil { + return x.ReadOnly + } + return false +} + +func (x *Schema) GetWriteOnly() bool { + if x != nil { + return x.WriteOnly + } + return false +} + +func (x *Schema) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Schema) GetComment() string { + if x != nil { + return x.Comment + } + return "" +} + +// Describes a single response from an API Operation, including design-time, +// static links to operations based on the response. +type Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. A description of the response. + // CommonMark syntax MAY be used for rich text representation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // Maps a header name to its definition. + // RFC7230 states header names are case insensitive. + Headers map[string]*Header `protobuf:"bytes,2,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A map containing descriptions of potential response payloads. + // The key is a media type or media type range and the value describes it. + Content map[string]*MediaType `protobuf:"bytes,3,rep,name=content,proto3" json:"content,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A map of operations links that can be followed from the response. + Links map[string]*Link `protobuf:"bytes,4,rep,name=links,proto3" json:"links,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Response) Reset() { + *x = Response{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Response) ProtoMessage() {} + +func (x *Response) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Response.ProtoReflect.Descriptor instead. +func (*Response) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{9} +} + +func (x *Response) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Response) GetHeaders() map[string]*Header { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Response) GetContent() map[string]*MediaType { + if x != nil { + return x.Content + } + return nil +} + +func (x *Response) GetLinks() map[string]*Link { + if x != nil { + return x.Links + } + return nil +} + +// The Header Object follows the structure of the Parameter Object. +type Header struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A brief description of the header. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // Determines whether this header is mandatory. + Required bool `protobuf:"varint,2,opt,name=required,proto3" json:"required,omitempty"` + // Specifies that a header is deprecated and SHOULD be transitioned out of + // usage. + Deprecated bool `protobuf:"varint,3,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // Schema defining the type used for the header. + Schema *Schema `protobuf:"bytes,4,opt,name=schema,proto3" json:"schema,omitempty"` +} + +func (x *Header) Reset() { + *x = Header{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Header) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Header) ProtoMessage() {} + +func (x *Header) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Header.ProtoReflect.Descriptor instead. +func (*Header) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{10} +} + +func (x *Header) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Header) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *Header) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Header) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +// Each Media Type Object provides schema and examples for the media type +// identified by its key. +type MediaType struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The schema defining the content of the request, response, or parameter. + Schema *Schema `protobuf:"bytes,1,opt,name=schema,proto3" json:"schema,omitempty"` + // Example of the media type. + Example *anypb.Any `protobuf:"bytes,2,opt,name=example,proto3" json:"example,omitempty"` + // Examples of the media type. + Examples map[string]*Example `protobuf:"bytes,3,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A map between a property name and its encoding information. + Encoding map[string]*Encoding `protobuf:"bytes,4,rep,name=encoding,proto3" json:"encoding,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *MediaType) Reset() { + *x = MediaType{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MediaType) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MediaType) ProtoMessage() {} + +func (x *MediaType) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MediaType.ProtoReflect.Descriptor instead. +func (*MediaType) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{11} +} + +func (x *MediaType) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +func (x *MediaType) GetExample() *anypb.Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *MediaType) GetExamples() map[string]*Example { + if x != nil { + return x.Examples + } + return nil +} + +func (x *MediaType) GetEncoding() map[string]*Encoding { + if x != nil { + return x.Encoding + } + return nil +} + +// A single encoding definition applied to a single schema property. +type Encoding struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The Content-Type for encoding a specific property. + ContentType string `protobuf:"bytes,1,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + // A map allowing additional information to be provided as headers. + Headers map[string]*Header `protobuf:"bytes,2,rep,name=headers,proto3" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Describes how a specific property value will be serialized. + Style string `protobuf:"bytes,3,opt,name=style,proto3" json:"style,omitempty"` + // When this is true, property values of type array or object generate + // separate parameters for each value of the array, or key-value-pair of the + // map. + Explode bool `protobuf:"varint,4,opt,name=explode,proto3" json:"explode,omitempty"` + // Determines whether the parameter value SHOULD allow reserved characters to + // be included without percent-encoding. + AllowReserved bool `protobuf:"varint,5,opt,name=allow_reserved,json=allowReserved,proto3" json:"allow_reserved,omitempty"` +} + +func (x *Encoding) Reset() { + *x = Encoding{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Encoding) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Encoding) ProtoMessage() {} + +func (x *Encoding) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Encoding.ProtoReflect.Descriptor instead. +func (*Encoding) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{12} +} + +func (x *Encoding) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *Encoding) GetHeaders() map[string]*Header { + if x != nil { + return x.Headers + } + return nil +} + +func (x *Encoding) GetStyle() string { + if x != nil { + return x.Style + } + return "" +} + +func (x *Encoding) GetExplode() bool { + if x != nil { + return x.Explode + } + return false +} + +func (x *Encoding) GetAllowReserved() bool { + if x != nil { + return x.AllowReserved + } + return false +} + +// Example Object +type Example struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Short description for the example. + Summary string `protobuf:"bytes,1,opt,name=summary,proto3" json:"summary,omitempty"` + // Long description for the example. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // Embedded literal example. + Value *anypb.Any `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + // A URL that points to the literal example. + ExternalValue string `protobuf:"bytes,4,opt,name=external_value,json=externalValue,proto3" json:"external_value,omitempty"` +} + +func (x *Example) Reset() { + *x = Example{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Example) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Example) ProtoMessage() {} + +func (x *Example) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Example.ProtoReflect.Descriptor instead. +func (*Example) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{13} +} + +func (x *Example) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Example) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Example) GetValue() *anypb.Any { + if x != nil { + return x.Value + } + return nil +} + +func (x *Example) GetExternalValue() string { + if x != nil { + return x.ExternalValue + } + return "" +} + +// The Link object represents a possible design-time link for a response. +type Link struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A relative or absolute URI reference to an OAS operation. + OperationRef string `protobuf:"bytes,1,opt,name=operation_ref,json=operationRef,proto3" json:"operation_ref,omitempty"` + // The name of an existing, resolvable OAS operation, as defined with a unique + // operationId. + OperationId string `protobuf:"bytes,2,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + // A map representing parameters to pass to an operation as specified with + // operationId or identified via operationRef. + Parameters map[string]*anypb.Any `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A literal value or {expression} to use as a request body when calling the + // target operation. + RequestBody *anypb.Any `protobuf:"bytes,4,opt,name=request_body,json=requestBody,proto3" json:"request_body,omitempty"` + // A description of the link. + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + // A server object to be used by the target operation. + Server *Server `protobuf:"bytes,6,opt,name=server,proto3" json:"server,omitempty"` +} + +func (x *Link) Reset() { + *x = Link{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Link) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Link) ProtoMessage() {} + +func (x *Link) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Link.ProtoReflect.Descriptor instead. +func (*Link) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{14} +} + +func (x *Link) GetOperationRef() string { + if x != nil { + return x.OperationRef + } + return "" +} + +func (x *Link) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Link) GetParameters() map[string]*anypb.Any { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Link) GetRequestBody() *anypb.Any { + if x != nil { + return x.RequestBody + } + return nil +} + +func (x *Link) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Link) GetServer() *Server { + if x != nil { + return x.Server + } + return nil +} + +// Describes a single API operation on a path. +type Operation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A list of tags for API documentation control. + Tags []string `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"` + // A short summary of what the operation does. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A verbose explanation of the operation behavior. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this operation. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Unique string used to identify the operation. + OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId,proto3" json:"operation_id,omitempty"` + // A list of parameters that are applicable for this operation. + Parameters []*Parameter `protobuf:"bytes,6,rep,name=parameters,proto3" json:"parameters,omitempty"` + // The request body applicable for this operation. + RequestBody *RequestBody `protobuf:"bytes,7,opt,name=request_body,json=requestBody,proto3" json:"request_body,omitempty"` + // The list of possible responses as they are returned from executing this + // operation. + Responses map[string]*Response `protobuf:"bytes,8,rep,name=responses,proto3" json:"responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A map of possible out-of band callbacks related to the parent operation. + Callbacks map[string]*Callback `protobuf:"bytes,9,rep,name=callbacks,proto3" json:"callbacks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Declares this operation to be deprecated. + Deprecated bool `protobuf:"varint,10,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // A declaration of which security mechanisms can be used for this operation. + Security []*SecurityRequirement `protobuf:"bytes,11,rep,name=security,proto3" json:"security,omitempty"` + // An alternative server array to service this operation. + Servers []*Server `protobuf:"bytes,12,rep,name=servers,proto3" json:"servers,omitempty"` +} + +func (x *Operation) Reset() { + *x = Operation{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Operation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Operation) ProtoMessage() {} + +func (x *Operation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Operation.ProtoReflect.Descriptor instead. +func (*Operation) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{15} +} + +func (x *Operation) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Operation) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Operation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Operation) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Operation) GetOperationId() string { + if x != nil { + return x.OperationId + } + return "" +} + +func (x *Operation) GetParameters() []*Parameter { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *Operation) GetRequestBody() *RequestBody { + if x != nil { + return x.RequestBody + } + return nil +} + +func (x *Operation) GetResponses() map[string]*Response { + if x != nil { + return x.Responses + } + return nil +} + +func (x *Operation) GetCallbacks() map[string]*Callback { + if x != nil { + return x.Callbacks + } + return nil +} + +func (x *Operation) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Operation) GetSecurity() []*SecurityRequirement { + if x != nil { + return x.Security + } + return nil +} + +func (x *Operation) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +// Allows referencing an external resource for extended documentation. +type ExternalDocumentation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A description of the target documentation. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // REQUIRED. The URL for the target documentation. + Url string `protobuf:"bytes,2,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *ExternalDocumentation) Reset() { + *x = ExternalDocumentation{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalDocumentation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalDocumentation) ProtoMessage() {} + +func (x *ExternalDocumentation) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalDocumentation.ProtoReflect.Descriptor instead. +func (*ExternalDocumentation) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{16} +} + +func (x *ExternalDocumentation) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *ExternalDocumentation) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +// Describes a single operation parameter. +type Parameter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The name of the parameter. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // REQUIRED. The location of the parameter. + In string `protobuf:"bytes,2,opt,name=in,proto3" json:"in,omitempty"` + // A brief description of the parameter. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // Determines whether this parameter is mandatory. + Required bool `protobuf:"varint,4,opt,name=required,proto3" json:"required,omitempty"` + // Specifies that a parameter is deprecated. + Deprecated bool `protobuf:"varint,5,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // Sets the ability to pass empty-valued parameters. + AllowEmptyValue bool `protobuf:"varint,6,opt,name=allow_empty_value,json=allowEmptyValue,proto3" json:"allow_empty_value,omitempty"` + // Describes how the parameter value will be serialized. + Style string `protobuf:"bytes,7,opt,name=style,proto3" json:"style,omitempty"` + // When this is true, parameter values of type array or object generate + // separate parameters for each value of the array or key-value pair of the + // map. + Explode bool `protobuf:"varint,8,opt,name=explode,proto3" json:"explode,omitempty"` + // Determines whether the parameter value SHOULD allow reserved characters to + // be included without percent-encoding. + AllowReserved bool `protobuf:"varint,9,opt,name=allow_reserved,json=allowReserved,proto3" json:"allow_reserved,omitempty"` + // The schema defining the type used for the parameter. + Schema *Schema `protobuf:"bytes,10,opt,name=schema,proto3" json:"schema,omitempty"` + // Example of the parameter's potential value. + Example *anypb.Any `protobuf:"bytes,11,opt,name=example,proto3" json:"example,omitempty"` + // Examples of the parameter's potential value. + Examples map[string]*Example `protobuf:"bytes,12,rep,name=examples,proto3" json:"examples,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // A map containing the representations for the parameter. + Content map[string]*MediaType `protobuf:"bytes,13,rep,name=content,proto3" json:"content,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Parameter) Reset() { + *x = Parameter{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Parameter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Parameter) ProtoMessage() {} + +func (x *Parameter) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Parameter.ProtoReflect.Descriptor instead. +func (*Parameter) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{17} +} + +func (x *Parameter) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Parameter) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *Parameter) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Parameter) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +func (x *Parameter) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Parameter) GetAllowEmptyValue() bool { + if x != nil { + return x.AllowEmptyValue + } + return false +} + +func (x *Parameter) GetStyle() string { + if x != nil { + return x.Style + } + return "" +} + +func (x *Parameter) GetExplode() bool { + if x != nil { + return x.Explode + } + return false +} + +func (x *Parameter) GetAllowReserved() bool { + if x != nil { + return x.AllowReserved + } + return false +} + +func (x *Parameter) GetSchema() *Schema { + if x != nil { + return x.Schema + } + return nil +} + +func (x *Parameter) GetExample() *anypb.Any { + if x != nil { + return x.Example + } + return nil +} + +func (x *Parameter) GetExamples() map[string]*Example { + if x != nil { + return x.Examples + } + return nil +} + +func (x *Parameter) GetContent() map[string]*MediaType { + if x != nil { + return x.Content + } + return nil +} + +// Describes a single request body. +type RequestBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A brief description of the request body. + Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"` + // REQUIRED. The content of the request body. + Content map[string]*MediaType `protobuf:"bytes,2,rep,name=content,proto3" json:"content,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Determines if the request body is required in the request. + Required bool `protobuf:"varint,3,opt,name=required,proto3" json:"required,omitempty"` +} + +func (x *RequestBody) Reset() { + *x = RequestBody{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestBody) ProtoMessage() {} + +func (x *RequestBody) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestBody.ProtoReflect.Descriptor instead. +func (*RequestBody) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{18} +} + +func (x *RequestBody) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *RequestBody) GetContent() map[string]*MediaType { + if x != nil { + return x.Content + } + return nil +} + +func (x *RequestBody) GetRequired() bool { + if x != nil { + return x.Required + } + return false +} + +// A map of possible out-of band callbacks related to the parent operation. +type Callback struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A Path Item Object used to define a callback operation. + Expression map[string]*PathItem `protobuf:"bytes,1,rep,name=expression,proto3" json:"expression,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Callback) Reset() { + *x = Callback{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Callback) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Callback) ProtoMessage() {} + +func (x *Callback) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Callback.ProtoReflect.Descriptor instead. +func (*Callback) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{19} +} + +func (x *Callback) GetExpression() map[string]*PathItem { + if x != nil { + return x.Expression + } + return nil +} + +// Lists the required security schemes to execute this operation. +type SecurityRequirement struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Each name must correspond to a security scheme which is declared in the + // Security Schemes under the Components Object. + AdditionalProperties map[string]*SecurityScopes `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties,proto3" json:"additional_properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *SecurityRequirement) Reset() { + *x = SecurityRequirement{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityRequirement) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityRequirement) ProtoMessage() {} + +func (x *SecurityRequirement) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[20] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityRequirement.ProtoReflect.Descriptor instead. +func (*SecurityRequirement) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{20} +} + +func (x *SecurityRequirement) GetAdditionalProperties() map[string]*SecurityScopes { + if x != nil { + return x.AdditionalProperties + } + return nil +} + +// A list of scopes required for a security scheme in SecurityRequirement. +type SecurityScopes struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The list of scope names required for this security scheme. + Scopes []string `protobuf:"bytes,1,rep,name=scopes,proto3" json:"scopes,omitempty"` +} + +func (x *SecurityScopes) Reset() { + *x = SecurityScopes{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScopes) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScopes) ProtoMessage() {} + +func (x *SecurityScopes) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityScopes.ProtoReflect.Descriptor instead. +func (*SecurityScopes) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{21} +} + +func (x *SecurityScopes) GetScopes() []string { + if x != nil { + return x.Scopes + } + return nil +} + +// Describes the operations available on a single path. +type PathItem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Allows for an external definition of this path item. + Ref string `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"` + // An optional, string summary, intended to apply to all operations in this + // path. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // An optional, string description, intended to apply to all operations in + // this path. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + // A definition of a GET operation on this path. + Get *Operation `protobuf:"bytes,4,opt,name=get,proto3" json:"get,omitempty"` + // A definition of a PUT operation on this path. + Put *Operation `protobuf:"bytes,5,opt,name=put,proto3" json:"put,omitempty"` + // A definition of a POST operation on this path. + Post *Operation `protobuf:"bytes,6,opt,name=post,proto3" json:"post,omitempty"` + // A definition of a DELETE operation on this path. + Delete *Operation `protobuf:"bytes,7,opt,name=delete,proto3" json:"delete,omitempty"` + // A definition of a OPTIONS operation on this path. + Options *Operation `protobuf:"bytes,8,opt,name=options,proto3" json:"options,omitempty"` + // A definition of a HEAD operation on this path. + Head *Operation `protobuf:"bytes,9,opt,name=head,proto3" json:"head,omitempty"` + // A definition of a PATCH operation on this path. + Patch *Operation `protobuf:"bytes,10,opt,name=patch,proto3" json:"patch,omitempty"` + // A definition of a TRACE operation on this path. + Trace *Operation `protobuf:"bytes,11,opt,name=trace,proto3" json:"trace,omitempty"` + // An alternative server array to service all operations in this path. + Servers []*Server `protobuf:"bytes,12,rep,name=servers,proto3" json:"servers,omitempty"` + // A list of parameters that are applicable for all the operations described + // under this path. + Parameters []*Parameter `protobuf:"bytes,13,rep,name=parameters,proto3" json:"parameters,omitempty"` +} + +func (x *PathItem) Reset() { + *x = PathItem{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PathItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PathItem) ProtoMessage() {} + +func (x *PathItem) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PathItem.ProtoReflect.Descriptor instead. +func (*PathItem) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{22} +} + +func (x *PathItem) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *PathItem) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *PathItem) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *PathItem) GetGet() *Operation { + if x != nil { + return x.Get + } + return nil +} + +func (x *PathItem) GetPut() *Operation { + if x != nil { + return x.Put + } + return nil +} + +func (x *PathItem) GetPost() *Operation { + if x != nil { + return x.Post + } + return nil +} + +func (x *PathItem) GetDelete() *Operation { + if x != nil { + return x.Delete + } + return nil +} + +func (x *PathItem) GetOptions() *Operation { + if x != nil { + return x.Options + } + return nil +} + +func (x *PathItem) GetHead() *Operation { + if x != nil { + return x.Head + } + return nil +} + +func (x *PathItem) GetPatch() *Operation { + if x != nil { + return x.Patch + } + return nil +} + +func (x *PathItem) GetTrace() *Operation { + if x != nil { + return x.Trace + } + return nil +} + +func (x *PathItem) GetServers() []*Server { + if x != nil { + return x.Servers + } + return nil +} + +func (x *PathItem) GetParameters() []*Parameter { + if x != nil { + return x.Parameters + } + return nil +} + +// Holds the relative paths to the individual endpoints and their operations. +type Paths struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A relative path to an individual endpoint. + Path map[string]*PathItem `protobuf:"bytes,1,rep,name=path,proto3" json:"path,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Paths) Reset() { + *x = Paths{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Paths) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Paths) ProtoMessage() {} + +func (x *Paths) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Paths.ProtoReflect.Descriptor instead. +func (*Paths) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{23} +} + +func (x *Paths) GetPath() map[string]*PathItem { + if x != nil { + return x.Path + } + return nil +} + +// When request bodies or response payloads may be one of a number of different +// schemas, a discriminator object can be used to aid in serialization, +// deserialization, and validation. +type Discriminator struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The name of the property in the payload that will hold the + // discriminator value. + PropertyName string `protobuf:"bytes,1,opt,name=property_name,json=propertyName,proto3" json:"property_name,omitempty"` + // An object to hold mappings between payload values and schema names or + // references. + Mapping map[string]string `protobuf:"bytes,2,rep,name=mapping,proto3" json:"mapping,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Discriminator) Reset() { + *x = Discriminator{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Discriminator) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Discriminator) ProtoMessage() {} + +func (x *Discriminator) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[24] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Discriminator.ProtoReflect.Descriptor instead. +func (*Discriminator) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{24} +} + +func (x *Discriminator) GetPropertyName() string { + if x != nil { + return x.PropertyName + } + return "" +} + +func (x *Discriminator) GetMapping() map[string]string { + if x != nil { + return x.Mapping + } + return nil +} + +// A metadata object that allows for more fine-tuned XML model definitions. +type Xml struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Replaces the name of the element/attribute used for the described schema + // property. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The URI of the namespace definition. + Namespace string `protobuf:"bytes,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + // The prefix to be used for the name. + Prefix string `protobuf:"bytes,3,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Declares whether the property definition translates to an attribute instead + // of an element. + Attribute bool `protobuf:"varint,4,opt,name=attribute,proto3" json:"attribute,omitempty"` + // MAY be used only for an array definition. Signifies whether the array is + // wrapped. + Wrapped bool `protobuf:"varint,5,opt,name=wrapped,proto3" json:"wrapped,omitempty"` +} + +func (x *Xml) Reset() { + *x = Xml{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Xml) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Xml) ProtoMessage() {} + +func (x *Xml) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[25] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Xml.ProtoReflect.Descriptor instead. +func (*Xml) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{25} +} + +func (x *Xml) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Xml) GetNamespace() string { + if x != nil { + return x.Namespace + } + return "" +} + +func (x *Xml) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *Xml) GetAttribute() bool { + if x != nil { + return x.Attribute + } + return false +} + +func (x *Xml) GetWrapped() bool { + if x != nil { + return x.Wrapped + } + return false +} + +// Defines a security scheme that can be used by the operations. +type SecurityScheme struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The type of the security scheme. + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + // A description for security scheme. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // REQUIRED (oauth2, openIdConnect). The name of the header, query or cookie + // parameter to be used. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // REQUIRED (apiKey). The location of the API key. + In string `protobuf:"bytes,4,opt,name=in,proto3" json:"in,omitempty"` + // REQUIRED (http). The name of the HTTP Authorization scheme to be used. + Scheme string `protobuf:"bytes,5,opt,name=scheme,proto3" json:"scheme,omitempty"` + // A hint to the client to identify how the bearer token is formatted. + BearerFormat string `protobuf:"bytes,6,opt,name=bearer_format,json=bearerFormat,proto3" json:"bearer_format,omitempty"` + // REQUIRED (oauth2). An object containing configuration information for the + // flow types supported. + Flows *OAuthFlows `protobuf:"bytes,7,opt,name=flows,proto3" json:"flows,omitempty"` + // REQUIRED (openIdConnect). OpenId Connect URL to discover OAuth2 + // configuration values. + OpenIdConnectUrl string `protobuf:"bytes,8,opt,name=open_id_connect_url,json=openIdConnectUrl,proto3" json:"open_id_connect_url,omitempty"` +} + +func (x *SecurityScheme) Reset() { + *x = SecurityScheme{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SecurityScheme) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SecurityScheme) ProtoMessage() {} + +func (x *SecurityScheme) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[26] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SecurityScheme.ProtoReflect.Descriptor instead. +func (*SecurityScheme) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{26} +} + +func (x *SecurityScheme) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +func (x *SecurityScheme) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *SecurityScheme) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SecurityScheme) GetIn() string { + if x != nil { + return x.In + } + return "" +} + +func (x *SecurityScheme) GetScheme() string { + if x != nil { + return x.Scheme + } + return "" +} + +func (x *SecurityScheme) GetBearerFormat() string { + if x != nil { + return x.BearerFormat + } + return "" +} + +func (x *SecurityScheme) GetFlows() *OAuthFlows { + if x != nil { + return x.Flows + } + return nil +} + +func (x *SecurityScheme) GetOpenIdConnectUrl() string { + if x != nil { + return x.OpenIdConnectUrl + } + return "" +} + +// Allows configuration of the supported OAuth Flows. +type OAuthFlows struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Configuration for the OAuth Implicit flow. + Implicit *OAuthFlow `protobuf:"bytes,1,opt,name=implicit,proto3" json:"implicit,omitempty"` + // Configuration for the OAuth Resource Owner Password flow. + Password *OAuthFlow `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + // Configuration for the OAuth Client Credentials flow. + ClientCredentials *OAuthFlow `protobuf:"bytes,3,opt,name=client_credentials,json=clientCredentials,proto3" json:"client_credentials,omitempty"` + // Configuration for the OAuth Authorization Code flow. + AuthorizationCode *OAuthFlow `protobuf:"bytes,4,opt,name=authorization_code,json=authorizationCode,proto3" json:"authorization_code,omitempty"` +} + +func (x *OAuthFlows) Reset() { + *x = OAuthFlows{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OAuthFlows) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OAuthFlows) ProtoMessage() {} + +func (x *OAuthFlows) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OAuthFlows.ProtoReflect.Descriptor instead. +func (*OAuthFlows) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{27} +} + +func (x *OAuthFlows) GetImplicit() *OAuthFlow { + if x != nil { + return x.Implicit + } + return nil +} + +func (x *OAuthFlows) GetPassword() *OAuthFlow { + if x != nil { + return x.Password + } + return nil +} + +func (x *OAuthFlows) GetClientCredentials() *OAuthFlow { + if x != nil { + return x.ClientCredentials + } + return nil +} + +func (x *OAuthFlows) GetAuthorizationCode() *OAuthFlow { + if x != nil { + return x.AuthorizationCode + } + return nil +} + +// Configuration details for a supported OAuth Flow. +type OAuthFlow struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED (implicit, authorization_code). The authorization URL to be used + // for this flow. + AuthorizationUrl string `protobuf:"bytes,1,opt,name=authorization_url,json=authorizationUrl,proto3" json:"authorization_url,omitempty"` + // REQUIRED (password, client_credentials, authorization_code). The token URL + // to be used for this flow. + TokenUrl string `protobuf:"bytes,2,opt,name=token_url,json=tokenUrl,proto3" json:"token_url,omitempty"` + // The URL to be used for obtaining refresh tokens. + RefreshUrl string `protobuf:"bytes,3,opt,name=refresh_url,json=refreshUrl,proto3" json:"refresh_url,omitempty"` + // REQUIRED. The available scopes for the OAuth2 security scheme. + Scopes map[string]string `protobuf:"bytes,4,rep,name=scopes,proto3" json:"scopes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *OAuthFlow) Reset() { + *x = OAuthFlow{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *OAuthFlow) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OAuthFlow) ProtoMessage() {} + +func (x *OAuthFlow) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OAuthFlow.ProtoReflect.Descriptor instead. +func (*OAuthFlow) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{28} +} + +func (x *OAuthFlow) GetAuthorizationUrl() string { + if x != nil { + return x.AuthorizationUrl + } + return "" +} + +func (x *OAuthFlow) GetTokenUrl() string { + if x != nil { + return x.TokenUrl + } + return "" +} + +func (x *OAuthFlow) GetRefreshUrl() string { + if x != nil { + return x.RefreshUrl + } + return "" +} + +func (x *OAuthFlow) GetScopes() map[string]string { + if x != nil { + return x.Scopes + } + return nil +} + +// Adds metadata to a single tag that is used by the Operation Object. +type Tag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The name of the tag. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A description for the tag. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // Additional external documentation for this tag. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` +} + +func (x *Tag) Reset() { + *x = Tag{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tag.ProtoReflect.Descriptor instead. +func (*Tag) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{29} +} + +func (x *Tag) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Tag) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Tag) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +// A simple object to allow referencing other components in the specification. +type Reference struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // REQUIRED. The reference string. + Ref string `protobuf:"bytes,1,opt,name=ref,proto3" json:"ref,omitempty"` + // A short summary which by default SHOULD override that of the referenced + // component. + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + // A description which by default SHOULD override that of the referenced + // component. + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` +} + +func (x *Reference) Reset() { + *x = Reference{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Reference) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Reference) ProtoMessage() {} + +func (x *Reference) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Reference.ProtoReflect.Descriptor instead. +func (*Reference) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{30} +} + +func (x *Reference) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *Reference) GetSummary() string { + if x != nil { + return x.Summary + } + return "" +} + +func (x *Reference) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +// Enum represents OpenAPI v3 configuration for enum types +type Enum struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A title for the enum schema. + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + // A description for the enum schema. CommonMark syntax MAY be used for rich text representation. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // External documentation for this enum schema. + ExternalDocs *ExternalDocumentation `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs,proto3" json:"external_docs,omitempty"` + // Default value for this enum if none is provided. + Default string `protobuf:"bytes,4,opt,name=default,proto3" json:"default,omitempty"` + // Example value to be used in the generated OpenAPI documentation. + Example string `protobuf:"bytes,5,opt,name=example,proto3" json:"example,omitempty"` + // Indicates whether this enum is deprecated and should be avoided. + Deprecated bool `protobuf:"varint,6,opt,name=deprecated,proto3" json:"deprecated,omitempty"` + // Custom mapping of enum values to display names in documentation. + ValueDescriptions map[string]string `protobuf:"bytes,7,rep,name=value_descriptions,json=valueDescriptions,proto3" json:"value_descriptions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Additional metadata for the enum schema. + Extensions *structpb.Struct `protobuf:"bytes,8,opt,name=extensions,proto3" json:"extensions,omitempty"` +} + +func (x *Enum) Reset() { + *x = Enum{} + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Enum) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Enum) ProtoMessage() {} + +func (x *Enum) ProtoReflect() protoreflect.Message { + mi := &file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[31] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Enum.ProtoReflect.Descriptor instead. +func (*Enum) Descriptor() ([]byte, []int) { + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP(), []int{31} +} + +func (x *Enum) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Enum) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *Enum) GetExternalDocs() *ExternalDocumentation { + if x != nil { + return x.ExternalDocs + } + return nil +} + +func (x *Enum) GetDefault() string { + if x != nil { + return x.Default + } + return "" +} + +func (x *Enum) GetExample() string { + if x != nil { + return x.Example + } + return "" +} + +func (x *Enum) GetDeprecated() bool { + if x != nil { + return x.Deprecated + } + return false +} + +func (x *Enum) GetValueDescriptions() map[string]string { + if x != nil { + return x.ValueDescriptions + } + return nil +} + +func (x *Enum) GetExtensions() *structpb.Struct { + if x != nil { + return x.Extensions + } + return nil +} + +var File_protoc_gen_openapiv3_options_openapiv3_proto protoreflect.FileDescriptor + +var file_protoc_gen_openapiv3_options_openapiv3_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x29, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xcf, 0x04, 0x0a, 0x07, 0x4f, 0x70, 0x65, 0x6e, 0x41, 0x50, 0x49, 0x12, 0x18, + 0x0a, 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x12, 0x43, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, + 0x13, 0x6a, 0x73, 0x6f, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x64, 0x69, 0x61, + 0x6c, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6a, 0x73, 0x6f, 0x6e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x44, 0x69, 0x61, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x4b, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x0a, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x5a, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, + 0x73, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, + 0x63, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, + 0x08, 0x06, 0x10, 0x07, 0x22, 0xb8, 0x02, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x4f, 0x66, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x6c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x45, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x4f, 0x0a, 0x07, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x95, 0x02, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5e, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x76, 0x61, 0x72, + 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x1a, 0x77, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x60, 0x0a, 0x0e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xa6, 0x0f, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x5c, 0x0a, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x62, + 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x73, 0x12, 0x65, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5f, 0x0a, 0x08, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6f, 0x0a, 0x0e, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x69, 0x65, 0x73, 0x12, 0x5c, 0x0a, 0x07, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x75, 0x0a, 0x10, 0x73, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x12, 0x56, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x62, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x1a, 0x6d, 0x0a, 0x0c, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x0e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x73, + 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x6f, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x78, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4c, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, + 0x6f, 0x64, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6d, + 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, + 0x14, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x69, 0x0a, 0x0a, + 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x71, 0x0a, 0x0e, 0x43, 0x61, 0x6c, 0x6c, 0x62, + 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8d, 0x01, 0x0a, 0x19, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x62, 0x6f, 0x6f, 0x6c, + 0x65, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x4b, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xa4, 0x1b, 0x0a, 0x06, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x05, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, + 0x61, 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x6d, 0x61, 0x78, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, + 0x6e, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x6d, 0x69, 0x6e, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0d, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x6d, 0x61, 0x78, + 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x11, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6c, 0x6c, + 0x5f, 0x6f, 0x66, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x61, 0x6c, + 0x6c, 0x4f, 0x66, 0x12, 0x48, 0x0a, 0x06, 0x61, 0x6e, 0x79, 0x5f, 0x6f, 0x66, 0x18, 0x16, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x61, 0x6e, 0x79, 0x4f, 0x66, 0x12, 0x48, 0x0a, + 0x06, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x05, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x12, 0x43, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x12, 0x47, 0x0a, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, + 0x69, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x61, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x79, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x18, 0x1c, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x04, 0x65, 0x6e, 0x75, 0x6d, 0x12, 0x30, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x20, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x21, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x4f, 0x0a, 0x04, 0x64, 0x65, 0x66, + 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x66, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x65, 0x66, 0x73, 0x12, 0x54, 0x0a, 0x0c, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x23, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x12, 0x4d, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x24, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x77, 0x0a, 0x12, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x28, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x74, 0x0a, 0x11, 0x64, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x2a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x64, 0x65, + 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x4e, + 0x0a, 0x09, 0x69, 0x66, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x2b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x61, 0x52, 0x08, 0x69, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x52, + 0x0a, 0x0b, 0x74, 0x68, 0x65, 0x6e, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x2c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x74, 0x68, 0x65, 0x6e, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x12, 0x52, 0x0a, 0x0b, 0x65, 0x6c, 0x73, 0x65, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0a, 0x65, 0x6c, 0x73, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x7b, 0x0a, 0x16, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, + 0x75, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x75, 0x6e, + 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x71, 0x0a, 0x11, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x44, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x75, 0x6e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, + 0x64, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x30, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x64, + 0x69, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x31, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x58, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x33, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, + 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x36, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x1a, + 0x70, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x71, 0x0a, 0x10, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, + 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x09, 0x44, 0x65, 0x66, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x77, 0x0a, 0x16, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x76, 0x0a, 0x15, 0x44, 0x65, 0x70, + 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x86, 0x05, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x6b, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, + 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4c, 0x69, 0x6e, + 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x1a, 0x6d, + 0x0a, 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x70, 0x0a, + 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x69, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb1, 0x01, 0x0a, 0x06, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0xa9, + 0x04, 0x0a, 0x09, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x5e, 0x0a, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x2e, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x1a, 0x6f, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x70, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcf, 0x02, 0x0a, 0x08, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5a, 0x0a, 0x07, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x1a, 0x6d, 0x0a, + 0x0c, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x98, 0x01, 0x0a, + 0x07, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xaa, 0x03, 0x0a, 0x04, 0x4c, 0x69, 0x6e, 0x6b, + 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x5f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x2e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, + 0x64, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x1a, + 0x53, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8b, 0x08, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, + 0x6f, 0x63, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x54, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x59, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, + 0x64, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, + 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x61, 0x0a, + 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, + 0x12, 0x61, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x4b, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x1a, 0x71, 0x0a, 0x0e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x71, 0x0a, 0x0e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, + 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, + 0xab, 0x06, 0x0a, 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x79, 0x6c, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x64, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x64, 0x12, 0x49, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x2e, 0x0a, + 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x5e, 0x0a, + 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x42, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x5b, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x41, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x6f, 0x0a, 0x0d, 0x45, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x48, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x70, 0x0a, 0x0c, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9c, 0x02, + 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x5d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x43, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x1a, 0x70, 0x0a, 0x0c, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe3, 0x01, 0x0a, + 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x0a, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, + 0x63, 0x6b, 0x2e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x72, + 0x0a, 0x0f, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, + 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xaa, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x15, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x82, 0x01, 0x0a, 0x19, 0x41, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, + 0x6f, 0x70, 0x65, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x28, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x22, 0xd5, 0x06, 0x0a, 0x08, 0x50, 0x61, + 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x03, 0x67, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x67, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x03, + 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x03, 0x70, 0x75, 0x74, 0x12, 0x48, 0x0a, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x70, 0x6f, 0x73, 0x74, 0x12, 0x4c, + 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x07, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x48, 0x0a, 0x04, + 0x68, 0x65, 0x61, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, + 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x04, 0x68, 0x65, 0x61, 0x64, 0x12, 0x4a, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, + 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x70, 0x61, 0x74, + 0x63, 0x68, 0x12, 0x4a, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x4b, + 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x31, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x54, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, + 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x4e, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x1a, 0x6c, 0x0a, 0x09, 0x50, + 0x61, 0x74, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x49, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x72, 0x70, 0x63, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, + 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x0d, 0x44, 0x69, + 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x5f, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x45, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x69, + 0x73, 0x63, 0x72, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x87, 0x01, + 0x0a, 0x03, 0x58, 0x6d, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x65, 0x61, 0x72, 0x65, 0x72, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x4b, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x2d, + 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6f, 0x70, 0x65, + 0x6e, 0x49, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x55, 0x72, 0x6c, 0x22, 0xfa, 0x02, + 0x0a, 0x0a, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x50, 0x0a, 0x08, + 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, + 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, + 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x12, 0x50, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x41, 0x75, + 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x63, 0x0a, 0x12, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x46, 0x6c, + 0x6f, 0x77, 0x52, 0x11, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, + 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x41, + 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x52, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x4f, + 0x41, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, + 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x55, 0x72, 0x6c, 0x12, 0x58, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x46, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x1a, 0x39, 0x0a, + 0x0b, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa2, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, + 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, 0x22, 0x59, 0x0a, + 0x09, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, + 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xef, 0x03, 0x0a, 0x04, 0x45, 0x6e, 0x75, + 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0d, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x40, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x44, 0x6f, 0x63, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x75, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x46, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x75, + 0x6d, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x0a, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x44, 0x0a, 0x16, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x8d, 0x01, 0x0a, 0x2d, 0x6f, + 0x72, 0x67, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x5f, 0x67, 0x65, 0x6e, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x61, + 0x70, 0x69, 0x76, 0x33, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x4f, 0x70, + 0x65, 0x6e, 0x41, 0x50, 0x49, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x46, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x65, 0x63, + 0x6f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2f, 0x76, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, + 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x33, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02, 0x03, 0x4f, 0x41, 0x53, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescOnce sync.Once + file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescData = file_protoc_gen_openapiv3_options_openapiv3_proto_rawDesc +) + +func file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescGZIP() []byte { + file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescOnce.Do(func() { + file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescData = protoimpl.X.CompressGZIP(file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescData) + }) + return file_protoc_gen_openapiv3_options_openapiv3_proto_rawDescData +} + +var file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes = make([]protoimpl.MessageInfo, 65) +var file_protoc_gen_openapiv3_options_openapiv3_proto_goTypes = []any{ + (*OpenAPI)(nil), // 0: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI + (*Info)(nil), // 1: grpc.gateway.protoc_gen_openapiv3.options.Info + (*Contact)(nil), // 2: grpc.gateway.protoc_gen_openapiv3.options.Contact + (*License)(nil), // 3: grpc.gateway.protoc_gen_openapiv3.options.License + (*Server)(nil), // 4: grpc.gateway.protoc_gen_openapiv3.options.Server + (*ServerVariable)(nil), // 5: grpc.gateway.protoc_gen_openapiv3.options.ServerVariable + (*Components)(nil), // 6: grpc.gateway.protoc_gen_openapiv3.options.Components + (*AdditionalPropertiesValue)(nil), // 7: grpc.gateway.protoc_gen_openapiv3.options.AdditionalPropertiesValue + (*Schema)(nil), // 8: grpc.gateway.protoc_gen_openapiv3.options.Schema + (*Response)(nil), // 9: grpc.gateway.protoc_gen_openapiv3.options.Response + (*Header)(nil), // 10: grpc.gateway.protoc_gen_openapiv3.options.Header + (*MediaType)(nil), // 11: grpc.gateway.protoc_gen_openapiv3.options.MediaType + (*Encoding)(nil), // 12: grpc.gateway.protoc_gen_openapiv3.options.Encoding + (*Example)(nil), // 13: grpc.gateway.protoc_gen_openapiv3.options.Example + (*Link)(nil), // 14: grpc.gateway.protoc_gen_openapiv3.options.Link + (*Operation)(nil), // 15: grpc.gateway.protoc_gen_openapiv3.options.Operation + (*ExternalDocumentation)(nil), // 16: grpc.gateway.protoc_gen_openapiv3.options.ExternalDocumentation + (*Parameter)(nil), // 17: grpc.gateway.protoc_gen_openapiv3.options.Parameter + (*RequestBody)(nil), // 18: grpc.gateway.protoc_gen_openapiv3.options.RequestBody + (*Callback)(nil), // 19: grpc.gateway.protoc_gen_openapiv3.options.Callback + (*SecurityRequirement)(nil), // 20: grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement + (*SecurityScopes)(nil), // 21: grpc.gateway.protoc_gen_openapiv3.options.SecurityScopes + (*PathItem)(nil), // 22: grpc.gateway.protoc_gen_openapiv3.options.PathItem + (*Paths)(nil), // 23: grpc.gateway.protoc_gen_openapiv3.options.Paths + (*Discriminator)(nil), // 24: grpc.gateway.protoc_gen_openapiv3.options.Discriminator + (*Xml)(nil), // 25: grpc.gateway.protoc_gen_openapiv3.options.Xml + (*SecurityScheme)(nil), // 26: grpc.gateway.protoc_gen_openapiv3.options.SecurityScheme + (*OAuthFlows)(nil), // 27: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows + (*OAuthFlow)(nil), // 28: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow + (*Tag)(nil), // 29: grpc.gateway.protoc_gen_openapiv3.options.Tag + (*Reference)(nil), // 30: grpc.gateway.protoc_gen_openapiv3.options.Reference + (*Enum)(nil), // 31: grpc.gateway.protoc_gen_openapiv3.options.Enum + nil, // 32: grpc.gateway.protoc_gen_openapiv3.options.Server.VariablesEntry + nil, // 33: grpc.gateway.protoc_gen_openapiv3.options.Components.SchemasEntry + nil, // 34: grpc.gateway.protoc_gen_openapiv3.options.Components.ResponsesEntry + nil, // 35: grpc.gateway.protoc_gen_openapiv3.options.Components.ParametersEntry + nil, // 36: grpc.gateway.protoc_gen_openapiv3.options.Components.ExamplesEntry + nil, // 37: grpc.gateway.protoc_gen_openapiv3.options.Components.RequestBodiesEntry + nil, // 38: grpc.gateway.protoc_gen_openapiv3.options.Components.HeadersEntry + nil, // 39: grpc.gateway.protoc_gen_openapiv3.options.Components.SecuritySchemesEntry + nil, // 40: grpc.gateway.protoc_gen_openapiv3.options.Components.LinksEntry + nil, // 41: grpc.gateway.protoc_gen_openapiv3.options.Components.CallbacksEntry + nil, // 42: grpc.gateway.protoc_gen_openapiv3.options.Schema.PropertiesEntry + nil, // 43: grpc.gateway.protoc_gen_openapiv3.options.Schema.DefinitionsEntry + nil, // 44: grpc.gateway.protoc_gen_openapiv3.options.Schema.DefsEntry + nil, // 45: grpc.gateway.protoc_gen_openapiv3.options.Schema.PatternPropertiesEntry + nil, // 46: grpc.gateway.protoc_gen_openapiv3.options.Schema.DependentSchemasEntry + nil, // 47: grpc.gateway.protoc_gen_openapiv3.options.Response.HeadersEntry + nil, // 48: grpc.gateway.protoc_gen_openapiv3.options.Response.ContentEntry + nil, // 49: grpc.gateway.protoc_gen_openapiv3.options.Response.LinksEntry + nil, // 50: grpc.gateway.protoc_gen_openapiv3.options.MediaType.ExamplesEntry + nil, // 51: grpc.gateway.protoc_gen_openapiv3.options.MediaType.EncodingEntry + nil, // 52: grpc.gateway.protoc_gen_openapiv3.options.Encoding.HeadersEntry + nil, // 53: grpc.gateway.protoc_gen_openapiv3.options.Link.ParametersEntry + nil, // 54: grpc.gateway.protoc_gen_openapiv3.options.Operation.ResponsesEntry + nil, // 55: grpc.gateway.protoc_gen_openapiv3.options.Operation.CallbacksEntry + nil, // 56: grpc.gateway.protoc_gen_openapiv3.options.Parameter.ExamplesEntry + nil, // 57: grpc.gateway.protoc_gen_openapiv3.options.Parameter.ContentEntry + nil, // 58: grpc.gateway.protoc_gen_openapiv3.options.RequestBody.ContentEntry + nil, // 59: grpc.gateway.protoc_gen_openapiv3.options.Callback.ExpressionEntry + nil, // 60: grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement.AdditionalPropertiesEntry + nil, // 61: grpc.gateway.protoc_gen_openapiv3.options.Paths.PathEntry + nil, // 62: grpc.gateway.protoc_gen_openapiv3.options.Discriminator.MappingEntry + nil, // 63: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow.ScopesEntry + nil, // 64: grpc.gateway.protoc_gen_openapiv3.options.Enum.ValueDescriptionsEntry + (*structpb.Value)(nil), // 65: google.protobuf.Value + (*anypb.Any)(nil), // 66: google.protobuf.Any + (*structpb.Struct)(nil), // 67: google.protobuf.Struct +} +var file_protoc_gen_openapiv3_options_openapiv3_proto_depIdxs = []int32{ + 1, // 0: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.info:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Info + 4, // 1: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.servers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Server + 6, // 2: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.components:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components + 20, // 3: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.security:type_name -> grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement + 29, // 4: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.tags:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Tag + 16, // 5: grpc.gateway.protoc_gen_openapiv3.options.OpenAPI.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv3.options.ExternalDocumentation + 2, // 6: grpc.gateway.protoc_gen_openapiv3.options.Info.contact:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Contact + 3, // 7: grpc.gateway.protoc_gen_openapiv3.options.Info.license:type_name -> grpc.gateway.protoc_gen_openapiv3.options.License + 32, // 8: grpc.gateway.protoc_gen_openapiv3.options.Server.variables:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Server.VariablesEntry + 33, // 9: grpc.gateway.protoc_gen_openapiv3.options.Components.schemas:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.SchemasEntry + 34, // 10: grpc.gateway.protoc_gen_openapiv3.options.Components.responses:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.ResponsesEntry + 35, // 11: grpc.gateway.protoc_gen_openapiv3.options.Components.parameters:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.ParametersEntry + 36, // 12: grpc.gateway.protoc_gen_openapiv3.options.Components.examples:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.ExamplesEntry + 37, // 13: grpc.gateway.protoc_gen_openapiv3.options.Components.request_bodies:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.RequestBodiesEntry + 38, // 14: grpc.gateway.protoc_gen_openapiv3.options.Components.headers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.HeadersEntry + 39, // 15: grpc.gateway.protoc_gen_openapiv3.options.Components.security_schemes:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.SecuritySchemesEntry + 40, // 16: grpc.gateway.protoc_gen_openapiv3.options.Components.links:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.LinksEntry + 41, // 17: grpc.gateway.protoc_gen_openapiv3.options.Components.callbacks:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Components.CallbacksEntry + 8, // 18: grpc.gateway.protoc_gen_openapiv3.options.AdditionalPropertiesValue.schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 65, // 19: grpc.gateway.protoc_gen_openapiv3.options.Schema.const:type_name -> google.protobuf.Value + 8, // 20: grpc.gateway.protoc_gen_openapiv3.options.Schema.all_of:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 21: grpc.gateway.protoc_gen_openapiv3.options.Schema.any_of:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 22: grpc.gateway.protoc_gen_openapiv3.options.Schema.one_of:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 23: grpc.gateway.protoc_gen_openapiv3.options.Schema.not:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 24: grpc.gateway.protoc_gen_openapiv3.options.Schema.items:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 42, // 25: grpc.gateway.protoc_gen_openapiv3.options.Schema.properties:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema.PropertiesEntry + 7, // 26: grpc.gateway.protoc_gen_openapiv3.options.Schema.additional_properties:type_name -> grpc.gateway.protoc_gen_openapiv3.options.AdditionalPropertiesValue + 65, // 27: grpc.gateway.protoc_gen_openapiv3.options.Schema.default:type_name -> google.protobuf.Value + 65, // 28: grpc.gateway.protoc_gen_openapiv3.options.Schema.examples:type_name -> google.protobuf.Value + 43, // 29: grpc.gateway.protoc_gen_openapiv3.options.Schema.definitions:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema.DefinitionsEntry + 44, // 30: grpc.gateway.protoc_gen_openapiv3.options.Schema.defs:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema.DefsEntry + 8, // 31: grpc.gateway.protoc_gen_openapiv3.options.Schema.prefix_items:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 32: grpc.gateway.protoc_gen_openapiv3.options.Schema.contains:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 33: grpc.gateway.protoc_gen_openapiv3.options.Schema.property_names:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 45, // 34: grpc.gateway.protoc_gen_openapiv3.options.Schema.pattern_properties:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema.PatternPropertiesEntry + 46, // 35: grpc.gateway.protoc_gen_openapiv3.options.Schema.dependent_schemas:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema.DependentSchemasEntry + 8, // 36: grpc.gateway.protoc_gen_openapiv3.options.Schema.if_schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 37: grpc.gateway.protoc_gen_openapiv3.options.Schema.then_schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 38: grpc.gateway.protoc_gen_openapiv3.options.Schema.else_schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 7, // 39: grpc.gateway.protoc_gen_openapiv3.options.Schema.unevaluated_properties:type_name -> grpc.gateway.protoc_gen_openapiv3.options.AdditionalPropertiesValue + 7, // 40: grpc.gateway.protoc_gen_openapiv3.options.Schema.unevaluated_items:type_name -> grpc.gateway.protoc_gen_openapiv3.options.AdditionalPropertiesValue + 8, // 41: grpc.gateway.protoc_gen_openapiv3.options.Schema.content_schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 47, // 42: grpc.gateway.protoc_gen_openapiv3.options.Response.headers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Response.HeadersEntry + 48, // 43: grpc.gateway.protoc_gen_openapiv3.options.Response.content:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Response.ContentEntry + 49, // 44: grpc.gateway.protoc_gen_openapiv3.options.Response.links:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Response.LinksEntry + 8, // 45: grpc.gateway.protoc_gen_openapiv3.options.Header.schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 46: grpc.gateway.protoc_gen_openapiv3.options.MediaType.schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 66, // 47: grpc.gateway.protoc_gen_openapiv3.options.MediaType.example:type_name -> google.protobuf.Any + 50, // 48: grpc.gateway.protoc_gen_openapiv3.options.MediaType.examples:type_name -> grpc.gateway.protoc_gen_openapiv3.options.MediaType.ExamplesEntry + 51, // 49: grpc.gateway.protoc_gen_openapiv3.options.MediaType.encoding:type_name -> grpc.gateway.protoc_gen_openapiv3.options.MediaType.EncodingEntry + 52, // 50: grpc.gateway.protoc_gen_openapiv3.options.Encoding.headers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Encoding.HeadersEntry + 66, // 51: grpc.gateway.protoc_gen_openapiv3.options.Example.value:type_name -> google.protobuf.Any + 53, // 52: grpc.gateway.protoc_gen_openapiv3.options.Link.parameters:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Link.ParametersEntry + 66, // 53: grpc.gateway.protoc_gen_openapiv3.options.Link.request_body:type_name -> google.protobuf.Any + 4, // 54: grpc.gateway.protoc_gen_openapiv3.options.Link.server:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Server + 16, // 55: grpc.gateway.protoc_gen_openapiv3.options.Operation.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv3.options.ExternalDocumentation + 17, // 56: grpc.gateway.protoc_gen_openapiv3.options.Operation.parameters:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Parameter + 18, // 57: grpc.gateway.protoc_gen_openapiv3.options.Operation.request_body:type_name -> grpc.gateway.protoc_gen_openapiv3.options.RequestBody + 54, // 58: grpc.gateway.protoc_gen_openapiv3.options.Operation.responses:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation.ResponsesEntry + 55, // 59: grpc.gateway.protoc_gen_openapiv3.options.Operation.callbacks:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation.CallbacksEntry + 20, // 60: grpc.gateway.protoc_gen_openapiv3.options.Operation.security:type_name -> grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement + 4, // 61: grpc.gateway.protoc_gen_openapiv3.options.Operation.servers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Server + 8, // 62: grpc.gateway.protoc_gen_openapiv3.options.Parameter.schema:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 66, // 63: grpc.gateway.protoc_gen_openapiv3.options.Parameter.example:type_name -> google.protobuf.Any + 56, // 64: grpc.gateway.protoc_gen_openapiv3.options.Parameter.examples:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Parameter.ExamplesEntry + 57, // 65: grpc.gateway.protoc_gen_openapiv3.options.Parameter.content:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Parameter.ContentEntry + 58, // 66: grpc.gateway.protoc_gen_openapiv3.options.RequestBody.content:type_name -> grpc.gateway.protoc_gen_openapiv3.options.RequestBody.ContentEntry + 59, // 67: grpc.gateway.protoc_gen_openapiv3.options.Callback.expression:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Callback.ExpressionEntry + 60, // 68: grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement.additional_properties:type_name -> grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement.AdditionalPropertiesEntry + 15, // 69: grpc.gateway.protoc_gen_openapiv3.options.PathItem.get:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 70: grpc.gateway.protoc_gen_openapiv3.options.PathItem.put:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 71: grpc.gateway.protoc_gen_openapiv3.options.PathItem.post:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 72: grpc.gateway.protoc_gen_openapiv3.options.PathItem.delete:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 73: grpc.gateway.protoc_gen_openapiv3.options.PathItem.options:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 74: grpc.gateway.protoc_gen_openapiv3.options.PathItem.head:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 75: grpc.gateway.protoc_gen_openapiv3.options.PathItem.patch:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 15, // 76: grpc.gateway.protoc_gen_openapiv3.options.PathItem.trace:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Operation + 4, // 77: grpc.gateway.protoc_gen_openapiv3.options.PathItem.servers:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Server + 17, // 78: grpc.gateway.protoc_gen_openapiv3.options.PathItem.parameters:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Parameter + 61, // 79: grpc.gateway.protoc_gen_openapiv3.options.Paths.path:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Paths.PathEntry + 62, // 80: grpc.gateway.protoc_gen_openapiv3.options.Discriminator.mapping:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Discriminator.MappingEntry + 27, // 81: grpc.gateway.protoc_gen_openapiv3.options.SecurityScheme.flows:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows + 28, // 82: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows.implicit:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow + 28, // 83: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows.password:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow + 28, // 84: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows.client_credentials:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow + 28, // 85: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlows.authorization_code:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow + 63, // 86: grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow.scopes:type_name -> grpc.gateway.protoc_gen_openapiv3.options.OAuthFlow.ScopesEntry + 16, // 87: grpc.gateway.protoc_gen_openapiv3.options.Tag.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv3.options.ExternalDocumentation + 16, // 88: grpc.gateway.protoc_gen_openapiv3.options.Enum.external_docs:type_name -> grpc.gateway.protoc_gen_openapiv3.options.ExternalDocumentation + 64, // 89: grpc.gateway.protoc_gen_openapiv3.options.Enum.value_descriptions:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Enum.ValueDescriptionsEntry + 67, // 90: grpc.gateway.protoc_gen_openapiv3.options.Enum.extensions:type_name -> google.protobuf.Struct + 5, // 91: grpc.gateway.protoc_gen_openapiv3.options.Server.VariablesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.ServerVariable + 8, // 92: grpc.gateway.protoc_gen_openapiv3.options.Components.SchemasEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 9, // 93: grpc.gateway.protoc_gen_openapiv3.options.Components.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Response + 17, // 94: grpc.gateway.protoc_gen_openapiv3.options.Components.ParametersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Parameter + 13, // 95: grpc.gateway.protoc_gen_openapiv3.options.Components.ExamplesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Example + 18, // 96: grpc.gateway.protoc_gen_openapiv3.options.Components.RequestBodiesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.RequestBody + 10, // 97: grpc.gateway.protoc_gen_openapiv3.options.Components.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Header + 26, // 98: grpc.gateway.protoc_gen_openapiv3.options.Components.SecuritySchemesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.SecurityScheme + 14, // 99: grpc.gateway.protoc_gen_openapiv3.options.Components.LinksEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Link + 19, // 100: grpc.gateway.protoc_gen_openapiv3.options.Components.CallbacksEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Callback + 8, // 101: grpc.gateway.protoc_gen_openapiv3.options.Schema.PropertiesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 102: grpc.gateway.protoc_gen_openapiv3.options.Schema.DefinitionsEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 103: grpc.gateway.protoc_gen_openapiv3.options.Schema.DefsEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 104: grpc.gateway.protoc_gen_openapiv3.options.Schema.PatternPropertiesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 8, // 105: grpc.gateway.protoc_gen_openapiv3.options.Schema.DependentSchemasEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Schema + 10, // 106: grpc.gateway.protoc_gen_openapiv3.options.Response.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Header + 11, // 107: grpc.gateway.protoc_gen_openapiv3.options.Response.ContentEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.MediaType + 14, // 108: grpc.gateway.protoc_gen_openapiv3.options.Response.LinksEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Link + 13, // 109: grpc.gateway.protoc_gen_openapiv3.options.MediaType.ExamplesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Example + 12, // 110: grpc.gateway.protoc_gen_openapiv3.options.MediaType.EncodingEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Encoding + 10, // 111: grpc.gateway.protoc_gen_openapiv3.options.Encoding.HeadersEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Header + 66, // 112: grpc.gateway.protoc_gen_openapiv3.options.Link.ParametersEntry.value:type_name -> google.protobuf.Any + 9, // 113: grpc.gateway.protoc_gen_openapiv3.options.Operation.ResponsesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Response + 19, // 114: grpc.gateway.protoc_gen_openapiv3.options.Operation.CallbacksEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Callback + 13, // 115: grpc.gateway.protoc_gen_openapiv3.options.Parameter.ExamplesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.Example + 11, // 116: grpc.gateway.protoc_gen_openapiv3.options.Parameter.ContentEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.MediaType + 11, // 117: grpc.gateway.protoc_gen_openapiv3.options.RequestBody.ContentEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.MediaType + 22, // 118: grpc.gateway.protoc_gen_openapiv3.options.Callback.ExpressionEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.PathItem + 21, // 119: grpc.gateway.protoc_gen_openapiv3.options.SecurityRequirement.AdditionalPropertiesEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.SecurityScopes + 22, // 120: grpc.gateway.protoc_gen_openapiv3.options.Paths.PathEntry.value:type_name -> grpc.gateway.protoc_gen_openapiv3.options.PathItem + 121, // [121:121] is the sub-list for method output_type + 121, // [121:121] is the sub-list for method input_type + 121, // [121:121] is the sub-list for extension type_name + 121, // [121:121] is the sub-list for extension extendee + 0, // [0:121] is the sub-list for field type_name +} + +func init() { file_protoc_gen_openapiv3_options_openapiv3_proto_init() } +func file_protoc_gen_openapiv3_options_openapiv3_proto_init() { + if File_protoc_gen_openapiv3_options_openapiv3_proto != nil { + return + } + file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes[7].OneofWrappers = []any{ + (*AdditionalPropertiesValue_Boolean)(nil), + (*AdditionalPropertiesValue_Schema)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protoc_gen_openapiv3_options_openapiv3_proto_rawDesc, + NumEnums: 0, + NumMessages: 65, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protoc_gen_openapiv3_options_openapiv3_proto_goTypes, + DependencyIndexes: file_protoc_gen_openapiv3_options_openapiv3_proto_depIdxs, + MessageInfos: file_protoc_gen_openapiv3_options_openapiv3_proto_msgTypes, + }.Build() + File_protoc_gen_openapiv3_options_openapiv3_proto = out.File + file_protoc_gen_openapiv3_options_openapiv3_proto_rawDesc = nil + file_protoc_gen_openapiv3_options_openapiv3_proto_goTypes = nil + file_protoc_gen_openapiv3_options_openapiv3_proto_depIdxs = nil +} diff --git a/protoc-gen-openapiv3/options/openapiv3.proto b/protoc-gen-openapiv3/options/openapiv3.proto new file mode 100644 index 00000000000..5b23bc8dbbe --- /dev/null +++ b/protoc-gen-openapiv3/options/openapiv3.proto @@ -0,0 +1,785 @@ +syntax = "proto3"; + +package grpc.gateway.protoc_gen_openapiv3.options; + +import "google/protobuf/any.proto"; +import "google/protobuf/struct.proto"; + +option go_package = "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv3/options"; +option java_multiple_files = true; +option java_outer_classname = "OpenAPIProto"; +option java_package = "org.grpc.gateway.protoc_gen_openapiv3.options"; +option objc_class_prefix = "OAS"; + +message OpenAPI { + // REQUIRED. This string MUST be the version number of the OpenAPI + // Specification that the OpenAPI Document uses. The openapi field SHOULD be + // used by tooling to interpret the OpenAPI Document. This is not related to + // the API info.version string. + string openapi = 1; + // REQUIRED. Provides metadata about the API. The metadata MAY be used by + // tooling as required. + Info info = 2; + // The default value for the $schema keyword within Schema Objects contained + // within this OAS document. This MUST be in the form of a URI. + string json_schema_dialect = 3; + // An array of Server Objects, which provide connectivity information to a + // target server. If the servers field is not provided, or is an empty array, + // the default value would be a Server Object with a url value of /. + repeated Server servers = 4; + // Paths will be generated + reserved 5; + // Webhooks reserved to be implemented + reserved 6; + // An element to hold various schemas for the specification. + Components components = 7; + // A declaration of which security mechanisms can be used across the API. + repeated SecurityRequirement security = 8; + // A list of tags used by the specification with additional metadata. + repeated Tag tags = 9; + // Additional external documentation. + ExternalDocumentation external_docs = 10; +} + +message Info { + // REQUIRED. The title of the API. + string title = 1; + // A short summary of the API. + string summary = 2; + // A description of the API. CommonMark syntax MAY be used for rich text + // representation. + string description = 3; + // A URI for the Terms of Service for the API. This MUST be in the form of a + // URI. + string terms_of_service = 4; + // The contact information for the exposed API. + Contact contact = 5; + // The license information for the exposed API. + License license = 6; + // REQUIRED. The version of the OpenAPI Document. + string version = 7; +} + +// Contact information for the exposed API. +message Contact { + // The identifying name of the contact person/organization. + string name = 1; + // The URI for the contact information. This MUST be in the form of a URI. + string url = 2; + // The email address of the contact person/organization. This MUST be in the + // form of an email address. + string email = 3; +} + +// License information for the exposed API. +message License { + // REQUIRED. The license name used for the API. + string name = 1; + // An SPDX-Licenses expression for the API. The identifier field is mutually + // exclusive of the url field. + string identifier = 2; + // A URI for the license used for the API. This MUST be in the form of a URI. + // The url field is mutually exclusive of the identifier field. + string url = 3; +} + +// An object representing a Server. +message Server { + // REQUIRED. A URL to the target host. This URL supports Server Variables and + // MAY be relative, to indicate that the host location is relative to the + // location where the document containing the Server Object is being served. + // Variable substitutions will be made when a variable is named in {braces}. + string url = 1; + + // An optional string describing the host designated by the URL. + // CommonMark syntax MAY be used for rich text representation. + string description = 2; + + // A map between a variable name and its value. The value is used for + // substitution in the server's URL template. + map variables = 3; +} + +// An object representing a Server Variable for server URL template +// substitution. +message ServerVariable { + // An enumeration of string values to be used if the substitution options are + // from a limited set. The array MUST NOT be empty. + repeated string enum = 1; + + // REQUIRED. The default value to use for substitution, which SHALL be sent if + // an alternate value is not supplied. If the enum is defined, the value MUST + // exist in the enum's values. Note that this behavior is different from the + // Schema Object's default keyword, which documents the receiver's behavior + // rather than inserting the value into the data. + string default = 2; + + // An optional description for the server variable. + // CommonMark syntax MAY be used for rich text representation. + string description = 3; +} + +// Holds a set of reusable objects for different aspects of the OAS. +message Components { + // An object to hold reusable Schema Objects. + map schemas = 1; + + // An object to hold reusable Response Objects. + map responses = 2; + + // An object to hold reusable Parameter Objects. + map parameters = 3; + + // An object to hold reusable Example Objects. + map examples = 4; + + // An object to hold reusable Request Body Objects. + map request_bodies = 5; + + // An object to hold reusable Header Objects. + map headers = 6; + + // An object to hold reusable Security Scheme Objects. + map security_schemes = 7; + + // An object to hold reusable Link Objects. + map links = 8; + + // An object to hold reusable Callback Objects. + map callbacks = 9; +} + +// AdditionalPropertiesValue represents the value of the additionalProperties +// keyword which can be either a boolean or a JSON Schema +message AdditionalPropertiesValue { + oneof value { + bool boolean = 1; + Schema schema = 2; + } +} + +// Schema represents JSON Schema Draft 2020-12, which is used by OpenAPI 3.1 +// This implementation covers the core schema keywords from the specification +message Schema { + // The schema's URI identifier (corresponds to $id in JSON Schema) + string id = 1; + + // Schema dialect, typically "https://json-schema.org/draft/2020-12/schema" + // (corresponds to $schema in JSON Schema) + string schema = 2; + + // Schema title + string title = 3; + + // Schema description + string description = 4; + + // If "true", the instance validates successfully + // If "false", the instance fails to validate + // (corresponds to $const in JSON Schema) + google.protobuf.Value const = 5; + + // The value of this keyword MUST be a string. This string SHOULD be a valid + // URI-reference, and this URI-reference SHOULD be a URI Template according to + // RFC 6570. If this keyword is absent, it can be considered present with an + // empty string value. + string format = 6; + + // The value of this keyword MUST be a non-negative integer. + int32 max_length = 7; + + // The value of this keyword MUST be a non-negative integer. + int32 min_length = 8; + + // The value of this keyword MUST be a string. This string SHOULD be a valid + // regular expression, according to the ECMA-262 regular expression dialect. + string pattern = 9; + + // The value of this keyword MUST be a non-negative integer. + int32 max_items = 10; + + // The value of this keyword MUST be a non-negative integer. + int32 min_items = 11; + + // The value of this keyword MUST be a boolean. + bool unique_items = 12; + + // The value of this keyword MUST be a non-negative integer. + int32 max_properties = 13; + + // The value of this keyword MUST be a non-negative integer. + int32 min_properties = 14; + + // The value of this keyword MUST be an array. Elements of this array, if any, + // MUST be strings, and MUST be unique. + repeated string required = 15; + + // The value of this keyword MUST be a number, representing an inclusive upper + // limit for a numeric instance. + double maximum = 16; + + // The value of this keyword MUST be a number, representing an exclusive upper + // limit for a numeric instance. + double exclusive_maximum = 17; + + // The value of this keyword MUST be a number, representing an inclusive lower + // limit for a numeric instance. + double minimum = 18; + + // The value of this keyword MUST be a number, representing an exclusive lower + // limit for a numeric instance. + double exclusive_minimum = 19; + + // The value of this keyword MUST be a number. A numeric instance is valid + // only if division by this keyword's value results in an integer. + int32 multiple_of = 20; + + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + repeated Schema all_of = 21; + + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + repeated Schema any_of = 22; + + // The value of this keyword MUST be an array. Each item of this array MUST be + // a valid JSON Schema. + repeated Schema one_of = 23; + + // The value of this keyword MUST be a valid JSON Schema. + Schema not = 24; + + // The value of this keyword MUST be a valid JSON Schema. + Schema items = 25; + + // The value of this keyword MUST be an object. Each value of this object MUST + // be a valid JSON Schema. + map properties = 26; + + // The value of this keyword MUST be either a boolean or a valid JSON Schema. + // If it's a boolean: false means no additional properties are allowed, + // true means any additional properties are allowed. + // If it's a schema: additional properties must validate against this schema. + AdditionalPropertiesValue additional_properties = 27; + + // The value of this keyword MUST be an array. Each item of the array MUST be + // a string, and MUST be unique. + repeated string enum = 28; + + // The value of this keyword MAY be of any type, including null. + google.protobuf.Value default = 29; + + // The value of this keyword MUST be an array. There are no restrictions + // placed on the values within the array. + repeated google.protobuf.Value examples = 30; + + // The value of this keyword MUST be a string. String values MUST be one of + // the seven primitive types defined by the core specification. + string type = 31; + + // DEPRECATED: Use $defs instead. This keyword's value MUST be a valid JSON + // Schema. + map definitions = 32; + + // Reference to another schema (corresponds to $ref in JSON Schema) + string ref = 33; + + // The modern replacement for definitions (corresponds to $defs in JSON + // Schema) + map defs = 34; + + // For tuple validation - an array of schemas for validating positional items + repeated Schema prefix_items = 35; + + // A schema which must validate against at least one array item + Schema contains = 36; + + // Minimum number of items that must match the "contains" schema + int32 min_contains = 37; + + // Maximum number of items that must match the "contains" schema + int32 max_contains = 38; + + // Schema for validating all property names of an object + Schema property_names = 39; + + // Map of regex patterns to schemas for validating matching properties + map pattern_properties = 40; + + // Schemas that must validate when a specified property is present + map dependent_schemas = 42; + + // Conditional validation - schema to test + Schema if_schema = 43; + + // Schema to use when if_schema validates successfully + Schema then_schema = 44; + + // Schema to use when if_schema fails to validate + Schema else_schema = 45; + + // Controls validation of properties not explicitly evaluated by properties or + // patternProperties + AdditionalPropertiesValue unevaluated_properties = 46; + + // Controls validation of items not explicitly evaluated by items or + // prefixItems + AdditionalPropertiesValue unevaluated_items = 47; + + // Content encoding (e.g., "base64") + string content_encoding = 48; + + // Content media type (e.g., "application/json") + string content_media_type = 49; + + // Schema for validating the decoded, parsed content + Schema content_schema = 50; + + // Indicates a property that can only be returned, not sent by the client + bool read_only = 51; + + // Indicates a property that can only be sent, not returned by the server + bool write_only = 52; + + // Indicates a property is deprecated and should be avoided + bool deprecated = 53; + + // Annotation to provide additional information + string comment = 54; +} + +// Describes a single response from an API Operation, including design-time, +// static links to operations based on the response. +message Response { + // REQUIRED. A description of the response. + // CommonMark syntax MAY be used for rich text representation. + string description = 1; + + // Maps a header name to its definition. + // RFC7230 states header names are case insensitive. + map headers = 2; + + // A map containing descriptions of potential response payloads. + // The key is a media type or media type range and the value describes it. + map content = 3; + + // A map of operations links that can be followed from the response. + map links = 4; +} + +// The Header Object follows the structure of the Parameter Object. +message Header { + // A brief description of the header. + string description = 1; + + // Determines whether this header is mandatory. + bool required = 2; + + // Specifies that a header is deprecated and SHOULD be transitioned out of + // usage. + bool deprecated = 3; + + // Schema defining the type used for the header. + Schema schema = 4; +} + +// Each Media Type Object provides schema and examples for the media type +// identified by its key. +message MediaType { + // The schema defining the content of the request, response, or parameter. + Schema schema = 1; + + // Example of the media type. + google.protobuf.Any example = 2; + + // Examples of the media type. + map examples = 3; + + // A map between a property name and its encoding information. + map encoding = 4; +} + +// A single encoding definition applied to a single schema property. +message Encoding { + // The Content-Type for encoding a specific property. + string content_type = 1; + + // A map allowing additional information to be provided as headers. + map headers = 2; + + // Describes how a specific property value will be serialized. + string style = 3; + + // When this is true, property values of type array or object generate + // separate parameters for each value of the array, or key-value-pair of the + // map. + bool explode = 4; + + // Determines whether the parameter value SHOULD allow reserved characters to + // be included without percent-encoding. + bool allow_reserved = 5; +} + +// Example Object +message Example { + // Short description for the example. + string summary = 1; + + // Long description for the example. + string description = 2; + + // Embedded literal example. + google.protobuf.Any value = 3; + + // A URL that points to the literal example. + string external_value = 4; +} + +// The Link object represents a possible design-time link for a response. +message Link { + // A relative or absolute URI reference to an OAS operation. + string operation_ref = 1; + + // The name of an existing, resolvable OAS operation, as defined with a unique + // operationId. + string operation_id = 2; + + // A map representing parameters to pass to an operation as specified with + // operationId or identified via operationRef. + map parameters = 3; + + // A literal value or {expression} to use as a request body when calling the + // target operation. + google.protobuf.Any request_body = 4; + + // A description of the link. + string description = 5; + + // A server object to be used by the target operation. + Server server = 6; +} + +// Describes a single API operation on a path. +message Operation { + // A list of tags for API documentation control. + repeated string tags = 1; + + // A short summary of what the operation does. + string summary = 2; + + // A verbose explanation of the operation behavior. + string description = 3; + + // Additional external documentation for this operation. + ExternalDocumentation external_docs = 4; + + // Unique string used to identify the operation. + string operation_id = 5; + + // A list of parameters that are applicable for this operation. + repeated Parameter parameters = 6; + + // The request body applicable for this operation. + RequestBody request_body = 7; + + // The list of possible responses as they are returned from executing this + // operation. + map responses = 8; + + // A map of possible out-of band callbacks related to the parent operation. + map callbacks = 9; + + // Declares this operation to be deprecated. + bool deprecated = 10; + + // A declaration of which security mechanisms can be used for this operation. + repeated SecurityRequirement security = 11; + + // An alternative server array to service this operation. + repeated Server servers = 12; +} + +// Allows referencing an external resource for extended documentation. +message ExternalDocumentation { + // A description of the target documentation. + string description = 1; + + // REQUIRED. The URL for the target documentation. + string url = 2; +} + +// Describes a single operation parameter. +message Parameter { + // REQUIRED. The name of the parameter. + string name = 1; + + // REQUIRED. The location of the parameter. + string in = 2; + + // A brief description of the parameter. + string description = 3; + + // Determines whether this parameter is mandatory. + bool required = 4; + + // Specifies that a parameter is deprecated. + bool deprecated = 5; + + // Sets the ability to pass empty-valued parameters. + bool allow_empty_value = 6; + + // Describes how the parameter value will be serialized. + string style = 7; + + // When this is true, parameter values of type array or object generate + // separate parameters for each value of the array or key-value pair of the + // map. + bool explode = 8; + + // Determines whether the parameter value SHOULD allow reserved characters to + // be included without percent-encoding. + bool allow_reserved = 9; + + // The schema defining the type used for the parameter. + Schema schema = 10; + + // Example of the parameter's potential value. + google.protobuf.Any example = 11; + + // Examples of the parameter's potential value. + map examples = 12; + + // A map containing the representations for the parameter. + map content = 13; +} + +// Describes a single request body. +message RequestBody { + // A brief description of the request body. + string description = 1; + + // REQUIRED. The content of the request body. + map content = 2; + + // Determines if the request body is required in the request. + bool required = 3; +} + +// A map of possible out-of band callbacks related to the parent operation. +message Callback { + // A Path Item Object used to define a callback operation. + map expression = 1; +} + +// Lists the required security schemes to execute this operation. +message SecurityRequirement { + // Each name must correspond to a security scheme which is declared in the + // Security Schemes under the Components Object. + map additional_properties = 1; +} + +// A list of scopes required for a security scheme in SecurityRequirement. +message SecurityScopes { + // The list of scope names required for this security scheme. + repeated string scopes = 1; +} + +// Describes the operations available on a single path. +message PathItem { + // Allows for an external definition of this path item. + string ref = 1; + + // An optional, string summary, intended to apply to all operations in this + // path. + string summary = 2; + + // An optional, string description, intended to apply to all operations in + // this path. + string description = 3; + + // A definition of a GET operation on this path. + Operation get = 4; + + // A definition of a PUT operation on this path. + Operation put = 5; + + // A definition of a POST operation on this path. + Operation post = 6; + + // A definition of a DELETE operation on this path. + Operation delete = 7; + + // A definition of a OPTIONS operation on this path. + Operation options = 8; + + // A definition of a HEAD operation on this path. + Operation head = 9; + + // A definition of a PATCH operation on this path. + Operation patch = 10; + + // A definition of a TRACE operation on this path. + Operation trace = 11; + + // An alternative server array to service all operations in this path. + repeated Server servers = 12; + + // A list of parameters that are applicable for all the operations described + // under this path. + repeated Parameter parameters = 13; +} + +// Holds the relative paths to the individual endpoints and their operations. +message Paths { + // A relative path to an individual endpoint. + map path = 1; +} + +// When request bodies or response payloads may be one of a number of different +// schemas, a discriminator object can be used to aid in serialization, +// deserialization, and validation. +message Discriminator { + // REQUIRED. The name of the property in the payload that will hold the + // discriminator value. + string property_name = 1; + + // An object to hold mappings between payload values and schema names or + // references. + map mapping = 2; +} + +// A metadata object that allows for more fine-tuned XML model definitions. +message Xml { + // Replaces the name of the element/attribute used for the described schema + // property. + string name = 1; + + // The URI of the namespace definition. + string namespace = 2; + + // The prefix to be used for the name. + string prefix = 3; + + // Declares whether the property definition translates to an attribute instead + // of an element. + bool attribute = 4; + + // MAY be used only for an array definition. Signifies whether the array is + // wrapped. + bool wrapped = 5; +} + +// Defines a security scheme that can be used by the operations. +message SecurityScheme { + // REQUIRED. The type of the security scheme. + string type = 1; + + // A description for security scheme. + string description = 2; + + // REQUIRED (oauth2, openIdConnect). The name of the header, query or cookie + // parameter to be used. + string name = 3; + + // REQUIRED (apiKey). The location of the API key. + string in = 4; + + // REQUIRED (http). The name of the HTTP Authorization scheme to be used. + string scheme = 5; + + // A hint to the client to identify how the bearer token is formatted. + string bearer_format = 6; + + // REQUIRED (oauth2). An object containing configuration information for the + // flow types supported. + OAuthFlows flows = 7; + + // REQUIRED (openIdConnect). OpenId Connect URL to discover OAuth2 + // configuration values. + string open_id_connect_url = 8; +} + +// Allows configuration of the supported OAuth Flows. +message OAuthFlows { + // Configuration for the OAuth Implicit flow. + OAuthFlow implicit = 1; + + // Configuration for the OAuth Resource Owner Password flow. + OAuthFlow password = 2; + + // Configuration for the OAuth Client Credentials flow. + OAuthFlow client_credentials = 3; + + // Configuration for the OAuth Authorization Code flow. + OAuthFlow authorization_code = 4; +} + +// Configuration details for a supported OAuth Flow. +message OAuthFlow { + // REQUIRED (implicit, authorization_code). The authorization URL to be used + // for this flow. + string authorization_url = 1; + + // REQUIRED (password, client_credentials, authorization_code). The token URL + // to be used for this flow. + string token_url = 2; + + // The URL to be used for obtaining refresh tokens. + string refresh_url = 3; + + // REQUIRED. The available scopes for the OAuth2 security scheme. + map scopes = 4; +} + +// Adds metadata to a single tag that is used by the Operation Object. +message Tag { + // REQUIRED. The name of the tag. + string name = 1; + + // A description for the tag. + string description = 2; + + // Additional external documentation for this tag. + ExternalDocumentation external_docs = 3; +} + +// A simple object to allow referencing other components in the specification. +message Reference { + // REQUIRED. The reference string. + string ref = 1; + + // A short summary which by default SHOULD override that of the referenced + // component. + string summary = 2; + + // A description which by default SHOULD override that of the referenced + // component. + string description = 3; +} + +// Enum represents OpenAPI v3 configuration for enum types +message Enum { + // A title for the enum schema. + string title = 1; + + // A description for the enum schema. CommonMark syntax MAY be used for rich text representation. + string description = 2; + + // External documentation for this enum schema. + ExternalDocumentation external_docs = 3; + + // Default value for this enum if none is provided. + string default = 4; + + // Example value to be used in the generated OpenAPI documentation. + string example = 5; + + // Indicates whether this enum is deprecated and should be avoided. + bool deprecated = 6; + + // Custom mapping of enum values to display names in documentation. + map value_descriptions = 7; + + // Additional metadata for the enum schema. + google.protobuf.Struct extensions = 8; +} diff --git a/repositories.bzl b/repositories.bzl index c387ea16a1c..dd1f632a323 100644 --- a/repositories.bzl +++ b/repositories.bzl @@ -185,12 +185,11 @@ def go_repositories(): sum = "h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w=", version = "v1.1.9", ) - go_repository( name = "com_github_davecgh_go_spew", importpath = "github.com/davecgh/go-spew", - sum = "h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=", - version = "v1.1.0", + sum = "h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=", + version = "v1.1.1", ) go_repository( name = "com_github_dgrijalva_jwt_go", @@ -788,7 +787,6 @@ def go_repositories(): sum = "h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=", version = "v0.6.1-0.20240319094008-0393e58bdf10", ) - go_repository( name = "com_github_pmezard_go_difflib", importpath = "github.com/pmezard/go-difflib", @@ -841,8 +839,8 @@ def go_repositories(): go_repository( name = "com_github_rogpeppe_go_internal", importpath = "github.com/rogpeppe/go-internal", - sum = "h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=", - version = "v1.9.0", + sum = "h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=", + version = "v1.12.0", ) go_repository( name = "com_github_russross_blackfriday_v2", @@ -950,8 +948,8 @@ def go_repositories(): go_repository( name = "com_github_stretchr_testify", importpath = "github.com/stretchr/testify", - sum = "h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=", - version = "v1.7.0", + sum = "h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=", + version = "v1.9.0", ) go_repository( name = "com_github_subosito_gotenv",