diff --git a/.env b/.env index 33bc1ff7..4855d5b5 100644 --- a/.env +++ b/.env @@ -7,4 +7,4 @@ APNS_P8_FILE_PATH=/secrets/AuthKey_XXXX.p8 ENVIRONMENT=dev -SENTRY_DSN= \ No newline at end of file +SENTRY_DSN= diff --git a/.github/workflows/ci.yml b/.github/workflows/lint.yml similarity index 76% rename from .github/workflows/ci.yml rename to .github/workflows/lint.yml index 92b0e5a9..1689fa86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/lint.yml @@ -1,14 +1,12 @@ -name: CI +name: lint on: - push: - branches: [ main ] pull_request: permissions: contents: read jobs: - ci: + lint: name: lint runs-on: ubuntu-latest steps: @@ -29,3 +27,7 @@ jobs: version: v1.54 working-directory: client args: --timeout=30m + - run: go install golang.org/x/tools/cmd/goimports@latest + - run: bash server/api/installBuf.bash + - name: pre-commit + uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3a06b89a..48d0b6b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,8 +5,21 @@ on: pull_request: branches: [ main ] jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: '1.21' + cache-dependency-path: | + server/go.sum + - name: run tests + run: go test -v ./... + working-directory: ./server build: runs-on: ubuntu-latest + needs: [test] steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 9f278687..57fd5fe6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,4 @@ __debug_bin .env.local apns_auth_key.p8 - +venv diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..ab232802 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,39 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-json + exclude: vscode/launch.json + - id: check-yaml + exclude: deployment/.* + - id: check-added-large-files + - repo: https://github.com/dnephin/pre-commit-golang + rev: v0.5.0 + hooks: + - id: go-fmt + - id: go-imports + - repo: local + hooks: + - id: regen-protobuf + name: Regenerate protobuf files + files: server/api/ + entry: bash server/api/generate.bash + language: system + pass_filenames: false + stages: [commit] + - id: go-mod-tidy-server + name: Check if go.mod and go.sum are up to date for server + files: server/ + entry: sh -c "(cd server && go mod tidy)" + language: system + pass_filenames: false + stages: [commit] + - id: go-mod-tidy-client + name: Check if go.mod and go.sum are up to date for server + files: server/ + entry: sh -c "(cd client && go mod tidy)" + language: system + pass_filenames: false + stages: [commit] diff --git a/.vscode/launch.json b/.vscode/launch.json index f4211857..ec27b2c2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -29,4 +29,4 @@ "program": "${workspaceFolder}/client/publicServer/client.go", } ] -} \ No newline at end of file +} diff --git a/README.md b/README.md index 7f2dd65c..9617731c 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ To start the server there are environment variables, as well as command line opt ```bash cd server export DB_DSN="Your gorm DB connection string for example: gorm:GORM_USER_PASSWORD@tcp(localhost:3306)/campus_backend" -go run ./main.go [-MensaCron 0] +go run ./main.go ``` #### Environment Variables @@ -72,10 +72,6 @@ There are a few environment variables available: * [REQUIRED] `DB_DSN`: The [GORM](https://gorm.io/) [DB connection string](https://gorm.io/docs/connecting_to_the_database.html#MySQL) for connecting to the MySQL DB. Example: `gorm@tcp(localhost:3306)/campus_backend` * [OPTIONAL] `SENTRY_DSN`: The Sentry [Data Source Name](https://sentry-docs-git-patch-1.sentry.dev/product/sentry-basics/dsn-explainer/) for reporting issues and crashes. -#### Command Line Arguments - -* [OPTIONAL] `-MensaCron 0`: Providing this argument deactivates the Mensa Rating cronjobs if not needed in a local setup. Be aware, this option will change in a future version ([#117](https://github.com/TUM-Dev/Campus-Backend/issues/117) and [#115](https://github.com/TUM-Dev/Campus-Backend/issues/115)). - ## Running the Server (Docker) ```bash docker compose up -d @@ -126,3 +122,18 @@ Take a look at the [`lauch.json`](.vscode/launch.json) file for more details. Please be respectful with its usage! + +## pre-commit + +To ensure that that common pitfalls which can be automated are not done, we recommend you to install `pre-commit`. +You can do so via + +```bash +python -m venv venv +source venv/bin/activate +pip install pre-commit +pre-commit install +``` + +Certain `pre-commit` hooks will now be run on every commit where you change specific files. +If you want to run all files instead, run `pre-commit run -a` diff --git a/client/README.md b/client/README.md index fb333780..0a487f6b 100644 --- a/client/README.md +++ b/client/README.md @@ -6,4 +6,4 @@ standard system TLS CA's configured to securely connect via `api-grpc.tum.app` t Alternatively you can also test the API using [grpcurl](https://github.com/fullstorydev/grpcurl) (also located in the `testLiveApi.sh`): ``` grpcurl -protoset <(buf build -o -) -H "x-device-id:grpc-tests" api-grpc.tum.app:443 api.Campus/GetNewsSources -``` \ No newline at end of file +``` diff --git a/client/go.mod b/client/go.mod index dac32653..2dd88216 100644 --- a/client/go.mod +++ b/client/go.mod @@ -3,23 +3,19 @@ module github.com/TUM-Dev/Campus-Backend/client go 1.21 require ( - github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617 - github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3 + github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 github.com/sirupsen/logrus v1.9.3 - google.golang.org/grpc v1.57.0 + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 ) require ( - github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect - golang.org/x/net v0.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/text v0.9.0 // indirect - google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect ) diff --git a/client/go.sum b/client/go.sum index 21378bde..128161a1 100644 --- a/client/go.sum +++ b/client/go.sum @@ -1,7 +1,5 @@ -github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617 h1:/o27aY5kfd4JnrqtbsMLIGwe+VBqS7j3ovCG/cXtAWk= -github.com/TUM-Dev/Campus-Backend/api v0.0.0-20221212204029-68b05b451617/go.mod h1:hDLh5lxHD53m8/eDGsXJDqc9ONXqbJPa9b6uzpfl8Ow= -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3 h1:b585GRp+ZPA9j2EM0KQSSFiknR2SVF18FcRHRHnIIA4= -github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230111021245-cd17e382bda3/go.mod h1:1gTg0lAImFNZiYKrJ/5OLM2UWoj7zeLzTX1WLJhF7LY= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5 h1:/yMB5hJjFjEPB/HVP6wLTJWGqoCqQksXke+DiV2xUWY= +github.com/TUM-Dev/Campus-Backend/server v0.0.0-20230913203125-6bbe13013fa5/go.mod h1:7XoRdXmxK852GxcyraiovgyS5z/eZ9wsofV9on7wvGQ= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= @@ -13,45 +11,37 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= 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/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54 h1:9NWlQfY2ePejTmfwUH1OWwmznFa+0kKcHGPDvcPza9M= -google.golang.org/genproto v0.0.0-20230526161137-0005af68ea54/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9 h1:m8v1xLLLzMe1m5P+gCTF8nJB9epwZQUBERm20Oy1poQ= -google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 h1:0nDDozoAU19Qb2HwhXadU8OcsiO/09cnTqhUtq2MEOM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/client/localServer/localTestClient.go b/client/localServer/client.go similarity index 97% rename from client/localServer/localTestClient.go rename to client/localServer/client.go index d6c2a2f4..813c8ae7 100644 --- a/client/localServer/localTestClient.go +++ b/client/localServer/client.go @@ -11,7 +11,7 @@ import ( "os" "time" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -48,7 +48,7 @@ func canteenHeadCount(c pb.CampusClient, ctx context.Context) { }) if err != nil { - log.Error(err) + log.WithError(err).Error("Canteen HeadCount data request failed.") } else { log.WithField("res", res).Info("Canteen HeadCount data request successful.") } @@ -245,8 +245,7 @@ func getImageToBytes(path string) []byte { } defer func(file *os.File) { - err := file.Close() - if err != nil { + if err := file.Close(); err != nil { log.WithError(err).Error("could not close file") } }(file) @@ -291,8 +290,7 @@ func storeImage(path string, i []byte) (string, error) { log.WithError(errFile).Error("Unable to create the new testfile") } defer func(out *os.File) { - err := out.Close() - if err != nil { + if err := out.Close(); err != nil { log.WithError(err).Error("File was not closed successfully") } }(out) diff --git a/client/publicServer/client.go b/client/publicServer/client.go index 7db84b6a..24a78d75 100644 --- a/client/publicServer/client.go +++ b/client/publicServer/client.go @@ -3,13 +3,14 @@ package main import ( "context" "crypto/x509" - pb "github.com/TUM-Dev/Campus-Backend/api" + "time" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" log "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/emptypb" - "time" ) const ( @@ -25,11 +26,10 @@ func main() { conn, err := grpc.Dial(address, grpc.WithTransportCredentials(creds)) if err != nil { - log.WithError(err).Fatalf("did not connect") + log.WithError(err).Fatal("did not connect") } defer func(conn *grpc.ClientConn) { - err := conn.Close() - if err != nil { + if err := conn.Close(); err != nil { log.WithError(err).Error("did not close connection") } }(conn) diff --git a/client/testLiveApi.sh b/client/testLiveApi.sh index 5dcac3b8..9a798bc6 100755 --- a/client/testLiveApi.sh +++ b/client/testLiveApi.sh @@ -1,3 +1,3 @@ #!/bin/bash -grpcurl -protoset <(buf build -o -) -plaintext -H "x-device-id:grpc-tests" api.tum.app:50052 api.Campus/GetNewsSources \ No newline at end of file +grpcurl -protoset <(buf build -o -) -plaintext -H "x-device-id:grpc-tests" api.tum.app:50052 api.Campus/GetNewsSources diff --git a/deployment/charts/backend/Chart.yaml b/deployment/charts/backend/Chart.yaml index cbc0eb46..b09fbeb3 100644 --- a/deployment/charts/backend/Chart.yaml +++ b/deployment/charts/backend/Chart.yaml @@ -13,4 +13,4 @@ dependencies: - condition: mariadb.enabled name: mariadb repository: https://charts.bitnami.com/bitnami - version: 12.x.x \ No newline at end of file + version: 12.x.x diff --git a/deployment/charts/backend/templates/deployments/backend-v1.yaml b/deployment/charts/backend/templates/deployments/backend-v1.yaml index 4f1cb86e..5d572c7e 100644 --- a/deployment/charts/backend/templates/deployments/backend-v1.yaml +++ b/deployment/charts/backend/templates/deployments/backend-v1.yaml @@ -40,6 +40,18 @@ spec: - name: logs emptyDir: { } containers: + - name: access-legacybackend + image: busybox:1.36 + args: [/bin/sh, -c, 'tail -n+1 -F /var/log/apache2/access.log'] + volumeMounts: + - name: logs + mountPath: /var/log + - name: error-legacybackend + image: busybox:1.36 + args: [/bin/sh, -c, 'tail -n+1 -F /var/log/apache2/error.log'] + volumeMounts: + - name: logs + mountPath: /var/log - name: tca-legacybackend image: ghcr.io/kordianbruck/tca-backend/tca-server:{{ $.Values.tag }} imagePullPolicy: Always diff --git a/deployment/charts/backend/templates/deployments/backend-v2.yaml b/deployment/charts/backend/templates/deployments/backend-v2.yaml index 310387e7..f037f8f9 100644 --- a/deployment/charts/backend/templates/deployments/backend-v2.yaml +++ b/deployment/charts/backend/templates/deployments/backend-v2.yaml @@ -39,6 +39,8 @@ spec: env: - name: ENVIRONMENT value: prod + - name: MensaCronDisabled + value: "false" - name: APNS_P8_FILE_PATH value: /etc/apns_auth_key.p8 - name: SENTRY_DSN diff --git a/deployment/charts/backend/templates/deployments/hpas.yaml b/deployment/charts/backend/templates/deployments/hpas.yaml index deb358c6..950f7480 100644 --- a/deployment/charts/backend/templates/deployments/hpas.yaml +++ b/deployment/charts/backend/templates/deployments/hpas.yaml @@ -21,4 +21,4 @@ spec: target: type: Utilization averageUtilization: 75 -{{ end }} \ No newline at end of file +{{ end }} diff --git a/docker-compose.yaml b/docker-compose.yaml index 3e4f3727..a7d45018 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,8 +16,11 @@ services: - APNS_KEY_ID=${APNS_KEY_ID} - APNS_TEAM_ID=${APNS_TEAM_ID} - APNS_P8_FILE_PATH=${APNS_P8_FILE_PATH} + - MensaCronDisabled=false volumes: + - backend-storage:/Storage - ./apns_auth_key.p8:${APNS_P8_FILE_PATH} + user: 1000:3000 depends_on: db: condition: service_healthy @@ -41,4 +44,6 @@ services: volumes: campus-db-data: - driver: local \ No newline at end of file + driver: local + backend-storage: + driver: local diff --git a/server/Dockerfile b/server/Dockerfile index dad8bf1f..66da46dd 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -14,6 +14,7 @@ COPY go.mod go.sum ./ RUN go mod download # Copy source code +COPY api/tumdev/campus_backend.swagger.json ./swagger/swagger.json COPY . . # bundle version into binary if specified in build-args, dev otherwise. @@ -29,6 +30,11 @@ COPY --from=builder /backend /backend COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder /etc/passwd /etc/passwd +# make sure that /Storage is mounted with the correct access permissions even in docker-compose +RUN mkdir /Storage +RUN chown appuser /Storage +VOLUME /Storage + # Use an unprivileged user USER appuser diff --git a/server/api/README.md b/server/api/README.md index 611cba16..8686f585 100644 --- a/server/api/README.md +++ b/server/api/README.md @@ -48,23 +48,15 @@ sudo dnf install go protobuf ## Buf Buf is required to generate protobuf files automatically. Follow the installation instructions detailed here: https://docs.buf.build/installation#github-releases +Alternatively, we have prepared this installation script: -## Go Dependencies - -```bash -go get google.golang.org/protobuf/cmd/protoc-gen-go \ - google.golang.org/grpc/cmd/protoc-gen-go-grpc - -go install \ - github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ - github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \ - google.golang.org/protobuf/cmd/protoc-gen-go \ - google.golang.org/grpc/cmd/protoc-gen-go-grpc +```shell +sh installBuf.bash ``` ## Generating -Once you have installed all dependencies, run `./generate.sh` to update the client and server `Protocol Buffers` definitions. +Once you have installed all dependencies, run `./generate.bash` to update the client and server `Protocol Buffers` definitions. # Common Issues diff --git a/server/api/buf.gen.yaml b/server/api/buf.gen.yaml index 437c5a87..6f658a48 100644 --- a/server/api/buf.gen.yaml +++ b/server/api/buf.gen.yaml @@ -14,6 +14,6 @@ plugins: - paths=source_relative - allow_repeated_fields_in_body=true - name: openapiv2 - out: gen/openapiv2 + out: . opt: - allow_repeated_fields_in_body=true diff --git a/server/api/buf.lock b/server/api/buf.lock index 6c4355d4..c91b5810 100644 --- a/server/api/buf.lock +++ b/server/api/buf.lock @@ -1,8 +1,2 @@ # Generated by buf. DO NOT EDIT. version: v1 -deps: - - remote: buf.build - owner: googleapis - repository: googleapis - commit: 28151c0d0a1641bf938a7672c500e01d - digest: shake256:49215edf8ef57f7863004539deff8834cfb2195113f0b890dd1f67815d9353e28e668019165b9d872395871eeafcbab3ccfdb2b5f11734d3cca95be9e8d139de diff --git a/server/api/buf.yaml b/server/api/buf.yaml index 732d25a3..9ed7e989 100644 --- a/server/api/buf.yaml +++ b/server/api/buf.yaml @@ -1,6 +1,5 @@ version: v1 -deps: - - buf.build/googleapis/googleapis +deps: [] lint: use: - DEFAULT diff --git a/server/api/generate.bash b/server/api/generate.bash new file mode 100755 index 00000000..1e0c93e7 --- /dev/null +++ b/server/api/generate.bash @@ -0,0 +1,24 @@ +#!/bin/bash + +# needs buf: https://docs.buf.build/installation#github-releases +BASEDIR=$(dirname "$0") +echo making sure that this script is run from $BASEDIR +pushd $BASEDIR > /dev/null + +echo updating the generated files +buf mod update || exit 1 +buf generate || exit 1 + +echo making sure the openapi document points to the valid api +grep -q '"basePath": "/v1"' ./tumdev/campus_backend.swagger.json || sed -i '1 a "basePath": "/v1",' ./tumdev/campus_backend.swagger.json + +echo making sure that all artifacts we don\'t need are cleaned up +rm -f google/api/*.go +rm -f google/api/*.swagger.json + +echo maing sure that the generated files are formatted +go fmt tumdev/*.go +goimports -w tumdev/*.go + +# clean up the stack +popd > /dev/null diff --git a/server/api/generate.sh b/server/api/generate.sh deleted file mode 100755 index ac530f71..00000000 --- a/server/api/generate.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# needs buf: https://docs.buf.build/installation#github-releases - -buf mod update -buf generate - -sed -i '1 a "basePath": "/v1",' ./gen/openapiv2/CampusService.swagger.json -cp ./gen/openapiv2/CampusService.swagger.json ../../server/swagger/swagger.json - diff --git a/server/api/google/api/annotations.proto b/server/api/google/api/annotations.proto new file mode 100644 index 00000000..efdab3db --- /dev/null +++ b/server/api/google/api/annotations.proto @@ -0,0 +1,31 @@ +// Copyright 2015 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +import "google/api/http.proto"; +import "google/protobuf/descriptor.proto"; + +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "AnnotationsProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +extend google.protobuf.MethodOptions { + // See `HttpRule`. + HttpRule http = 72295728; +} diff --git a/server/api/google/api/http.proto b/server/api/google/api/http.proto new file mode 100644 index 00000000..31d867a2 --- /dev/null +++ b/server/api/google/api/http.proto @@ -0,0 +1,379 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package google.api; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations"; +option java_multiple_files = true; +option java_outer_classname = "HttpProto"; +option java_package = "com.google.api"; +option objc_class_prefix = "GAPI"; + +// Defines the HTTP configuration for an API service. It contains a list of +// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method +// to one or more HTTP REST API methods. +message Http { + // A list of HTTP configuration rules that apply to individual API methods. + // + // **NOTE:** All service configuration rules follow "last one wins" order. + repeated HttpRule rules = 1; + + // When set to true, URL path parameters will be fully URI-decoded except in + // cases of single segment matches in reserved expansion, where "%2F" will be + // left encoded. + // + // The default behavior is to not decode RFC 6570 reserved characters in multi + // segment matches. + bool fully_decode_reserved_expansion = 2; +} + +// # gRPC Transcoding +// +// gRPC Transcoding is a feature for mapping between a gRPC method and one or +// more HTTP REST endpoints. It allows developers to build a single API service +// that supports both gRPC APIs and REST APIs. Many systems, including [Google +// APIs](https://github.com/googleapis/googleapis), +// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC +// Gateway](https://github.com/grpc-ecosystem/grpc-gateway), +// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature +// and use it for large scale production services. +// +// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies +// how different portions of the gRPC request message are mapped to the URL +// path, URL query parameters, and HTTP request body. It also controls how the +// gRPC response message is mapped to the HTTP response body. `HttpRule` is +// typically specified as an `google.api.http` annotation on the gRPC method. +// +// Each mapping specifies a URL path template and an HTTP method. The path +// template may refer to one or more fields in the gRPC request message, as long +// as each field is a non-repeated field with a primitive (non-message) type. +// The path template controls how fields of the request message are mapped to +// the URL path. +// +// Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/{name=messages/*}" +// }; +// } +// } +// message GetMessageRequest { +// string name = 1; // Mapped to URL path. +// } +// message Message { +// string text = 1; // The resource content. +// } +// +// This enables an HTTP REST to gRPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(name: "messages/123456")` +// +// Any fields in the request message which are not bound by the path template +// automatically become HTTP query parameters if there is no HTTP request body. +// For example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get:"/v1/messages/{message_id}" +// }; +// } +// } +// message GetMessageRequest { +// message SubMessage { +// string subfield = 1; +// } +// string message_id = 1; // Mapped to URL path. +// int64 revision = 2; // Mapped to URL query parameter `revision`. +// SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. +// } +// +// This enables a HTTP JSON to RPC mapping as below: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | +// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: +// "foo"))` +// +// Note that fields which are mapped to URL query parameters must have a +// primitive type or a repeated primitive type or a non-repeated message type. +// In the case of a repeated type, the parameter can be repeated in the URL +// as `...?param=A¶m=B`. In the case of a message type, each field of the +// message is mapped to a separate parameter, such as +// `...?foo.a=A&foo.b=B&foo.c=C`. +// +// For HTTP methods that allow a request body, the `body` field +// specifies the mapping. Consider a REST update method on the +// message resource collection: +// +// service Messaging { +// rpc UpdateMessage(UpdateMessageRequest) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "message" +// }; +// } +// } +// message UpdateMessageRequest { +// string message_id = 1; // mapped to the URL +// Message message = 2; // mapped to the body +// } +// +// The following HTTP JSON to RPC mapping is enabled, where the +// representation of the JSON in the request body is determined by +// protos JSON encoding: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" message { text: "Hi!" })` +// +// The special name `*` can be used in the body mapping to define that +// every field not bound by the path template should be mapped to the +// request body. This enables the following alternative definition of +// the update method: +// +// service Messaging { +// rpc UpdateMessage(Message) returns (Message) { +// option (google.api.http) = { +// patch: "/v1/messages/{message_id}" +// body: "*" +// }; +// } +// } +// message Message { +// string message_id = 1; +// string text = 2; +// } +// +// +// The following HTTP JSON to RPC mapping is enabled: +// +// HTTP | gRPC +// -----|----- +// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: +// "123456" text: "Hi!")` +// +// Note that when using `*` in the body mapping, it is not possible to +// have HTTP parameters, as all fields not bound by the path end in +// the body. This makes this option more rarely used in practice when +// defining REST APIs. The common usage of `*` is in custom methods +// which don't use the URL at all for transferring data. +// +// It is possible to define multiple HTTP methods for one RPC by using +// the `additional_bindings` option. Example: +// +// service Messaging { +// rpc GetMessage(GetMessageRequest) returns (Message) { +// option (google.api.http) = { +// get: "/v1/messages/{message_id}" +// additional_bindings { +// get: "/v1/users/{user_id}/messages/{message_id}" +// } +// }; +// } +// } +// message GetMessageRequest { +// string message_id = 1; +// string user_id = 2; +// } +// +// This enables the following two alternative HTTP JSON to RPC mappings: +// +// HTTP | gRPC +// -----|----- +// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")` +// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: +// "123456")` +// +// ## Rules for HTTP mapping +// +// 1. Leaf request fields (recursive expansion nested messages in the request +// message) are classified into three categories: +// - Fields referred by the path template. They are passed via the URL path. +// - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They +// are passed via the HTTP +// request body. +// - All other fields are passed via the URL query parameters, and the +// parameter name is the field path in the request message. A repeated +// field can be represented as multiple query parameters under the same +// name. +// 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL +// query parameter, all fields +// are passed via URL path and HTTP request body. +// 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP +// request body, all +// fields are passed via URL path and URL query parameters. +// +// ### Path template syntax +// +// Template = "/" Segments [ Verb ] ; +// Segments = Segment { "/" Segment } ; +// Segment = "*" | "**" | LITERAL | Variable ; +// Variable = "{" FieldPath [ "=" Segments ] "}" ; +// FieldPath = IDENT { "." IDENT } ; +// Verb = ":" LITERAL ; +// +// The syntax `*` matches a single URL path segment. The syntax `**` matches +// zero or more URL path segments, which must be the last part of the URL path +// except the `Verb`. +// +// The syntax `Variable` matches part of the URL path as specified by its +// template. A variable template must not contain other variables. If a variable +// matches a single path segment, its template may be omitted, e.g. `{var}` +// is equivalent to `{var=*}`. +// +// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` +// contains any reserved character, such characters should be percent-encoded +// before the matching. +// +// If a variable contains exactly one path segment, such as `"{var}"` or +// `"{var=*}"`, when such a variable is expanded into a URL path on the client +// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The +// server side does the reverse decoding. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{var}`. +// +// If a variable contains multiple path segments, such as `"{var=foo/*}"` +// or `"{var=**}"`, when such a variable is expanded into a URL path on the +// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. +// The server side does the reverse decoding, except "%2F" and "%2f" are left +// unchanged. Such variables show up in the +// [Discovery +// Document](https://developers.google.com/discovery/v1/reference/apis) as +// `{+var}`. +// +// ## Using gRPC API Service Configuration +// +// gRPC API Service Configuration (service config) is a configuration language +// for configuring a gRPC service to become a user-facing product. The +// service config is simply the YAML representation of the `google.api.Service` +// proto message. +// +// As an alternative to annotating your proto file, you can configure gRPC +// transcoding in your service config YAML files. You do this by specifying a +// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same +// effect as the proto annotation. This can be particularly useful if you +// have a proto that is reused in multiple services. Note that any transcoding +// specified in the service config will override any matching transcoding +// configuration in the proto. +// +// Example: +// +// http: +// rules: +// # Selects a gRPC method and applies HttpRule to it. +// - selector: example.v1.Messaging.GetMessage +// get: /v1/messages/{message_id}/{sub.subfield} +// +// ## Special notes +// +// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the +// proto to JSON conversion must follow the [proto3 +// specification](https://developers.google.com/protocol-buffers/docs/proto3#json). +// +// While the single segment variable follows the semantics of +// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String +// Expansion, the multi segment variable **does not** follow RFC 6570 Section +// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion +// does not expand special characters like `?` and `#`, which would lead +// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding +// for multi segment variables. +// +// The path variables **must not** refer to any repeated or mapped field, +// because client libraries are not capable of handling such variable expansion. +// +// The path variables **must not** capture the leading "/" character. The reason +// is that the most common use case "{var}" does not capture the leading "/" +// character. For consistency, all path variables must share the same behavior. +// +// Repeated message fields must not be mapped to URL query parameters, because +// no client library can support such complicated mapping. +// +// If an API needs to use a JSON array for request or response body, it can map +// the request or response body to a repeated field. However, some gRPC +// Transcoding implementations may not support this feature. +message HttpRule { + // Selects a method to which this rule applies. + // + // Refer to [selector][google.api.DocumentationRule.selector] for syntax + // details. + string selector = 1; + + // Determines the URL pattern is matched by this rules. This pattern can be + // used with any of the {get|put|post|delete|patch} methods. A custom method + // can be defined using the 'custom' field. + oneof pattern { + // Maps to HTTP GET. Used for listing and getting information about + // resources. + string get = 2; + + // Maps to HTTP PUT. Used for replacing a resource. + string put = 3; + + // Maps to HTTP POST. Used for creating a resource or performing an action. + string post = 4; + + // Maps to HTTP DELETE. Used for deleting a resource. + string delete = 5; + + // Maps to HTTP PATCH. Used for updating a resource. + string patch = 6; + + // The custom pattern is used for specifying an HTTP method that is not + // included in the `pattern` field, such as HEAD, or "*" to leave the + // HTTP method unspecified for this rule. The wild-card rule is useful + // for services that provide content to Web (HTML) clients. + CustomHttpPattern custom = 8; + } + + // The name of the request field whose value is mapped to the HTTP request + // body, or `*` for mapping all request fields not captured by the path + // pattern to the HTTP body, or omitted for not having any HTTP request body. + // + // NOTE: the referred field must be present at the top-level of the request + // message type. + string body = 7; + + // Optional. The name of the response field whose value is mapped to the HTTP + // response body. When omitted, the entire response message will be used + // as the HTTP response body. + // + // NOTE: The referred field must be present at the top-level of the response + // message type. + string response_body = 12; + + // Additional HTTP bindings for the selector. Nested bindings must + // not contain an `additional_bindings` field themselves (that is, + // the nesting may only be one level deep). + repeated HttpRule additional_bindings = 11; +} + +// A custom pattern is used for defining custom HTTP verb. +message CustomHttpPattern { + // The name of this custom HTTP verb. + string kind = 1; + + // The path matched by this custom verb. + string path = 2; +} diff --git a/server/api/installBuf.bash b/server/api/installBuf.bash new file mode 100755 index 00000000..4c0712bc --- /dev/null +++ b/server/api/installBuf.bash @@ -0,0 +1,26 @@ +#!/bin/bash + +BASEDIR=$(dirname "$0") +echo making sure that this script is run from $BASEDIR +pushd $BASEDIR > /dev/null + +echo downloading... +go get github.com/bufbuild/buf/cmd/buf \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \ + google.golang.org/protobuf/cmd/protoc-gen-go \ + google.golang.org/grpc/cmd/protoc-gen-go-grpc + +echo installing... +go install \ + github.com/bufbuild/buf/cmd/buf \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway \ + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 \ + google.golang.org/protobuf/cmd/protoc-gen-go \ + google.golang.org/grpc/cmd/protoc-gen-go-grpc + + +echo tidiing up +go mod tidy + +popd diff --git a/server/api/installBuf.sh b/server/api/installBuf.sh deleted file mode 100755 index 15e67a96..00000000 --- a/server/api/installBuf.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -go get github.com/bufbuild/buf/cmd/buf -go install github.com/bufbuild/buf/cmd/buf \ No newline at end of file diff --git a/server/api/tools.go b/server/api/tools.go deleted file mode 100644 index bbd86db1..00000000 --- a/server/api/tools.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tools -// +build tools - -package api - -import ( - _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway" - _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2" - _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" - _ "google.golang.org/protobuf/cmd/protoc-gen-go" -) diff --git a/server/api/CampusService.pb.go b/server/api/tumdev/campus_backend.pb.go similarity index 62% rename from server/api/CampusService.pb.go rename to server/api/tumdev/campus_backend.pb.go index 17822865..bad3746d 100644 --- a/server/api/CampusService.pb.go +++ b/server/api/tumdev/campus_backend.pb.go @@ -2,18 +2,19 @@ // versions: // protoc-gen-go v1.31.0 // protoc (unknown) -// source: CampusService.proto +// source: tumdev/campus_backend.proto package api import ( + reflect "reflect" + sync "sync" + _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" ) const ( @@ -56,11 +57,11 @@ func (x DeviceType) String() string { } func (DeviceType) Descriptor() protoreflect.EnumDescriptor { - return file_CampusService_proto_enumTypes[0].Descriptor() + return file_tumdev_campus_backend_proto_enumTypes[0].Descriptor() } func (DeviceType) Type() protoreflect.EnumType { - return &file_CampusService_proto_enumTypes[0] + return &file_tumdev_campus_backend_proto_enumTypes[0] } func (x DeviceType) Number() protoreflect.EnumNumber { @@ -69,7 +70,7 @@ func (x DeviceType) Number() protoreflect.EnumNumber { // Deprecated: Use DeviceType.Descriptor instead. func (DeviceType) EnumDescriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{0} } type RegisterDeviceRequest struct { @@ -85,7 +86,7 @@ type RegisterDeviceRequest struct { func (x *RegisterDeviceRequest) Reset() { *x = RegisterDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[0] + mi := &file_tumdev_campus_backend_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -98,7 +99,7 @@ func (x *RegisterDeviceRequest) String() string { func (*RegisterDeviceRequest) ProtoMessage() {} func (x *RegisterDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[0] + mi := &file_tumdev_campus_backend_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -111,7 +112,7 @@ func (x *RegisterDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterDeviceRequest.ProtoReflect.Descriptor instead. func (*RegisterDeviceRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{0} } func (x *RegisterDeviceRequest) GetDeviceId() string { @@ -146,7 +147,7 @@ type RegisterDeviceReply struct { func (x *RegisterDeviceReply) Reset() { *x = RegisterDeviceReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[1] + mi := &file_tumdev_campus_backend_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -159,7 +160,7 @@ func (x *RegisterDeviceReply) String() string { func (*RegisterDeviceReply) ProtoMessage() {} func (x *RegisterDeviceReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[1] + mi := &file_tumdev_campus_backend_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -172,7 +173,7 @@ func (x *RegisterDeviceReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RegisterDeviceReply.ProtoReflect.Descriptor instead. func (*RegisterDeviceReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{1} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{1} } func (x *RegisterDeviceReply) GetDeviceId() string { @@ -194,7 +195,7 @@ type RemoveDeviceRequest struct { func (x *RemoveDeviceRequest) Reset() { *x = RemoveDeviceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[2] + mi := &file_tumdev_campus_backend_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -207,7 +208,7 @@ func (x *RemoveDeviceRequest) String() string { func (*RemoveDeviceRequest) ProtoMessage() {} func (x *RemoveDeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[2] + mi := &file_tumdev_campus_backend_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -220,7 +221,7 @@ func (x *RemoveDeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveDeviceRequest.ProtoReflect.Descriptor instead. func (*RemoveDeviceRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{2} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{2} } func (x *RemoveDeviceRequest) GetDeviceId() string { @@ -248,7 +249,7 @@ type RemoveDeviceReply struct { func (x *RemoveDeviceReply) Reset() { *x = RemoveDeviceReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[3] + mi := &file_tumdev_campus_backend_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -261,7 +262,7 @@ func (x *RemoveDeviceReply) String() string { func (*RemoveDeviceReply) ProtoMessage() {} func (x *RemoveDeviceReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[3] + mi := &file_tumdev_campus_backend_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -274,7 +275,7 @@ func (x *RemoveDeviceReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveDeviceReply.ProtoReflect.Descriptor instead. func (*RemoveDeviceReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{3} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{3} } func (x *RemoveDeviceReply) GetDeviceId() string { @@ -296,7 +297,7 @@ type IOSDeviceRequestResponseRequest struct { func (x *IOSDeviceRequestResponseRequest) Reset() { *x = IOSDeviceRequestResponseRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[4] + mi := &file_tumdev_campus_backend_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -309,7 +310,7 @@ func (x *IOSDeviceRequestResponseRequest) String() string { func (*IOSDeviceRequestResponseRequest) ProtoMessage() {} func (x *IOSDeviceRequestResponseRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[4] + mi := &file_tumdev_campus_backend_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -322,7 +323,7 @@ func (x *IOSDeviceRequestResponseRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use IOSDeviceRequestResponseRequest.ProtoReflect.Descriptor instead. func (*IOSDeviceRequestResponseRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{4} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{4} } func (x *IOSDeviceRequestResponseRequest) GetRequestId() string { @@ -350,7 +351,7 @@ type IOSDeviceRequestResponseReply struct { func (x *IOSDeviceRequestResponseReply) Reset() { *x = IOSDeviceRequestResponseReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[5] + mi := &file_tumdev_campus_backend_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -363,7 +364,7 @@ func (x *IOSDeviceRequestResponseReply) String() string { func (*IOSDeviceRequestResponseReply) ProtoMessage() {} func (x *IOSDeviceRequestResponseReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[5] + mi := &file_tumdev_campus_backend_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -376,7 +377,7 @@ func (x *IOSDeviceRequestResponseReply) ProtoReflect() protoreflect.Message { // Deprecated: Use IOSDeviceRequestResponseReply.ProtoReflect.Descriptor instead. func (*IOSDeviceRequestResponseReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{5} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{5} } func (x *IOSDeviceRequestResponseReply) GetMessage() string { @@ -399,7 +400,7 @@ type GetRoomScheduleRequest struct { func (x *GetRoomScheduleRequest) Reset() { *x = GetRoomScheduleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[6] + mi := &file_tumdev_campus_backend_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -412,7 +413,7 @@ func (x *GetRoomScheduleRequest) String() string { func (*GetRoomScheduleRequest) ProtoMessage() {} func (x *GetRoomScheduleRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[6] + mi := &file_tumdev_campus_backend_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +426,7 @@ func (x *GetRoomScheduleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomScheduleRequest.ProtoReflect.Descriptor instead. func (*GetRoomScheduleRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{6} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{6} } func (x *GetRoomScheduleRequest) GetRoom() int32 { @@ -460,7 +461,7 @@ type GetRoomScheduleReply struct { func (x *GetRoomScheduleReply) Reset() { *x = GetRoomScheduleReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[7] + mi := &file_tumdev_campus_backend_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -473,7 +474,7 @@ func (x *GetRoomScheduleReply) String() string { func (*GetRoomScheduleReply) ProtoMessage() {} func (x *GetRoomScheduleReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[7] + mi := &file_tumdev_campus_backend_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -486,7 +487,7 @@ func (x *GetRoomScheduleReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomScheduleReply.ProtoReflect.Descriptor instead. func (*GetRoomScheduleReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{7} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7} } func (x *GetRoomScheduleReply) GetEvents() []*GetRoomScheduleReply_RoomScheduleEvent { @@ -507,7 +508,7 @@ type GetRoomCoordinatesRequest struct { func (x *GetRoomCoordinatesRequest) Reset() { *x = GetRoomCoordinatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[8] + mi := &file_tumdev_campus_backend_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -520,7 +521,7 @@ func (x *GetRoomCoordinatesRequest) String() string { func (*GetRoomCoordinatesRequest) ProtoMessage() {} func (x *GetRoomCoordinatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[8] + mi := &file_tumdev_campus_backend_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -533,7 +534,7 @@ func (x *GetRoomCoordinatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomCoordinatesRequest.ProtoReflect.Descriptor instead. func (*GetRoomCoordinatesRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{8} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{8} } func (x *GetRoomCoordinatesRequest) GetArchId() string { @@ -556,7 +557,7 @@ type GetRoomCoordinatesReply struct { func (x *GetRoomCoordinatesReply) Reset() { *x = GetRoomCoordinatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[9] + mi := &file_tumdev_campus_backend_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -569,7 +570,7 @@ func (x *GetRoomCoordinatesReply) String() string { func (*GetRoomCoordinatesReply) ProtoMessage() {} func (x *GetRoomCoordinatesReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[9] + mi := &file_tumdev_campus_backend_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -582,7 +583,7 @@ func (x *GetRoomCoordinatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomCoordinatesReply.ProtoReflect.Descriptor instead. func (*GetRoomCoordinatesReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{9} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{9} } func (x *GetRoomCoordinatesReply) GetUtmZone() string { @@ -617,7 +618,7 @@ type GetRoomMapsRequest struct { func (x *GetRoomMapsRequest) Reset() { *x = GetRoomMapsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[10] + mi := &file_tumdev_campus_backend_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -630,7 +631,7 @@ func (x *GetRoomMapsRequest) String() string { func (*GetRoomMapsRequest) ProtoMessage() {} func (x *GetRoomMapsRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[10] + mi := &file_tumdev_campus_backend_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -643,7 +644,7 @@ func (x *GetRoomMapsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomMapsRequest.ProtoReflect.Descriptor instead. func (*GetRoomMapsRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{10} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{10} } func (x *GetRoomMapsRequest) GetArchId() string { @@ -664,7 +665,7 @@ type GetRoomMapsReply struct { func (x *GetRoomMapsReply) Reset() { *x = GetRoomMapsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[11] + mi := &file_tumdev_campus_backend_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -677,7 +678,7 @@ func (x *GetRoomMapsReply) String() string { func (*GetRoomMapsReply) ProtoMessage() {} func (x *GetRoomMapsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[11] + mi := &file_tumdev_campus_backend_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -690,7 +691,7 @@ func (x *GetRoomMapsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomMapsReply.ProtoReflect.Descriptor instead. func (*GetRoomMapsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{11} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11} } func (x *GetRoomMapsReply) GetMaps() []*GetRoomMapsReply_Map { @@ -711,7 +712,7 @@ type GetLocationsRequest struct { func (x *GetLocationsRequest) Reset() { *x = GetLocationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[12] + mi := &file_tumdev_campus_backend_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -724,7 +725,7 @@ func (x *GetLocationsRequest) String() string { func (*GetLocationsRequest) ProtoMessage() {} func (x *GetLocationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[12] + mi := &file_tumdev_campus_backend_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -737,7 +738,7 @@ func (x *GetLocationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLocationsRequest.ProtoReflect.Descriptor instead. func (*GetLocationsRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{12} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{12} } func (x *GetLocationsRequest) GetLocation() string { @@ -758,7 +759,7 @@ type GetLocationsReply struct { func (x *GetLocationsReply) Reset() { *x = GetLocationsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[13] + mi := &file_tumdev_campus_backend_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -771,7 +772,7 @@ func (x *GetLocationsReply) String() string { func (*GetLocationsReply) ProtoMessage() {} func (x *GetLocationsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[13] + mi := &file_tumdev_campus_backend_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -784,7 +785,7 @@ func (x *GetLocationsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLocationsReply.ProtoReflect.Descriptor instead. func (*GetLocationsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{13} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13} } func (x *GetLocationsReply) GetLocations() []*GetLocationsReply_Location { @@ -805,7 +806,7 @@ type SearchRoomsRequest struct { func (x *SearchRoomsRequest) Reset() { *x = SearchRoomsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[14] + mi := &file_tumdev_campus_backend_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -818,7 +819,7 @@ func (x *SearchRoomsRequest) String() string { func (*SearchRoomsRequest) ProtoMessage() {} func (x *SearchRoomsRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[14] + mi := &file_tumdev_campus_backend_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -831,7 +832,7 @@ func (x *SearchRoomsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchRoomsRequest.ProtoReflect.Descriptor instead. func (*SearchRoomsRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{14} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{14} } func (x *SearchRoomsRequest) GetQuery() string { @@ -852,7 +853,7 @@ type SearchRoomsReply struct { func (x *SearchRoomsReply) Reset() { *x = SearchRoomsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[15] + mi := &file_tumdev_campus_backend_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -865,7 +866,7 @@ func (x *SearchRoomsReply) String() string { func (*SearchRoomsReply) ProtoMessage() {} func (x *SearchRoomsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[15] + mi := &file_tumdev_campus_backend_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -878,7 +879,7 @@ func (x *SearchRoomsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchRoomsReply.ProtoReflect.Descriptor instead. func (*SearchRoomsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{15} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{15} } func (x *SearchRoomsReply) GetRooms() []*Room { @@ -907,7 +908,7 @@ type Room struct { func (x *Room) Reset() { *x = Room{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[16] + mi := &file_tumdev_campus_backend_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -920,7 +921,7 @@ func (x *Room) String() string { func (*Room) ProtoMessage() {} func (x *Room) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[16] + mi := &file_tumdev_campus_backend_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -933,7 +934,7 @@ func (x *Room) ProtoReflect() protoreflect.Message { // Deprecated: Use Room.ProtoReflect.Descriptor instead. func (*Room) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{16} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{16} } func (x *Room) GetRoomId() int32 { @@ -999,7 +1000,7 @@ func (x *Room) GetName() string { return "" } -type NewsSourceArray struct { +type NewsSourceReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -1007,23 +1008,23 @@ type NewsSourceArray struct { Sources []*NewsSource `protobuf:"bytes,1,rep,name=sources,proto3" json:"sources,omitempty"` } -func (x *NewsSourceArray) Reset() { - *x = NewsSourceArray{} +func (x *NewsSourceReply) Reset() { + *x = NewsSourceReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[17] + mi := &file_tumdev_campus_backend_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NewsSourceArray) String() string { +func (x *NewsSourceReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewsSourceArray) ProtoMessage() {} +func (*NewsSourceReply) ProtoMessage() {} -func (x *NewsSourceArray) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[17] +func (x *NewsSourceReply) ProtoReflect() protoreflect.Message { + mi := &file_tumdev_campus_backend_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1034,12 +1035,12 @@ func (x *NewsSourceArray) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewsSourceArray.ProtoReflect.Descriptor instead. -func (*NewsSourceArray) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{17} +// Deprecated: Use NewsSourceReply.ProtoReflect.Descriptor instead. +func (*NewsSourceReply) Descriptor() ([]byte, []int) { + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{17} } -func (x *NewsSourceArray) GetSources() []*NewsSource { +func (x *NewsSourceReply) GetSources() []*NewsSource { if x != nil { return x.Sources } @@ -1059,7 +1060,7 @@ type NewsSource struct { func (x *NewsSource) Reset() { *x = NewsSource{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[18] + mi := &file_tumdev_campus_backend_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1072,7 +1073,7 @@ func (x *NewsSource) String() string { func (*NewsSource) ProtoMessage() {} func (x *NewsSource) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[18] + mi := &file_tumdev_campus_backend_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1085,7 +1086,7 @@ func (x *NewsSource) ProtoReflect() protoreflect.Message { // Deprecated: Use NewsSource.ProtoReflect.Descriptor instead. func (*NewsSource) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{18} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{18} } func (x *NewsSource) GetSource() string { @@ -1124,7 +1125,7 @@ type GetTopNewsReply struct { func (x *GetTopNewsReply) Reset() { *x = GetTopNewsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[19] + mi := &file_tumdev_campus_backend_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1137,7 +1138,7 @@ func (x *GetTopNewsReply) String() string { func (*GetTopNewsReply) ProtoMessage() {} func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[19] + mi := &file_tumdev_campus_backend_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1150,7 +1151,7 @@ func (x *GetTopNewsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTopNewsReply.ProtoReflect.Descriptor instead. func (*GetTopNewsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{19} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{19} } func (x *GetTopNewsReply) GetImageUrl() string { @@ -1206,7 +1207,7 @@ type CafeteriaRatingRequest struct { func (x *CafeteriaRatingRequest) Reset() { *x = CafeteriaRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[20] + mi := &file_tumdev_campus_backend_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1219,7 +1220,7 @@ func (x *CafeteriaRatingRequest) String() string { func (*CafeteriaRatingRequest) ProtoMessage() {} func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[20] + mi := &file_tumdev_campus_backend_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1232,7 +1233,7 @@ func (x *CafeteriaRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CafeteriaRatingRequest.ProtoReflect.Descriptor instead. func (*CafeteriaRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{20} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{20} } func (x *CafeteriaRatingRequest) GetCafeteriaId() string { @@ -1283,7 +1284,7 @@ type DishRatingRequest struct { func (x *DishRatingRequest) Reset() { *x = DishRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[21] + mi := &file_tumdev_campus_backend_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1296,7 +1297,7 @@ func (x *DishRatingRequest) String() string { func (*DishRatingRequest) ProtoMessage() {} func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[21] + mi := &file_tumdev_campus_backend_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1309,7 +1310,7 @@ func (x *DishRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DishRatingRequest.ProtoReflect.Descriptor instead. func (*DishRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{21} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{21} } func (x *DishRatingRequest) GetCafeteriaId() string { @@ -1363,7 +1364,7 @@ type CafeteriaRatingReply struct { func (x *CafeteriaRatingReply) Reset() { *x = CafeteriaRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[22] + mi := &file_tumdev_campus_backend_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1376,7 +1377,7 @@ func (x *CafeteriaRatingReply) String() string { func (*CafeteriaRatingReply) ProtoMessage() {} func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[22] + mi := &file_tumdev_campus_backend_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1389,7 +1390,7 @@ func (x *CafeteriaRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CafeteriaRatingReply.ProtoReflect.Descriptor instead. func (*CafeteriaRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{22} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{22} } func (x *CafeteriaRatingReply) GetRating() []*SingleRatingReply { @@ -1451,7 +1452,7 @@ type DishRatingReply struct { func (x *DishRatingReply) Reset() { *x = DishRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[23] + mi := &file_tumdev_campus_backend_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1464,7 +1465,7 @@ func (x *DishRatingReply) String() string { func (*DishRatingReply) ProtoMessage() {} func (x *DishRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[23] + mi := &file_tumdev_campus_backend_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1477,7 +1478,7 @@ func (x *DishRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use DishRatingReply.ProtoReflect.Descriptor instead. func (*DishRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{23} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{23} } func (x *DishRatingReply) GetRating() []*SingleRatingReply { @@ -1547,7 +1548,7 @@ type SingleRatingReply struct { func (x *SingleRatingReply) Reset() { *x = SingleRatingReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[24] + mi := &file_tumdev_campus_backend_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1560,7 +1561,7 @@ func (x *SingleRatingReply) String() string { func (*SingleRatingReply) ProtoMessage() {} func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[24] + mi := &file_tumdev_campus_backend_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1573,7 +1574,7 @@ func (x *SingleRatingReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleRatingReply.ProtoReflect.Descriptor instead. func (*SingleRatingReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{24} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{24} } func (x *SingleRatingReply) GetPoints() int32 { @@ -1629,7 +1630,7 @@ type NewCafeteriaRatingRequest struct { func (x *NewCafeteriaRatingRequest) Reset() { *x = NewCafeteriaRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[25] + mi := &file_tumdev_campus_backend_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1642,7 +1643,7 @@ func (x *NewCafeteriaRatingRequest) String() string { func (*NewCafeteriaRatingRequest) ProtoMessage() {} func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[25] + mi := &file_tumdev_campus_backend_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1655,7 +1656,7 @@ func (x *NewCafeteriaRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewCafeteriaRatingRequest.ProtoReflect.Descriptor instead. func (*NewCafeteriaRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{25} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{25} } func (x *NewCafeteriaRatingRequest) GetPoints() int32 { @@ -1715,7 +1716,7 @@ type NewDishRatingRequest struct { func (x *NewDishRatingRequest) Reset() { *x = NewDishRatingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[26] + mi := &file_tumdev_campus_backend_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1728,7 +1729,7 @@ func (x *NewDishRatingRequest) String() string { func (*NewDishRatingRequest) ProtoMessage() {} func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[26] + mi := &file_tumdev_campus_backend_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1741,7 +1742,7 @@ func (x *NewDishRatingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewDishRatingRequest.ProtoReflect.Descriptor instead. func (*NewDishRatingRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{26} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{26} } func (x *NewDishRatingRequest) GetPoints() int32 { @@ -1797,7 +1798,7 @@ type GetTagsReply struct { func (x *GetTagsReply) Reset() { *x = GetTagsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[27] + mi := &file_tumdev_campus_backend_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1810,7 +1811,7 @@ func (x *GetTagsReply) String() string { func (*GetTagsReply) ProtoMessage() {} func (x *GetTagsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[27] + mi := &file_tumdev_campus_backend_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1823,7 +1824,7 @@ func (x *GetTagsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTagsReply.ProtoReflect.Descriptor instead. func (*GetTagsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{27} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{27} } func (x *GetTagsReply) GetRatingTags() []*TagsOverview { @@ -1846,7 +1847,7 @@ type TagsOverview struct { func (x *TagsOverview) Reset() { *x = TagsOverview{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1859,7 +1860,7 @@ func (x *TagsOverview) String() string { func (*TagsOverview) ProtoMessage() {} func (x *TagsOverview) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[28] + mi := &file_tumdev_campus_backend_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1872,7 +1873,7 @@ func (x *TagsOverview) ProtoReflect() protoreflect.Message { // Deprecated: Use TagsOverview.ProtoReflect.Descriptor instead. func (*TagsOverview) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{28} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{28} } func (x *TagsOverview) GetTagId() int32 { @@ -1908,7 +1909,7 @@ type RatingTag struct { func (x *RatingTag) Reset() { *x = RatingTag{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1921,7 +1922,7 @@ func (x *RatingTag) String() string { func (*RatingTag) ProtoMessage() {} func (x *RatingTag) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[29] + mi := &file_tumdev_campus_backend_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1934,7 +1935,7 @@ func (x *RatingTag) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTag.ProtoReflect.Descriptor instead. func (*RatingTag) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{29} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{29} } func (x *RatingTag) GetTagId() int32 { @@ -1963,7 +1964,7 @@ type RatingTagNewRequest struct { func (x *RatingTagNewRequest) Reset() { *x = RatingTagNewRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1976,7 +1977,7 @@ func (x *RatingTagNewRequest) String() string { func (*RatingTagNewRequest) ProtoMessage() {} func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[30] + mi := &file_tumdev_campus_backend_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1989,7 +1990,7 @@ func (x *RatingTagNewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagNewRequest.ProtoReflect.Descriptor instead. func (*RatingTagNewRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{30} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{30} } func (x *RatingTagNewRequest) GetTagId() int32 { @@ -2021,7 +2022,7 @@ type RatingTagResult struct { func (x *RatingTagResult) Reset() { *x = RatingTagResult{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2034,7 +2035,7 @@ func (x *RatingTagResult) String() string { func (*RatingTagResult) ProtoMessage() {} func (x *RatingTagResult) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[31] + mi := &file_tumdev_campus_backend_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2047,7 +2048,7 @@ func (x *RatingTagResult) ProtoReflect() protoreflect.Message { // Deprecated: Use RatingTagResult.ProtoReflect.Descriptor instead. func (*RatingTagResult) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{31} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{31} } func (x *RatingTagResult) GetTagId() int32 { @@ -2096,7 +2097,7 @@ type GetCafeteriaReply struct { func (x *GetCafeteriaReply) Reset() { *x = GetCafeteriaReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[32] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2109,7 +2110,7 @@ func (x *GetCafeteriaReply) String() string { func (*GetCafeteriaReply) ProtoMessage() {} func (x *GetCafeteriaReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[32] + mi := &file_tumdev_campus_backend_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2122,7 +2123,7 @@ func (x *GetCafeteriaReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCafeteriaReply.ProtoReflect.Descriptor instead. func (*GetCafeteriaReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{32} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{32} } func (x *GetCafeteriaReply) GetCafeteria() []*Cafeteria { @@ -2146,7 +2147,7 @@ type Cafeteria struct { func (x *Cafeteria) Reset() { *x = Cafeteria{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[33] + mi := &file_tumdev_campus_backend_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2159,7 +2160,7 @@ func (x *Cafeteria) String() string { func (*Cafeteria) ProtoMessage() {} func (x *Cafeteria) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[33] + mi := &file_tumdev_campus_backend_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2172,7 +2173,7 @@ func (x *Cafeteria) ProtoReflect() protoreflect.Message { // Deprecated: Use Cafeteria.ProtoReflect.Descriptor instead. func (*Cafeteria) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{33} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{33} } func (x *Cafeteria) GetId() string { @@ -2220,7 +2221,7 @@ type GetDishesRequest struct { func (x *GetDishesRequest) Reset() { *x = GetDishesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[34] + mi := &file_tumdev_campus_backend_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2233,7 +2234,7 @@ func (x *GetDishesRequest) String() string { func (*GetDishesRequest) ProtoMessage() {} func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[34] + mi := &file_tumdev_campus_backend_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2246,7 +2247,7 @@ func (x *GetDishesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDishesRequest.ProtoReflect.Descriptor instead. func (*GetDishesRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{34} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{34} } func (x *GetDishesRequest) GetCafeteriaId() string { @@ -2288,7 +2289,7 @@ type GetDishesReply struct { func (x *GetDishesReply) Reset() { *x = GetDishesReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[35] + mi := &file_tumdev_campus_backend_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2301,7 +2302,7 @@ func (x *GetDishesReply) String() string { func (*GetDishesReply) ProtoMessage() {} func (x *GetDishesReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[35] + mi := &file_tumdev_campus_backend_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2314,7 +2315,7 @@ func (x *GetDishesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDishesReply.ProtoReflect.Descriptor instead. func (*GetDishesReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{35} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{35} } func (x *GetDishesReply) GetDish() []string { @@ -2335,7 +2336,7 @@ type GetResponsiblePersonReply struct { func (x *GetResponsiblePersonReply) Reset() { *x = GetResponsiblePersonReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[36] + mi := &file_tumdev_campus_backend_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2348,7 +2349,7 @@ func (x *GetResponsiblePersonReply) String() string { func (*GetResponsiblePersonReply) ProtoMessage() {} func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[36] + mi := &file_tumdev_campus_backend_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2361,7 +2362,7 @@ func (x *GetResponsiblePersonReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetResponsiblePersonReply.ProtoReflect.Descriptor instead. func (*GetResponsiblePersonReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{36} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{36} } func (x *GetResponsiblePersonReply) GetResponsiblePerson() []*ResponsiblePersonElement { @@ -2386,7 +2387,7 @@ type ResponsiblePersonElement struct { func (x *ResponsiblePersonElement) Reset() { *x = ResponsiblePersonElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[37] + mi := &file_tumdev_campus_backend_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2399,7 +2400,7 @@ func (x *ResponsiblePersonElement) String() string { func (*ResponsiblePersonElement) ProtoMessage() {} func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[37] + mi := &file_tumdev_campus_backend_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2412,7 +2413,7 @@ func (x *ResponsiblePersonElement) ProtoReflect() protoreflect.Message { // Deprecated: Use ResponsiblePersonElement.ProtoReflect.Descriptor instead. func (*ResponsiblePersonElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{37} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{37} } func (x *ResponsiblePersonElement) GetName() string { @@ -2461,7 +2462,7 @@ type GetBuilding2GpsReply struct { func (x *GetBuilding2GpsReply) Reset() { *x = GetBuilding2GpsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[38] + mi := &file_tumdev_campus_backend_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2474,7 +2475,7 @@ func (x *GetBuilding2GpsReply) String() string { func (*GetBuilding2GpsReply) ProtoMessage() {} func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[38] + mi := &file_tumdev_campus_backend_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2487,7 +2488,7 @@ func (x *GetBuilding2GpsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBuilding2GpsReply.ProtoReflect.Descriptor instead. func (*GetBuilding2GpsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{38} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{38} } func (x *GetBuilding2GpsReply) GetBuilding2Gps() []*Building2GpsElement { @@ -2510,7 +2511,7 @@ type Building2GpsElement struct { func (x *Building2GpsElement) Reset() { *x = Building2GpsElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[39] + mi := &file_tumdev_campus_backend_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2523,7 +2524,7 @@ func (x *Building2GpsElement) String() string { func (*Building2GpsElement) ProtoMessage() {} func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[39] + mi := &file_tumdev_campus_backend_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2536,7 +2537,7 @@ func (x *Building2GpsElement) ProtoReflect() protoreflect.Message { // Deprecated: Use Building2GpsElement.ProtoReflect.Descriptor instead. func (*Building2GpsElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{39} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{39} } func (x *Building2GpsElement) GetId() string { @@ -2571,7 +2572,7 @@ type GetAreaFacilitiesByBuildingNrReply struct { func (x *GetAreaFacilitiesByBuildingNrReply) Reset() { *x = GetAreaFacilitiesByBuildingNrReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[40] + mi := &file_tumdev_campus_backend_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2584,7 +2585,7 @@ func (x *GetAreaFacilitiesByBuildingNrReply) String() string { func (*GetAreaFacilitiesByBuildingNrReply) ProtoMessage() {} func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[40] + mi := &file_tumdev_campus_backend_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2597,7 +2598,7 @@ func (x *GetAreaFacilitiesByBuildingNrReply) ProtoReflect() protoreflect.Message // Deprecated: Use GetAreaFacilitiesByBuildingNrReply.ProtoReflect.Descriptor instead. func (*GetAreaFacilitiesByBuildingNrReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{40} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{40} } func (x *GetAreaFacilitiesByBuildingNrReply) GetAreaFacilitiesByBuildingNr() []*RoomInformationElement { @@ -2618,7 +2619,7 @@ type GetAreaFacilitiesByBuildingNrRequest struct { func (x *GetAreaFacilitiesByBuildingNrRequest) Reset() { *x = GetAreaFacilitiesByBuildingNrRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[41] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2631,7 +2632,7 @@ func (x *GetAreaFacilitiesByBuildingNrRequest) String() string { func (*GetAreaFacilitiesByBuildingNrRequest) ProtoMessage() {} func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[41] + mi := &file_tumdev_campus_backend_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2644,7 +2645,7 @@ func (x *GetAreaFacilitiesByBuildingNrRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use GetAreaFacilitiesByBuildingNrRequest.ProtoReflect.Descriptor instead. func (*GetAreaFacilitiesByBuildingNrRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{41} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{41} } func (x *GetAreaFacilitiesByBuildingNrRequest) GetBuildingNr() string { @@ -2665,7 +2666,7 @@ type GetListOfToiletsReply struct { func (x *GetListOfToiletsReply) Reset() { *x = GetListOfToiletsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[42] + mi := &file_tumdev_campus_backend_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2678,7 +2679,7 @@ func (x *GetListOfToiletsReply) String() string { func (*GetListOfToiletsReply) ProtoMessage() {} func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[42] + mi := &file_tumdev_campus_backend_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2691,7 +2692,7 @@ func (x *GetListOfToiletsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetListOfToiletsReply.ProtoReflect.Descriptor instead. func (*GetListOfToiletsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{42} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{42} } func (x *GetListOfToiletsReply) GetListOfToilets() []*RoomInformationElement { @@ -2720,7 +2721,7 @@ type RoomInformationElement struct { func (x *RoomInformationElement) Reset() { *x = RoomInformationElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2733,7 +2734,7 @@ func (x *RoomInformationElement) String() string { func (*RoomInformationElement) ProtoMessage() {} func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[43] + mi := &file_tumdev_campus_backend_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2746,7 +2747,7 @@ func (x *RoomInformationElement) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomInformationElement.ProtoReflect.Descriptor instead. func (*RoomInformationElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{43} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{43} } func (x *RoomInformationElement) GetRoomId() int32 { @@ -2823,7 +2824,7 @@ type GetListOfElevatorsReply struct { func (x *GetListOfElevatorsReply) Reset() { *x = GetListOfElevatorsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[44] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2836,7 +2837,7 @@ func (x *GetListOfElevatorsReply) String() string { func (*GetListOfElevatorsReply) ProtoMessage() {} func (x *GetListOfElevatorsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[44] + mi := &file_tumdev_campus_backend_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2849,7 +2850,7 @@ func (x *GetListOfElevatorsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetListOfElevatorsReply.ProtoReflect.Descriptor instead. func (*GetListOfElevatorsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{44} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{44} } func (x *GetListOfElevatorsReply) GetListOfElevators() []*RoomInformationElement { @@ -2870,7 +2871,7 @@ type GetMoreInformationReply struct { func (x *GetMoreInformationReply) Reset() { *x = GetMoreInformationReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[45] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2883,7 +2884,7 @@ func (x *GetMoreInformationReply) String() string { func (*GetMoreInformationReply) ProtoMessage() {} func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[45] + mi := &file_tumdev_campus_backend_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2896,7 +2897,7 @@ func (x *GetMoreInformationReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMoreInformationReply.ProtoReflect.Descriptor instead. func (*GetMoreInformationReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{45} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{45} } func (x *GetMoreInformationReply) GetInformation() []*MoreInformationElement { @@ -2919,7 +2920,7 @@ type MoreInformationElement struct { func (x *MoreInformationElement) Reset() { *x = MoreInformationElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[46] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2932,7 +2933,7 @@ func (x *MoreInformationElement) String() string { func (*MoreInformationElement) ProtoMessage() {} func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[46] + mi := &file_tumdev_campus_backend_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2945,7 +2946,7 @@ func (x *MoreInformationElement) ProtoReflect() protoreflect.Message { // Deprecated: Use MoreInformationElement.ProtoReflect.Descriptor instead. func (*MoreInformationElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{46} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{46} } func (x *MoreInformationElement) GetTitle() string { @@ -2980,7 +2981,7 @@ type GetOpeningTimesRequest struct { func (x *GetOpeningTimesRequest) Reset() { *x = GetOpeningTimesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2993,7 +2994,7 @@ func (x *GetOpeningTimesRequest) String() string { func (*GetOpeningTimesRequest) ProtoMessage() {} func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[47] + mi := &file_tumdev_campus_backend_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3006,7 +3007,7 @@ func (x *GetOpeningTimesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOpeningTimesRequest.ProtoReflect.Descriptor instead. func (*GetOpeningTimesRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{47} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{47} } func (x *GetOpeningTimesRequest) GetLanguage() string { @@ -3027,7 +3028,7 @@ type GetOpeningTimesReply struct { func (x *GetOpeningTimesReply) Reset() { *x = GetOpeningTimesReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +3041,7 @@ func (x *GetOpeningTimesReply) String() string { func (*GetOpeningTimesReply) ProtoMessage() {} func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[48] + mi := &file_tumdev_campus_backend_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +3054,7 @@ func (x *GetOpeningTimesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOpeningTimesReply.ProtoReflect.Descriptor instead. func (*GetOpeningTimesReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{48} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{48} } func (x *GetOpeningTimesReply) GetFacilities() []*OpeningTimesMsgElement { @@ -3084,7 +3085,7 @@ type OpeningTimesMsgElement struct { func (x *OpeningTimesMsgElement) Reset() { *x = OpeningTimesMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3097,7 +3098,7 @@ func (x *OpeningTimesMsgElement) String() string { func (*OpeningTimesMsgElement) ProtoMessage() {} func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[49] + mi := &file_tumdev_campus_backend_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3110,7 +3111,7 @@ func (x *OpeningTimesMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use OpeningTimesMsgElement.ProtoReflect.Descriptor instead. func (*OpeningTimesMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{49} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{49} } func (x *OpeningTimesMsgElement) GetId() int32 { @@ -3201,7 +3202,7 @@ type GetUpdateNoteRequest struct { func (x *GetUpdateNoteRequest) Reset() { *x = GetUpdateNoteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3214,7 +3215,7 @@ func (x *GetUpdateNoteRequest) String() string { func (*GetUpdateNoteRequest) ProtoMessage() {} func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[50] + mi := &file_tumdev_campus_backend_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3227,7 +3228,7 @@ func (x *GetUpdateNoteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteRequest.ProtoReflect.Descriptor instead. func (*GetUpdateNoteRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{50} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{50} } func (x *GetUpdateNoteRequest) GetVersion() int32 { @@ -3242,13 +3243,14 @@ type GetUpdateNoteReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + VersionName string `protobuf:"bytes,2,opt,name=version_name,json=versionName,proto3" json:"version_name,omitempty"` } func (x *GetUpdateNoteReply) Reset() { *x = GetUpdateNoteReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3261,7 +3263,7 @@ func (x *GetUpdateNoteReply) String() string { func (*GetUpdateNoteReply) ProtoMessage() {} func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[51] + mi := &file_tumdev_campus_backend_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3274,7 +3276,7 @@ func (x *GetUpdateNoteReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUpdateNoteReply.ProtoReflect.Descriptor instead. func (*GetUpdateNoteReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{51} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{51} } func (x *GetUpdateNoteReply) GetMessage() string { @@ -3284,6 +3286,13 @@ func (x *GetUpdateNoteReply) GetMessage() string { return "" } +func (x *GetUpdateNoteReply) GetVersionName() string { + if x != nil { + return x.VersionName + } + return "" +} + type GetStudyRoomListReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3295,7 +3304,7 @@ type GetStudyRoomListReply struct { func (x *GetStudyRoomListReply) Reset() { *x = GetStudyRoomListReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3308,7 +3317,7 @@ func (x *GetStudyRoomListReply) String() string { func (*GetStudyRoomListReply) ProtoMessage() {} func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[52] + mi := &file_tumdev_campus_backend_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3321,7 +3330,7 @@ func (x *GetStudyRoomListReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStudyRoomListReply.ProtoReflect.Descriptor instead. func (*GetStudyRoomListReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{52} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{52} } func (x *GetStudyRoomListReply) GetRooms() []*StudyRoomMsgElement { @@ -3345,7 +3354,7 @@ type StudyRoomMsgElement struct { func (x *StudyRoomMsgElement) Reset() { *x = StudyRoomMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3358,7 +3367,7 @@ func (x *StudyRoomMsgElement) String() string { func (*StudyRoomMsgElement) ProtoMessage() {} func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[53] + mi := &file_tumdev_campus_backend_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3371,7 +3380,7 @@ func (x *StudyRoomMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use StudyRoomMsgElement.ProtoReflect.Descriptor instead. func (*StudyRoomMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{53} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{53} } func (x *StudyRoomMsgElement) GetId() int32 { @@ -3417,7 +3426,7 @@ type StudyRoom struct { func (x *StudyRoom) Reset() { *x = StudyRoom{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3430,7 +3439,7 @@ func (x *StudyRoom) String() string { func (*StudyRoom) ProtoMessage() {} func (x *StudyRoom) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[54] + mi := &file_tumdev_campus_backend_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3443,7 +3452,7 @@ func (x *StudyRoom) ProtoReflect() protoreflect.Message { // Deprecated: Use StudyRoom.ProtoReflect.Descriptor instead. func (*StudyRoom) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{54} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{54} } func (x *StudyRoom) GetGroupId() int32 { @@ -3492,7 +3501,7 @@ type GetKinoRequest struct { func (x *GetKinoRequest) Reset() { *x = GetKinoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3505,7 +3514,7 @@ func (x *GetKinoRequest) String() string { func (*GetKinoRequest) ProtoMessage() {} func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[55] + mi := &file_tumdev_campus_backend_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3518,7 +3527,7 @@ func (x *GetKinoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKinoRequest.ProtoReflect.Descriptor instead. func (*GetKinoRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{55} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{55} } func (x *GetKinoRequest) GetLastId() int32 { @@ -3539,7 +3548,7 @@ type GetKinoReply struct { func (x *GetKinoReply) Reset() { *x = GetKinoReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3552,7 +3561,7 @@ func (x *GetKinoReply) String() string { func (*GetKinoReply) ProtoMessage() {} func (x *GetKinoReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[56] + mi := &file_tumdev_campus_backend_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3565,7 +3574,7 @@ func (x *GetKinoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetKinoReply.ProtoReflect.Descriptor instead. func (*GetKinoReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{56} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{56} } func (x *GetKinoReply) GetKinos() []*KinoMsgElement { @@ -3601,7 +3610,7 @@ type KinoMsgElement struct { func (x *KinoMsgElement) Reset() { *x = KinoMsgElement{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3614,7 +3623,7 @@ func (x *KinoMsgElement) String() string { func (*KinoMsgElement) ProtoMessage() {} func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[57] + mi := &file_tumdev_campus_backend_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3627,7 +3636,7 @@ func (x *KinoMsgElement) ProtoReflect() protoreflect.Message { // Deprecated: Use KinoMsgElement.ProtoReflect.Descriptor instead. func (*KinoMsgElement) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{57} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{57} } func (x *KinoMsgElement) GetName() string { @@ -3761,7 +3770,7 @@ type SendFeedbackRequest struct { func (x *SendFeedbackRequest) Reset() { *x = SendFeedbackRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3783,7 @@ func (x *SendFeedbackRequest) String() string { func (*SendFeedbackRequest) ProtoMessage() {} func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[58] + mi := &file_tumdev_campus_backend_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3796,7 @@ func (x *SendFeedbackRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackRequest.ProtoReflect.Descriptor instead. func (*SendFeedbackRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{58} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{58} } func (x *SendFeedbackRequest) GetTopic() string { @@ -3864,7 +3873,7 @@ type SendFeedbackImageReply struct { func (x *SendFeedbackImageReply) Reset() { *x = SendFeedbackImageReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3877,7 +3886,7 @@ func (x *SendFeedbackImageReply) String() string { func (*SendFeedbackImageReply) ProtoMessage() {} func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[59] + mi := &file_tumdev_campus_backend_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3890,7 +3899,7 @@ func (x *SendFeedbackImageReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackImageReply.ProtoReflect.Descriptor instead. func (*SendFeedbackImageReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{59} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{59} } func (x *SendFeedbackImageReply) GetStatus() string { @@ -3912,7 +3921,7 @@ type SendFeedbackImageRequest struct { func (x *SendFeedbackImageRequest) Reset() { *x = SendFeedbackImageRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +3934,7 @@ func (x *SendFeedbackImageRequest) String() string { func (*SendFeedbackImageRequest) ProtoMessage() {} func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[60] + mi := &file_tumdev_campus_backend_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,7 +3947,7 @@ func (x *SendFeedbackImageRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendFeedbackImageRequest.ProtoReflect.Descriptor instead. func (*SendFeedbackImageRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{60} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{60} } func (x *SendFeedbackImageRequest) GetId() int32 { @@ -3966,7 +3975,7 @@ type GetMembersRequest struct { func (x *GetMembersRequest) Reset() { *x = GetMembersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +3988,7 @@ func (x *GetMembersRequest) String() string { func (*GetMembersRequest) ProtoMessage() {} func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[61] + mi := &file_tumdev_campus_backend_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +4001,7 @@ func (x *GetMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMembersRequest.ProtoReflect.Descriptor instead. func (*GetMembersRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{61} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{61} } func (x *GetMembersRequest) GetLrzId() string { @@ -4015,7 +4024,7 @@ type GetMembersReply struct { func (x *GetMembersReply) Reset() { *x = GetMembersReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4028,7 +4037,7 @@ func (x *GetMembersReply) String() string { func (*GetMembersReply) ProtoMessage() {} func (x *GetMembersReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[62] + mi := &file_tumdev_campus_backend_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4041,7 +4050,7 @@ func (x *GetMembersReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMembersReply.ProtoReflect.Descriptor instead. func (*GetMembersReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{62} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{62} } func (x *GetMembersReply) GetLrzId() string { @@ -4076,7 +4085,7 @@ type GetUploadStatusRequest struct { func (x *GetUploadStatusRequest) Reset() { *x = GetUploadStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4089,7 +4098,7 @@ func (x *GetUploadStatusRequest) String() string { func (*GetUploadStatusRequest) ProtoMessage() {} func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[63] + mi := &file_tumdev_campus_backend_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4102,7 +4111,7 @@ func (x *GetUploadStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusRequest.ProtoReflect.Descriptor instead. func (*GetUploadStatusRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{63} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{63} } func (x *GetUploadStatusRequest) GetLrzId() string { @@ -4127,7 +4136,7 @@ type GetUploadStatusReply struct { func (x *GetUploadStatusReply) Reset() { *x = GetUploadStatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4140,7 +4149,7 @@ func (x *GetUploadStatusReply) String() string { func (*GetUploadStatusReply) ProtoMessage() {} func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[64] + mi := &file_tumdev_campus_backend_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4153,7 +4162,7 @@ func (x *GetUploadStatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUploadStatusReply.ProtoReflect.Descriptor instead. func (*GetUploadStatusReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{64} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{64} } func (x *GetUploadStatusReply) GetFcmToken() string { @@ -4206,7 +4215,7 @@ type GetNotificationsReply struct { func (x *GetNotificationsReply) Reset() { *x = GetNotificationsReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[65] + mi := &file_tumdev_campus_backend_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4219,7 +4228,7 @@ func (x *GetNotificationsReply) String() string { func (*GetNotificationsReply) ProtoMessage() {} func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[65] + mi := &file_tumdev_campus_backend_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4232,7 +4241,7 @@ func (x *GetNotificationsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationsReply.ProtoReflect.Descriptor instead. func (*GetNotificationsReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{65} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{65} } func (x *GetNotificationsReply) GetNotificationId() int32 { @@ -4281,7 +4290,7 @@ type NotificationsRequest struct { func (x *NotificationsRequest) Reset() { *x = NotificationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[66] + mi := &file_tumdev_campus_backend_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4294,7 +4303,7 @@ func (x *NotificationsRequest) String() string { func (*NotificationsRequest) ProtoMessage() {} func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[66] + mi := &file_tumdev_campus_backend_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4307,7 +4316,7 @@ func (x *NotificationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NotificationsRequest.ProtoReflect.Descriptor instead. func (*NotificationsRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{66} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{66} } func (x *NotificationsRequest) GetNotificationId() int32 { @@ -4328,7 +4337,7 @@ type GetNotificationsConfirmReply struct { func (x *GetNotificationsConfirmReply) Reset() { *x = GetNotificationsConfirmReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[67] + mi := &file_tumdev_campus_backend_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4341,7 +4350,7 @@ func (x *GetNotificationsConfirmReply) String() string { func (*GetNotificationsConfirmReply) ProtoMessage() {} func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[67] + mi := &file_tumdev_campus_backend_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4354,7 +4363,7 @@ func (x *GetNotificationsConfirmReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNotificationsConfirmReply.ProtoReflect.Descriptor instead. func (*GetNotificationsConfirmReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{67} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{67} } func (x *GetNotificationsConfirmReply) GetStatus() string { @@ -4376,7 +4385,7 @@ type GetCanteenHeadCountRequest struct { func (x *GetCanteenHeadCountRequest) Reset() { *x = GetCanteenHeadCountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[68] + mi := &file_tumdev_campus_backend_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4389,7 +4398,7 @@ func (x *GetCanteenHeadCountRequest) String() string { func (*GetCanteenHeadCountRequest) ProtoMessage() {} func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[68] + mi := &file_tumdev_campus_backend_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4402,7 +4411,7 @@ func (x *GetCanteenHeadCountRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCanteenHeadCountRequest.ProtoReflect.Descriptor instead. func (*GetCanteenHeadCountRequest) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{68} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{68} } func (x *GetCanteenHeadCountRequest) GetCanteenId() string { @@ -4430,7 +4439,7 @@ type GetCanteenHeadCountReply struct { func (x *GetCanteenHeadCountReply) Reset() { *x = GetCanteenHeadCountReply{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[69] + mi := &file_tumdev_campus_backend_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4443,7 +4452,7 @@ func (x *GetCanteenHeadCountReply) String() string { func (*GetCanteenHeadCountReply) ProtoMessage() {} func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[69] + mi := &file_tumdev_campus_backend_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4456,7 +4465,7 @@ func (x *GetCanteenHeadCountReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCanteenHeadCountReply.ProtoReflect.Descriptor instead. func (*GetCanteenHeadCountReply) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{69} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{69} } func (x *GetCanteenHeadCountReply) GetCount() uint32 { @@ -4502,7 +4511,7 @@ type GetRoomScheduleReply_RoomScheduleEvent struct { func (x *GetRoomScheduleReply_RoomScheduleEvent) Reset() { *x = GetRoomScheduleReply_RoomScheduleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[70] + mi := &file_tumdev_campus_backend_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4515,7 +4524,7 @@ func (x *GetRoomScheduleReply_RoomScheduleEvent) String() string { func (*GetRoomScheduleReply_RoomScheduleEvent) ProtoMessage() {} func (x *GetRoomScheduleReply_RoomScheduleEvent) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[70] + mi := &file_tumdev_campus_backend_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4528,7 +4537,7 @@ func (x *GetRoomScheduleReply_RoomScheduleEvent) ProtoReflect() protoreflect.Mes // Deprecated: Use GetRoomScheduleReply_RoomScheduleEvent.ProtoReflect.Descriptor instead. func (*GetRoomScheduleReply_RoomScheduleEvent) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{7, 0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{7, 0} } func (x *GetRoomScheduleReply_RoomScheduleEvent) GetStart() *timestamppb.Timestamp { @@ -4581,7 +4590,7 @@ type GetRoomMapsReply_Map struct { func (x *GetRoomMapsReply_Map) Reset() { *x = GetRoomMapsReply_Map{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[71] + mi := &file_tumdev_campus_backend_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4594,7 +4603,7 @@ func (x *GetRoomMapsReply_Map) String() string { func (*GetRoomMapsReply_Map) ProtoMessage() {} func (x *GetRoomMapsReply_Map) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[71] + mi := &file_tumdev_campus_backend_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4607,7 +4616,7 @@ func (x *GetRoomMapsReply_Map) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomMapsReply_Map.ProtoReflect.Descriptor instead. func (*GetRoomMapsReply_Map) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{11, 0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{11, 0} } func (x *GetRoomMapsReply_Map) GetMapId() int64 { @@ -4660,7 +4669,7 @@ type GetLocationsReply_Location struct { func (x *GetLocationsReply_Location) Reset() { *x = GetLocationsReply_Location{} if protoimpl.UnsafeEnabled { - mi := &file_CampusService_proto_msgTypes[72] + mi := &file_tumdev_campus_backend_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4673,7 +4682,7 @@ func (x *GetLocationsReply_Location) String() string { func (*GetLocationsReply_Location) ProtoMessage() {} func (x *GetLocationsReply_Location) ProtoReflect() protoreflect.Message { - mi := &file_CampusService_proto_msgTypes[72] + mi := &file_tumdev_campus_backend_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4686,7 +4695,7 @@ func (x *GetLocationsReply_Location) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLocationsReply_Location.ProtoReflect.Descriptor instead. func (*GetLocationsReply_Location) Descriptor() ([]byte, []int) { - return file_CampusService_proto_rawDescGZIP(), []int{13, 0} + return file_tumdev_campus_backend_proto_rawDescGZIP(), []int{13, 0} } func (x *GetLocationsReply_Location) GetLocation() string { @@ -4724,813 +4733,816 @@ func (x *GetLocationsReply_Location) GetRadius() string { return "" } -var File_CampusService_proto protoreflect.FileDescriptor +var File_tumdev_campus_backend_proto protoreflect.FileDescriptor -var file_CampusService_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x31, - 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x22, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, +var file_tumdev_campus_backend_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x74, 0x75, 0x6d, 0x64, 0x65, 0x76, 0x2f, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x61, + 0x70, 0x69, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, + 0x01, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x8c, 0x01, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, - 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0xc5, 0x01, 0x0a, 0x11, 0x52, 0x6f, - 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x64, - 0x65, 0x22, 0x34, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, 0x78, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, 0x6d, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, 0x6d, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x75, 0x74, 0x6d, 0x5f, 0x65, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0a, 0x75, 0x74, 0x6d, 0x45, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, - 0x0a, 0x0c, 0x75, 0x74, 0x6d, 0x5f, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x75, 0x74, 0x6d, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, - 0x67, 0x22, 0x2d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, - 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x52, 0x04, - 0x6d, 0x61, 0x70, 0x73, 0x1a, 0x82, 0x01, 0x0a, 0x03, 0x4d, 0x61, 0x70, 0x12, 0x15, 0x0a, 0x06, - 0x6d, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, - 0x70, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x77, - 0x69, 0x64, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x31, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x76, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x6c, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x6e, 0x12, - 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x61, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x33, 0x0a, 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x05, 0x72, 0x6f, 0x6f, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x52, - 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, - 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, - 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, - 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, 0x72, 0x61, 0x79, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, - 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x63, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, - 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, - 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x16, - 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, - 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x22, 0x31, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x62, 0x0a, 0x13, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x0a, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, + 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x59, + 0x0a, 0x1f, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x39, 0x0a, 0x1d, 0x49, 0x4f, 0x53, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, + 0x6f, 0x6f, 0x6d, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x03, + 0x65, 0x6e, 0x64, 0x22, 0xa3, 0x02, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x43, 0x0a, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0xc5, 0x01, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x44, - 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, + 0x6d, 0x70, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x19, 0x0a, + 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x72, + 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x6f, 0x75, 0x72, 0x73, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x34, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, + 0x78, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x74, + 0x6d, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x74, + 0x6d, 0x5a, 0x6f, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x74, 0x6d, 0x5f, 0x65, 0x61, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x75, 0x74, 0x6d, 0x45, + 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x74, 0x6d, 0x5f, 0x6e, 0x6f, + 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x75, 0x74, + 0x6d, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x22, 0x2d, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2d, 0x0a, + 0x04, 0x6d, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x1a, 0x82, 0x01, 0x0a, + 0x03, 0x4d, 0x61, 0x70, 0x12, 0x15, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, + 0x61, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x31, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x76, 0x0a, 0x08, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x64, + 0x69, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x64, 0x69, 0x75, + 0x73, 0x22, 0x2a, 0x0a, 0x12, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x33, 0x0a, + 0x10, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1f, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x09, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, + 0x6d, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x04, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, + 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, + 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, + 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, + 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, + 0x0a, 0x0f, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x0a, + 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x63, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x63, 0x6f, 0x6e, 0x22, 0xd4, 0x01, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x12, 0x0a, + 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, + 0x6b, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, - 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x66, - 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, - 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, - 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, - 0x61, 0x67, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x11, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, - 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, - 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, - 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, - 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x4e, 0x65, - 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, - 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, - 0x22, 0x41, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, - 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, - 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, 0x6e, 0x22, 0x39, 0x0a, 0x09, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x13, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x6f, 0x0a, 0x0f, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, - 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x22, 0x41, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x52, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x6f, 0x0a, - 0x09, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, - 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6e, - 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, - 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x69, 0x73, 0x68, 0x22, 0x68, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x92, - 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, - 0x6d, 0x49, 0x44, 0x22, 0x54, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x62, - 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x22, 0x5f, 0x0a, 0x13, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, - 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x5b, 0x0a, 0x1a, 0x61, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x47, - 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, - 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, - 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x16, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, - 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x60, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, - 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x0f, - 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, - 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0x58, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, - 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, - 0x16, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, - 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, - 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x72, 0x6f, - 0x6f, 0x6d, 0x73, 0x22, 0x79, 0x0a, 0x13, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, - 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9d, - 0x01, 0x0a, 0x09, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x28, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, - 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, - 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, - 0x6e, 0x6f, 0x73, 0x22, 0xbe, 0x03, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x6f, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x79, 0x65, 0x61, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, - 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x67, 0x65, 0x6e, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, - 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, - 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x8e, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, - 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, - 0x69, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, - 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, - 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x16, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, - 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x44, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x46, - 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, - 0x11, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x2e, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, - 0x64, 0x22, 0xb3, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, - 0x6d, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x63, 0x6d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, - 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, - 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, - 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, - 0x78, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, 0x02, 0x32, 0xb0, 0x1e, 0x0a, 0x06, - 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, - 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6e, 0x65, 0x77, - 0x73, 0x2f, 0x74, 0x6f, 0x70, 0x12, 0x5e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x41, 0x72, 0x72, 0x61, 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x0d, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x68, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x62, - 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x17, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, - 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, - 0x6a, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x62, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x7b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x60, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x62, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x22, 0x10, 0x2f, 0x72, 0x6f, - 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x12, 0x7b, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x72, - 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1b, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, - 0x62, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, - 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x42, 0x79, 0x49, 0x64, 0x12, 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, - 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, - 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, - 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x2f, 0x67, 0x65, 0x74, 0x12, 0x6e, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, - 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, - 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, - 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x5f, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, - 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, - 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, 0x12, 0x71, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, + 0x02, 0x74, 0x6f, 0x22, 0xac, 0x01, 0x0a, 0x16, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, + 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, + 0x12, 0x2e, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x28, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, - 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x62, 0x0a, 0x72, 0x61, 0x74, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, - 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x7b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, + 0x12, 0x2a, 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, + 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x2e, + 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x2a, + 0x0a, 0x02, 0x74, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x02, 0x74, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x61, + 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x68, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x06, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x61, + 0x76, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x6d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x72, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6e, 0x61, 0x6d, + 0x65, 0x54, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x08, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x61, 0x67, 0x73, 0x22, 0xcb, 0x01, 0x0a, 0x11, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x07, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x22, 0xb5, 0x01, 0x0a, 0x19, 0x4e, 0x65, + 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2e, + 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x67, 0x52, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x52, + 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x0c, 0x54, + 0x61, 0x67, 0x73, 0x4f, 0x76, 0x65, 0x72, 0x76, 0x69, 0x65, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, + 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x64, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x65, + 0x6e, 0x22, 0x39, 0x0a, 0x09, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, + 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x43, 0x0a, 0x13, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x4e, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x22, 0x6f, 0x0a, 0x0f, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x61, 0x67, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x10, 0x0a, 0x03, + 0x73, 0x74, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x73, 0x74, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, 0x69, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6d, + 0x61, 0x78, 0x22, 0x41, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2c, 0x0a, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x09, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x22, 0x6f, 0x0a, 0x09, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, + 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, + 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0x6e, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x61, + 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x79, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x77, 0x65, 0x65, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x77, 0x65, 0x65, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x64, 0x61, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, + 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x73, 0x68, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x69, 0x73, 0x68, 0x22, 0x68, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x11, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x11, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x22, 0x92, 0x01, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x66, + 0x61, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x61, + 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x75, 0x6d, 0x49, 0x44, 0x22, 0x54, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, + 0x47, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, + 0x73, 0x22, 0x5f, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, + 0x73, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, + 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, + 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x5b, 0x0a, 0x1a, 0x61, 0x72, 0x65, + 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x72, 0x65, 0x61, + 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, 0x47, 0x0a, 0x24, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, + 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x22, + 0x5a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x41, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, + 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0d, 0x6c, 0x69, + 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x22, 0xfb, 0x01, 0x0a, 0x16, + 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, + 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x17, 0x0a, 0x07, + 0x61, 0x72, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, + 0x72, 0x63, 0x68, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x61, 0x6d, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x60, 0x0a, 0x17, 0x47, 0x65, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, + 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x69, 0x73, 0x74, + 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x58, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5c, 0x0a, 0x16, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x75, 0x72, 0x6c, 0x22, 0x34, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0xbf, + 0x02, 0x0a, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x4d, + 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, + 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x6f, 0x75, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, + 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x66, 0x6f, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x22, 0x30, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, + 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x79, + 0x0a, 0x13, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x73, 0x67, 0x45, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, + 0x6f, 0x6d, 0x52, 0x05, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x09, 0x53, 0x74, + 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x72, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, + 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x6d, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x61, 0x73, + 0x74, 0x49, 0x64, 0x22, 0x39, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, + 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x6b, 0x69, 0x6e, 0x6f, 0x73, 0x22, 0xbe, + 0x03, 0x0a, 0x0e, 0x4b, 0x69, 0x6e, 0x6f, 0x4d, 0x73, 0x67, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x6f, 0x12, 0x2e, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, + 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x79, 0x65, 0x61, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x79, 0x65, 0x61, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x72, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, + 0x8e, 0x02, 0x0a, 0x13, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, + 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, + 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x30, 0x0a, 0x16, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x44, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, + 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, + 0x7a, 0x49, 0x64, 0x22, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x22, 0xb3, 0x01, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x63, 0x6d, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x63, 0x6d, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x64, 0x22, 0xa9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x3e, + 0x0a, 0x14, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x36, + 0x0a, 0x1c, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, + 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2d, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x2f, - 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6c, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x2f, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4f, 0x53, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x49, 0x4e, + 0x44, 0x4f, 0x57, 0x53, 0x10, 0x02, 0x32, 0xb0, 0x1e, 0x0a, 0x06, 0x43, 0x61, 0x6d, 0x70, 0x75, + 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x62, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, - 0x69, 0x61, 0x12, 0x18, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x61, - 0x6c, 0x6c, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, 0x56, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, - 0x69, 0x73, 0x68, 0x12, 0x0f, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, - 0x73, 0x68, 0x65, 0x73, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x6f, 0x70, 0x4e, 0x65, 0x77, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x74, 0x6f, 0x70, + 0x12, 0x5e, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x4e, 0x65, 0x77, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x62, 0x07, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x12, 0x0d, 0x2f, 0x6e, 0x65, 0x77, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x68, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x12, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x6f, 0x6f, 0x6d, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x62, 0x05, 0x72, 0x6f, 0x6f, 0x6d, + 0x73, 0x22, 0x17, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, + 0x6f, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x6a, 0x0a, 0x0c, 0x47, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x28, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x22, 0x62, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x15, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, + 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x4d, 0x61, 0x70, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, 0x2a, + 0x62, 0x04, 0x6d, 0x61, 0x70, 0x73, 0x22, 0x10, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, + 0x64, 0x65, 0x72, 0x2f, 0x6d, 0x61, 0x70, 0x73, 0x12, 0x7b, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x43, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, + 0x6e, 0x64, 0x65, 0x72, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x73, 0x12, 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x62, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x66, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2f, 0x72, 0x6f, 0x6f, 0x6d, 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x42, 0x79, + 0x49, 0x64, 0x12, 0x6f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, + 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, + 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, + 0x67, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, + 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x67, 0x65, 0x74, + 0x12, 0x6e, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, + 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, + 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x20, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x63, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, 0x77, + 0x12, 0x5f, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6e, + 0x67, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x65, 0x77, 0x44, 0x69, 0x73, 0x68, 0x52, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x62, - 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x63, 0x74, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, - 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x32, 0x47, 0x70, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x1b, 0x12, 0x19, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x90, 0x01, 0x0a, - 0x1d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x29, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, - 0x4e, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x62, 0x61, 0x72, - 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x12, - 0x64, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, - 0x65, 0x74, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, - 0x14, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x74, 0x6f, - 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x62, 0x61, 0x72, 0x72, - 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x70, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, + 0x10, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x6e, 0x65, + 0x77, 0x12, 0x71, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x62, 0x0a, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, + 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x67, 0x73, 0x12, 0x66, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2c, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x62, 0x0a, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x18, 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x54, 0x61, 0x67, 0x73, 0x12, 0x7b, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x54, 0x61, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x67, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x62, 0x0a, 0x72, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x2f, 0x63, 0x61, 0x66, 0x65, 0x74, + 0x65, 0x72, 0x69, 0x61, 0x2f, 0x72, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x61, 0x6c, 0x6c, 0x52, + 0x61, 0x74, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x67, 0x73, 0x12, 0x6c, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x43, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x66, 0x65, + 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x25, 0x62, 0x09, 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x18, 0x2f, + 0x63, 0x61, 0x66, 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x2f, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x66, + 0x65, 0x74, 0x65, 0x72, 0x69, 0x61, 0x73, 0x12, 0x56, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x44, 0x69, + 0x73, 0x68, 0x65, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, + 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x62, 0x04, 0x64, 0x69, 0x73, 0x68, 0x12, 0x0f, + 0x2f, 0x64, 0x69, 0x73, 0x68, 0x2f, 0x61, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, - 0x72, 0x65, 0x65, 0x2f, 0x6d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, - 0x12, 0x62, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, - 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, + 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12, 0x67, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, + 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x12, 0x19, 0x2f, 0x62, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x32, 0x47, 0x70, 0x73, 0x12, 0x90, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, + 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x42, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, + 0x65, 0x61, 0x46, 0x61, 0x63, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x42, 0x79, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, + 0x72, 0x65, 0x65, 0x2f, 0x6e, 0x65, 0x61, 0x72, 0x62, 0x79, 0x12, 0x64, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x54, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x62, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x74, 0x6f, 0x69, 0x6c, 0x65, 0x74, 0x73, + 0x12, 0x6a, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, 0x65, + 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x66, 0x45, 0x6c, + 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x12, 0x16, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, + 0x65, 0x65, 0x2f, 0x65, 0x6c, 0x65, 0x76, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x70, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, + 0x12, 0x1c, 0x2f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x66, 0x72, 0x65, 0x65, 0x2f, 0x6d, + 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x6b, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1a, 0x12, 0x18, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x2f, 0x7b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x7d, 0x12, 0x62, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x7d, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, - 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, - 0x6f, 0x6f, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x79, 0x72, 0x6f, 0x6f, 0x6d, - 0x73, 0x12, 0x49, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x12, 0x13, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x6b, - 0x69, 0x6e, 0x6f, 0x2f, 0x7b, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0c, - 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x6e, 0x6f, 0x74, 0x65, 0x2f, 0x7b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x7d, 0x12, + 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x75, 0x64, 0x79, 0x52, 0x6f, 0x6f, 0x6d, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, + 0x0b, 0x2f, 0x73, 0x74, 0x75, 0x64, 0x79, 0x72, 0x6f, 0x6f, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x12, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4b, 0x69, 0x6e, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x12, 0x0e, 0x2f, 0x6b, 0x69, 0x6e, 0x6f, 0x2f, 0x7b, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x64, 0x7d, 0x12, 0x58, 0x0a, 0x0c, 0x53, 0x65, 0x6e, 0x64, 0x46, + 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, + 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x11, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, + 0x6b, 0x12, 0x71, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, + 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x11, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x22, 0x09, 0x2f, 0x66, 0x65, - 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x71, 0x0a, 0x11, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, - 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, - 0x18, 0x2f, 0x66, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, - 0x7b, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x72, 0x7d, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, - 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x71, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x27, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x22, 0x18, 0x2f, 0x66, 0x65, 0x65, + 0x64, 0x62, 0x61, 0x63, 0x6b, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x4e, 0x72, 0x7d, 0x12, 0x6b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x20, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x12, 0x18, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, + 0x7d, 0x12, 0x71, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x6e, 0x6f, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x7d, 0x12, 0x54, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x12, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x2f, 0x7b, 0x6c, 0x72, 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x7d, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x26, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, - 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, + 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x12, 0x1f, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x87, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x12, + 0x19, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x2f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x2f, 0x7b, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x7d, 0x12, 0x54, + 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6c, 0x72, + 0x7a, 0x49, 0x64, 0x7d, 0x12, 0x7d, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, 0x64, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x48, 0x65, 0x61, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x26, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x20, 0x12, 0x1e, 0x2f, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, 0x2f, 0x68, 0x65, + 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x63, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x6e, + 0x49, 0x64, 0x7d, 0x12, 0x99, 0x01, 0x0a, 0x18, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x49, 0x4f, 0x53, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, - 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x5c, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x42, 0x5e, - 0x0a, 0x12, 0x61, 0x70, 0x70, 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, - 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x54, 0x55, 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x75, - 0x73, 0x2d, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, - 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x69, 0x6f, 0x73, 0x2f, 0x6e, 0x6f, 0x74, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5a, 0x0a, 0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, + 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5c, 0x0a, 0x0c, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x1a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x7b, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x42, 0x5e, 0x0a, 0x12, 0x61, 0x70, 0x70, + 0x2e, 0x74, 0x75, 0x6d, 0x2e, 0x63, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x42, + 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x55, + 0x4d, 0x2d, 0x44, 0x65, 0x76, 0x2f, 0x43, 0x61, 0x6d, 0x70, 0x75, 0x73, 0x2d, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0e, 0x43, 0x61, 0x6d, 0x70, 0x75, + 0x73, 0x41, 0x70, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( - file_CampusService_proto_rawDescOnce sync.Once - file_CampusService_proto_rawDescData = file_CampusService_proto_rawDesc + file_tumdev_campus_backend_proto_rawDescOnce sync.Once + file_tumdev_campus_backend_proto_rawDescData = file_tumdev_campus_backend_proto_rawDesc ) -func file_CampusService_proto_rawDescGZIP() []byte { - file_CampusService_proto_rawDescOnce.Do(func() { - file_CampusService_proto_rawDescData = protoimpl.X.CompressGZIP(file_CampusService_proto_rawDescData) +func file_tumdev_campus_backend_proto_rawDescGZIP() []byte { + file_tumdev_campus_backend_proto_rawDescOnce.Do(func() { + file_tumdev_campus_backend_proto_rawDescData = protoimpl.X.CompressGZIP(file_tumdev_campus_backend_proto_rawDescData) }) - return file_CampusService_proto_rawDescData + return file_tumdev_campus_backend_proto_rawDescData } -var file_CampusService_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_CampusService_proto_msgTypes = make([]protoimpl.MessageInfo, 73) -var file_CampusService_proto_goTypes = []interface{}{ +var file_tumdev_campus_backend_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_tumdev_campus_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 73) +var file_tumdev_campus_backend_proto_goTypes = []interface{}{ (DeviceType)(0), // 0: api.DeviceType (*RegisterDeviceRequest)(nil), // 1: api.RegisterDeviceRequest (*RegisterDeviceReply)(nil), // 2: api.RegisterDeviceReply @@ -5549,7 +5561,7 @@ var file_CampusService_proto_goTypes = []interface{}{ (*SearchRoomsRequest)(nil), // 15: api.SearchRoomsRequest (*SearchRoomsReply)(nil), // 16: api.SearchRoomsReply (*Room)(nil), // 17: api.Room - (*NewsSourceArray)(nil), // 18: api.NewsSourceArray + (*NewsSourceReply)(nil), // 18: api.NewsSourceReply (*NewsSource)(nil), // 19: api.NewsSource (*GetTopNewsReply)(nil), // 20: api.GetTopNewsReply (*CafeteriaRatingRequest)(nil), // 21: api.CafeteriaRatingRequest @@ -5608,7 +5620,7 @@ var file_CampusService_proto_goTypes = []interface{}{ (*timestamppb.Timestamp)(nil), // 74: google.protobuf.Timestamp (*emptypb.Empty)(nil), // 75: google.protobuf.Empty } -var file_CampusService_proto_depIdxs = []int32{ +var file_tumdev_campus_backend_proto_depIdxs = []int32{ 0, // 0: api.RegisterDeviceRequest.deviceType:type_name -> api.DeviceType 0, // 1: api.RemoveDeviceRequest.deviceType:type_name -> api.DeviceType 74, // 2: api.GetRoomScheduleRequest.start:type_name -> google.protobuf.Timestamp @@ -5617,7 +5629,7 @@ var file_CampusService_proto_depIdxs = []int32{ 72, // 5: api.GetRoomMapsReply.maps:type_name -> api.GetRoomMapsReply.Map 73, // 6: api.GetLocationsReply.locations:type_name -> api.GetLocationsReply.Location 17, // 7: api.SearchRoomsReply.rooms:type_name -> api.Room - 19, // 8: api.NewsSourceArray.sources:type_name -> api.NewsSource + 19, // 8: api.NewsSourceReply.sources:type_name -> api.NewsSource 74, // 9: api.GetTopNewsReply.created:type_name -> google.protobuf.Timestamp 74, // 10: api.GetTopNewsReply.from:type_name -> google.protobuf.Timestamp 74, // 11: api.GetTopNewsReply.to:type_name -> google.protobuf.Timestamp @@ -5688,7 +5700,7 @@ var file_CampusService_proto_depIdxs = []int32{ 1, // 76: api.Campus.RegisterDevice:input_type -> api.RegisterDeviceRequest 3, // 77: api.Campus.RemoveDevice:input_type -> api.RemoveDeviceRequest 20, // 78: api.Campus.GetTopNews:output_type -> api.GetTopNewsReply - 18, // 79: api.Campus.GetNewsSources:output_type -> api.NewsSourceArray + 18, // 79: api.Campus.GetNewsSources:output_type -> api.NewsSourceReply 16, // 80: api.Campus.SearchRooms:output_type -> api.SearchRoomsReply 14, // 81: api.Campus.GetLocations:output_type -> api.GetLocationsReply 12, // 82: api.Campus.GetRoomMaps:output_type -> api.GetRoomMapsReply @@ -5730,13 +5742,13 @@ var file_CampusService_proto_depIdxs = []int32{ 0, // [0:42] is the sub-list for field type_name } -func init() { file_CampusService_proto_init() } -func file_CampusService_proto_init() { - if File_CampusService_proto != nil { +func init() { file_tumdev_campus_backend_proto_init() } +func file_tumdev_campus_backend_proto_init() { + if File_tumdev_campus_backend_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_CampusService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RegisterDeviceRequest); i { case 0: return &v.state @@ -5748,7 +5760,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RegisterDeviceReply); i { case 0: return &v.state @@ -5760,7 +5772,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveDeviceRequest); i { case 0: return &v.state @@ -5772,7 +5784,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveDeviceReply); i { case 0: return &v.state @@ -5784,7 +5796,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOSDeviceRequestResponseRequest); i { case 0: return &v.state @@ -5796,7 +5808,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOSDeviceRequestResponseReply); i { case 0: return &v.state @@ -5808,7 +5820,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomScheduleRequest); i { case 0: return &v.state @@ -5820,7 +5832,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomScheduleReply); i { case 0: return &v.state @@ -5832,7 +5844,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomCoordinatesRequest); i { case 0: return &v.state @@ -5844,7 +5856,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomCoordinatesReply); i { case 0: return &v.state @@ -5856,7 +5868,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomMapsRequest); i { case 0: return &v.state @@ -5868,7 +5880,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomMapsReply); i { case 0: return &v.state @@ -5880,7 +5892,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLocationsRequest); i { case 0: return &v.state @@ -5892,7 +5904,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLocationsReply); i { case 0: return &v.state @@ -5904,7 +5916,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchRoomsRequest); i { case 0: return &v.state @@ -5916,7 +5928,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchRoomsReply); i { case 0: return &v.state @@ -5928,7 +5940,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Room); i { case 0: return &v.state @@ -5940,8 +5952,8 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewsSourceArray); i { + file_tumdev_campus_backend_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewsSourceReply); i { case 0: return &v.state case 1: @@ -5952,7 +5964,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewsSource); i { case 0: return &v.state @@ -5964,7 +5976,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTopNewsReply); i { case 0: return &v.state @@ -5976,7 +5988,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CafeteriaRatingRequest); i { case 0: return &v.state @@ -5988,7 +6000,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DishRatingRequest); i { case 0: return &v.state @@ -6000,7 +6012,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CafeteriaRatingReply); i { case 0: return &v.state @@ -6012,7 +6024,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DishRatingReply); i { case 0: return &v.state @@ -6024,7 +6036,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SingleRatingReply); i { case 0: return &v.state @@ -6036,7 +6048,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewCafeteriaRatingRequest); i { case 0: return &v.state @@ -6048,7 +6060,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewDishRatingRequest); i { case 0: return &v.state @@ -6060,7 +6072,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTagsReply); i { case 0: return &v.state @@ -6072,7 +6084,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TagsOverview); i { case 0: return &v.state @@ -6084,7 +6096,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTag); i { case 0: return &v.state @@ -6096,7 +6108,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTagNewRequest); i { case 0: return &v.state @@ -6108,7 +6120,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RatingTagResult); i { case 0: return &v.state @@ -6120,7 +6132,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCafeteriaReply); i { case 0: return &v.state @@ -6132,7 +6144,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Cafeteria); i { case 0: return &v.state @@ -6144,7 +6156,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetDishesRequest); i { case 0: return &v.state @@ -6156,7 +6168,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetDishesReply); i { case 0: return &v.state @@ -6168,7 +6180,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetResponsiblePersonReply); i { case 0: return &v.state @@ -6180,7 +6192,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResponsiblePersonElement); i { case 0: return &v.state @@ -6192,7 +6204,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBuilding2GpsReply); i { case 0: return &v.state @@ -6204,7 +6216,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Building2GpsElement); i { case 0: return &v.state @@ -6216,7 +6228,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAreaFacilitiesByBuildingNrReply); i { case 0: return &v.state @@ -6228,7 +6240,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAreaFacilitiesByBuildingNrRequest); i { case 0: return &v.state @@ -6240,7 +6252,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetListOfToiletsReply); i { case 0: return &v.state @@ -6252,7 +6264,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomInformationElement); i { case 0: return &v.state @@ -6264,7 +6276,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetListOfElevatorsReply); i { case 0: return &v.state @@ -6276,7 +6288,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMoreInformationReply); i { case 0: return &v.state @@ -6288,7 +6300,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MoreInformationElement); i { case 0: return &v.state @@ -6300,7 +6312,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOpeningTimesRequest); i { case 0: return &v.state @@ -6312,7 +6324,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetOpeningTimesReply); i { case 0: return &v.state @@ -6324,7 +6336,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpeningTimesMsgElement); i { case 0: return &v.state @@ -6336,7 +6348,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUpdateNoteRequest); i { case 0: return &v.state @@ -6348,7 +6360,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUpdateNoteReply); i { case 0: return &v.state @@ -6360,7 +6372,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetStudyRoomListReply); i { case 0: return &v.state @@ -6372,7 +6384,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StudyRoomMsgElement); i { case 0: return &v.state @@ -6384,7 +6396,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StudyRoom); i { case 0: return &v.state @@ -6396,7 +6408,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetKinoRequest); i { case 0: return &v.state @@ -6408,7 +6420,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetKinoReply); i { case 0: return &v.state @@ -6420,7 +6432,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KinoMsgElement); i { case 0: return &v.state @@ -6432,7 +6444,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendFeedbackRequest); i { case 0: return &v.state @@ -6444,7 +6456,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendFeedbackImageReply); i { case 0: return &v.state @@ -6456,7 +6468,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SendFeedbackImageRequest); i { case 0: return &v.state @@ -6468,7 +6480,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMembersRequest); i { case 0: return &v.state @@ -6480,7 +6492,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMembersReply); i { case 0: return &v.state @@ -6492,7 +6504,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUploadStatusRequest); i { case 0: return &v.state @@ -6504,7 +6516,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetUploadStatusReply); i { case 0: return &v.state @@ -6516,7 +6528,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationsReply); i { case 0: return &v.state @@ -6528,7 +6540,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NotificationsRequest); i { case 0: return &v.state @@ -6540,7 +6552,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNotificationsConfirmReply); i { case 0: return &v.state @@ -6552,7 +6564,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCanteenHeadCountRequest); i { case 0: return &v.state @@ -6564,7 +6576,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCanteenHeadCountReply); i { case 0: return &v.state @@ -6576,7 +6588,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomScheduleReply_RoomScheduleEvent); i { case 0: return &v.state @@ -6588,7 +6600,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRoomMapsReply_Map); i { case 0: return &v.state @@ -6600,7 +6612,7 @@ func file_CampusService_proto_init() { return nil } } - file_CampusService_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_tumdev_campus_backend_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetLocationsReply_Location); i { case 0: return &v.state @@ -6613,24 +6625,24 @@ func file_CampusService_proto_init() { } } } - file_CampusService_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_tumdev_campus_backend_proto_msgTypes[0].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_CampusService_proto_rawDesc, + RawDescriptor: file_tumdev_campus_backend_proto_rawDesc, NumEnums: 1, NumMessages: 73, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_CampusService_proto_goTypes, - DependencyIndexes: file_CampusService_proto_depIdxs, - EnumInfos: file_CampusService_proto_enumTypes, - MessageInfos: file_CampusService_proto_msgTypes, + GoTypes: file_tumdev_campus_backend_proto_goTypes, + DependencyIndexes: file_tumdev_campus_backend_proto_depIdxs, + EnumInfos: file_tumdev_campus_backend_proto_enumTypes, + MessageInfos: file_tumdev_campus_backend_proto_msgTypes, }.Build() - File_CampusService_proto = out.File - file_CampusService_proto_rawDesc = nil - file_CampusService_proto_goTypes = nil - file_CampusService_proto_depIdxs = nil + File_tumdev_campus_backend_proto = out.File + file_tumdev_campus_backend_proto_rawDesc = nil + file_tumdev_campus_backend_proto_goTypes = nil + file_tumdev_campus_backend_proto_depIdxs = nil } diff --git a/server/api/CampusService.pb.gw.go b/server/api/tumdev/campus_backend.pb.gw.go similarity index 99% rename from server/api/CampusService.pb.gw.go rename to server/api/tumdev/campus_backend.pb.gw.go index 29ba7444..a143fd43 100644 --- a/server/api/CampusService.pb.gw.go +++ b/server/api/tumdev/campus_backend.pb.gw.go @@ -1,5 +1,5 @@ // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: CampusService.proto +// source: tumdev/campus_backend.proto /* Package api is a reverse proxy. @@ -3053,7 +3053,7 @@ type response_Campus_GetNewsSources_0 struct { } func (m response_Campus_GetNewsSources_0) XXX_ResponseBody() interface{} { - response := m.Message.(*NewsSourceArray) + response := m.Message.(*NewsSourceReply) return response.Sources } diff --git a/server/api/CampusService.proto b/server/api/tumdev/campus_backend.proto similarity index 99% rename from server/api/CampusService.proto rename to server/api/tumdev/campus_backend.proto index b623fd9b..59533555 100644 --- a/server/api/CampusService.proto +++ b/server/api/tumdev/campus_backend.proto @@ -19,7 +19,7 @@ service Campus { }; } - rpc GetNewsSources (google.protobuf.Empty) returns (NewsSourceArray) { + rpc GetNewsSources (google.protobuf.Empty) returns (NewsSourceReply) { option (google.api.http) = { get: "/news/sources", response_body: "sources" @@ -376,7 +376,7 @@ message Room { string name = 9; } -message NewsSourceArray { +message NewsSourceReply { repeated NewsSource sources = 1; } @@ -627,6 +627,7 @@ message GetUpdateNoteRequest{ message GetUpdateNoteReply{ string message = 1; + string version_name = 2; } message GetStudyRoomListReply{ diff --git a/server/api/gen/openapiv2/CampusService.swagger.json b/server/api/tumdev/campus_backend.swagger.json similarity index 99% rename from server/api/gen/openapiv2/CampusService.swagger.json rename to server/api/tumdev/campus_backend.swagger.json index ff718593..1600e2b6 100644 --- a/server/api/gen/openapiv2/CampusService.swagger.json +++ b/server/api/tumdev/campus_backend.swagger.json @@ -2,7 +2,7 @@ "basePath": "/v1", "swagger": "2.0", "info": { - "title": "CampusService.proto", + "title": "tumdev/campus_backend.proto", "version": "version not set" }, "tags": [ @@ -1734,6 +1734,9 @@ "properties": { "message": { "type": "string" + }, + "versionName": { + "type": "string" } } }, @@ -1925,7 +1928,7 @@ } } }, - "apiNewsSourceArray": { + "apiNewsSourceReply": { "type": "object", "properties": { "sources": { diff --git a/server/api/CampusService_grpc.pb.go b/server/api/tumdev/campus_backend_grpc.pb.go similarity index 99% rename from server/api/CampusService_grpc.pb.go rename to server/api/tumdev/campus_backend_grpc.pb.go index 461160f5..5fe93432 100644 --- a/server/api/CampusService_grpc.pb.go +++ b/server/api/tumdev/campus_backend_grpc.pb.go @@ -2,12 +2,13 @@ // versions: // - protoc-gen-go-grpc v1.3.0 // - protoc (unknown) -// source: CampusService.proto +// source: tumdev/campus_backend.proto package api import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -63,7 +64,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type CampusClient interface { GetTopNews(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetTopNewsReply, error) - GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceArray, error) + GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) SearchRooms(ctx context.Context, in *SearchRoomsRequest, opts ...grpc.CallOption) (*SearchRoomsReply, error) // a location is a campus location/building, e.g. "Garching Forschungszentrum" GetLocations(ctx context.Context, in *GetLocationsRequest, opts ...grpc.CallOption) (*GetLocationsReply, error) @@ -122,8 +123,8 @@ func (c *campusClient) GetTopNews(ctx context.Context, in *emptypb.Empty, opts . return out, nil } -func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceArray, error) { - out := new(NewsSourceArray) +func (c *campusClient) GetNewsSources(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*NewsSourceReply, error) { + out := new(NewsSourceReply) err := c.cc.Invoke(ctx, Campus_GetNewsSources_FullMethodName, in, out, opts...) if err != nil { return nil, err @@ -442,7 +443,7 @@ func (c *campusClient) RemoveDevice(ctx context.Context, in *RemoveDeviceRequest // for forward compatibility type CampusServer interface { GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) - GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceArray, error) + GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) // a location is a campus location/building, e.g. "Garching Forschungszentrum" GetLocations(context.Context, *GetLocationsRequest) (*GetLocationsReply, error) @@ -492,7 +493,7 @@ type UnimplementedCampusServer struct { func (UnimplementedCampusServer) GetTopNews(context.Context, *emptypb.Empty) (*GetTopNewsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTopNews not implemented") } -func (UnimplementedCampusServer) GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceArray, error) { +func (UnimplementedCampusServer) GetNewsSources(context.Context, *emptypb.Empty) (*NewsSourceReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNewsSources not implemented") } func (UnimplementedCampusServer) SearchRooms(context.Context, *SearchRoomsRequest) (*SearchRoomsReply, error) { @@ -1411,5 +1412,5 @@ var Campus_ServiceDesc = grpc.ServiceDesc{ }, }, Streams: []grpc.StreamDesc{}, - Metadata: "CampusService.proto", + Metadata: "tumdev/campus_backend.proto", } diff --git a/server/backend/cafeteriaRatingDBInitializer.go b/server/backend/cafeteriaRatingDBInitializer.go index 3193753c..454aca80 100644 --- a/server/backend/cafeteriaRatingDBInitializer.go +++ b/server/backend/cafeteriaRatingDBInitializer.go @@ -4,6 +4,7 @@ import ( "database/sql" "embed" "encoding/json" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/guregu/null" log "github.com/sirupsen/logrus" diff --git a/server/backend/cafeteriaService.go b/server/backend/cafeteriaService.go index c0573a27..9b1bb4c9 100644 --- a/server/backend/cafeteriaService.go +++ b/server/backend/cafeteriaService.go @@ -7,7 +7,6 @@ import ( "crypto/md5" "errors" "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" "image" "image/jpeg" "math" @@ -15,6 +14,8 @@ import ( "strings" "time" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/disintegration/imaging" log "github.com/sirupsen/logrus" @@ -50,7 +51,7 @@ func (s *CampusServer) GetCafeteriaRatings(_ context.Context, input *pb.Cafeteri if res.Error != nil { log.WithError(res.Error).Error("Error while querying the cafeteria with Id ", cafeteriaId) - return nil, status.Errorf(codes.Internal, "This cafeteria has not yet been rated.") + return nil, status.Error(codes.Internal, "This cafeteria has not yet been rated.") } if res.RowsAffected > 0 { @@ -157,7 +158,7 @@ func (s *CampusServer) GetDishRatings(_ context.Context, input *pb.DishRatingReq if err.Error != nil { fields := log.Fields{"dishID": dishID, "cafeteriaID": cafeteriaID} log.WithError(err.Error).WithFields(fields).Error("Error while querying the average ratings") - return nil, status.Errorf(codes.Internal, "This dish has not yet been rated.") + return nil, status.Error(codes.Internal, "This dish has not yet been rated.") } if err.RowsAffected > 0 { @@ -249,15 +250,12 @@ func getImageToBytes(path string) []byte { return make([]byte, 0) } file, err := os.Open(path) - if err != nil { log.WithError(err).Error("while opening image file with path: ", path) return nil } - defer func(file *os.File) { - err := file.Close() - if err != nil { + if err := file.Close(); err != nil { log.WithError(err).Error("Unable to close the file for storing the image.") } }(file) @@ -267,8 +265,7 @@ func getImageToBytes(path string) []byte { imageAsBytes := make([]byte, size) buffer := bufio.NewReader(file) - _, err = buffer.Read(imageAsBytes) - if err != nil { + if _, err = buffer.Read(imageAsBytes); err != nil { log.WithError(err).Error("while trying to read image as bytes") return nil } @@ -376,10 +373,9 @@ func (s *CampusServer) NewCafeteriaRating(_ context.Context, input *pb.NewCafete Image: resPath, } - err := s.db.Model(&model.CafeteriaRating{}).Create(&rating).Error - if err != nil { + if err := s.db.Model(&model.CafeteriaRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("Error occurred while creating the new cafeteria rating.") - return nil, status.Errorf(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.") + return nil, status.Error(codes.InvalidArgument, "Error while creating new cafeteria rating. Rating has not been saved.") } return storeRatingTags(s, rating.CafeteriaRating, input.RatingTags, CAFETERIA) @@ -400,12 +396,11 @@ func imageWrapper(image []byte, path string, id int32) string { } // storeImage -// stores an image and returns teh path to this image. +// stores an image and returns the path to this image. // if needed, a new directory will be created and the path is extended until it is unique func storeImage(path string, i []byte) (string, error) { if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { - err := os.MkdirAll(path, os.ModePerm) - if err != nil { + if err := os.MkdirAll(path, os.ModePerm); err != nil { log.WithError(err).WithField("path", path).Error("Directory could not be created successfully") return "", nil } @@ -430,8 +425,7 @@ func storeImage(path string, i []byte) (string, error) { return imgPath, errFile } defer func(out *os.File) { - err := out.Close() - if err != nil { + if err := out.Close(); err != nil { log.WithError(err).Error("while closing the file.") } }(out) @@ -459,7 +453,7 @@ func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingR First(&dish).Error if errDish != nil || dish == nil { log.WithError(errDish).Error("Error while creating a new dish rating.") - return nil, status.Errorf(codes.InvalidArgument, "Dish is not offered in this week in this canteen. Rating has not been saved.") + return nil, status.Error(codes.InvalidArgument, "Dish is not offered in this week in this canteen. Rating has not been saved.") } resPath := imageWrapper(input.Image, "dishes", dish.Dish) @@ -473,10 +467,9 @@ func (s *CampusServer) NewDishRating(_ context.Context, input *pb.NewDishRatingR Image: resPath, } - err := s.db.Model(&model.DishRating{}).Create(&rating).Error - if err != nil { + if err := s.db.Model(&model.DishRating{}).Create(&rating).Error; err != nil { log.WithError(err).Error("while creating a new dish rating.") - return nil, status.Errorf(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.") + return nil, status.Error(codes.Internal, "Error while creating the new rating in the database. Rating has not been saved.") } assignDishNameTag(s, rating, dish.Dish) @@ -511,24 +504,24 @@ func assignDishNameTag(s *CampusServer, rating model.DishRating, dishID int32) { // Additionally, queries the cafeteria ID, since it checks whether the cafeteria actually exists. func inputSanitizationForNewRatingElements(rating int32, comment string, cafeteriaName string, s *CampusServer) (int32, error) { if rating > 5 || rating < 0 { - return -1, status.Errorf(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Rating must be a positive number not larger than 10. Rating has not been saved.") } if len(comment) > 256 { - return -1, status.Errorf(codes.InvalidArgument, "Ratings can only contain up to 256 characters, this is too long. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Ratings can only contain up to 256 characters, this is too long. Rating has not been saved.") } if strings.Contains(comment, "@") { - return -1, status.Errorf(codes.InvalidArgument, "Comments must not contain @ symbols in order to prevent misuse. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Comments must not contain @ symbols in order to prevent misuse. Rating has not been saved.") } var result *model.Cafeteria res := s.db.Model(&model.Cafeteria{}). Where("name LIKE ?", cafeteriaName). First(&result) - if res.Error == gorm.ErrRecordNotFound || res.RowsAffected == 0 { + if errors.Is(res.Error, gorm.ErrRecordNotFound) || res.RowsAffected == 0 { log.WithError(res.Error).Error("Error while querying the cafeteria id by name: ", cafeteriaName) - return -1, status.Errorf(codes.InvalidArgument, "Cafeteria does not exist. Rating has not been saved.") + return -1, status.Error(codes.InvalidArgument, "Cafeteria does not exist. Rating has not been saved.") } return result.Cafeteria, nil @@ -587,11 +580,11 @@ func storeRatingTags(s *CampusServer, parentRatingID int32, tags []*pb.RatingTag } if len(errorOccurred) > 0 && len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+errorOccurred+" does not exist. Remaining rating was saved without this rating tag. The tag(s) "+warningOccurred+" occurred more than once in this rating.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag. The tag(s) %s occurred more than once in this rating.", errorOccurred, warningOccurred)) } else if len(errorOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+errorOccurred+" does not exist. Remaining rating was saved without this rating tag.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s does not exist. Remaining rating was saved without this rating tag.", errorOccurred)) } else if len(warningOccurred) > 0 { - return &emptypb.Empty{}, status.Errorf(codes.InvalidArgument, "The tag(s) "+warningOccurred+" occurred more than once in this rating.") + return &emptypb.Empty{}, status.Error(codes.InvalidArgument, fmt.Sprintf("The tag(s) %s occurred more than once in this rating.", warningOccurred)) } else { return &emptypb.Empty{}, nil } @@ -641,7 +634,7 @@ func (s *CampusServer) GetAvailableDishTags(_ context.Context, _ *emptypb.Empty) err := s.db.Model(&model.DishRatingTagOption{}).Select("DE as de, EN as en, dishRatingTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Available dish tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -657,7 +650,7 @@ func (s *CampusServer) GetNameTags(_ context.Context, _ *emptypb.Empty) (*pb.Get err := s.db.Model(&model.DishNameTagOption{}).Select("DE as de, EN as en, dishNameTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading available Name Tags from database.") - requestStatus = status.Errorf(codes.Internal, "Available dish tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available dish tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -673,7 +666,7 @@ func (s *CampusServer) GetAvailableCafeteriaTags(_ context.Context, _ *emptypb.E err := s.db.Model(&model.CafeteriaRatingTagOption{}).Select("DE as de, EN as en, cafeteriaRatingsTagOption as TagId").Find(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Available cafeteria tags could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Available cafeteria tags could not be loaded from the database.") } return &pb.GetTagsReply{ @@ -689,7 +682,7 @@ func (s *CampusServer) GetCafeterias(_ context.Context, _ *emptypb.Empty) (*pb.G err := s.db.Model(&model.Cafeteria{}).Select("cafeteria as id,address,latitude,longitude").Scan(&result).Error if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Cafeterias could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.") } return &pb.GetCafeteriaReply{ @@ -699,13 +692,13 @@ func (s *CampusServer) GetCafeterias(_ context.Context, _ *emptypb.Empty) (*pb.G func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest) (*pb.GetDishesReply, error) { if request.Year < 2022 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Years must be larger or equal to 2022 ") // currently, no previous values have been added + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Years must be larger or equal to 2022 ") // currently, no previous values have been added } if request.Week < 1 || request.Week > 53 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Weeks must be in the range 1 - 53") + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Weeks must be in the range 1 - 53") } if request.Day < 0 || request.Day > 4 { - return &pb.GetDishesReply{}, status.Errorf(codes.Internal, "Days must be in the range 1 (Monday) - 4 (Friday)") + return &pb.GetDishesReply{}, status.Error(codes.Internal, "Days must be in the range 1 (Monday) - 4 (Friday)") } var requestStatus error = nil @@ -721,7 +714,7 @@ func (s *CampusServer) GetDishes(_ context.Context, request *pb.GetDishesRequest if err != nil { log.WithError(err).Error("while loading Cafeterias from database.") - requestStatus = status.Errorf(codes.Internal, "Cafeterias could not be loaded from the database.") + requestStatus = status.Error(codes.Internal, "Cafeterias could not be loaded from the database.") } return &pb.GetDishesReply{ diff --git a/server/backend/campus_api/campusApi.go b/server/backend/campus_api/campusApi.go index 1a3d192d..b79ec94e 100644 --- a/server/backend/campus_api/campusApi.go +++ b/server/backend/campus_api/campusApi.go @@ -4,10 +4,11 @@ package campus_api import ( "encoding/xml" "errors" - "github.com/TUM-Dev/Campus-Backend/server/model" - log "github.com/sirupsen/logrus" "io" "net/http" + + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" ) const ( @@ -38,23 +39,18 @@ func FetchGrades(token string) (*model.IOSGrades, error) { req.URL.RawQuery = q.Encode() resp, err := http.DefaultClient.Do(req) - if err != nil { log.WithError(err).Error("failed to fetch grades") return nil, ErrWhileFetchingGrades } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) var grades model.IOSGrades - err = xml.NewDecoder(resp.Body).Decode(&grades) - - if err != nil { + if err = xml.NewDecoder(resp.Body).Decode(&grades); err != nil { log.WithError(err).Error("could not unmarshall grades") return nil, ErrorWhileUnmarshalling } diff --git a/server/backend/canteenHeadCount.go b/server/backend/canteenHeadCount.go index 58af641f..589b2b7e 100644 --- a/server/backend/canteenHeadCount.go +++ b/server/backend/canteenHeadCount.go @@ -4,7 +4,7 @@ import ( "context" "errors" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/timestamppb" diff --git a/server/backend/cron/canteenHeadCount.go b/server/backend/cron/canteenHeadCount.go index 5f42ddfe..1eecc9c2 100644 --- a/server/backend/cron/canteenHeadCount.go +++ b/server/backend/cron/canteenHeadCount.go @@ -189,8 +189,7 @@ func updateDb(canteen *CanteenApInformation, count uint32, db *gorm.DB) error { } if res.RowsAffected == 0 { - err := db.Create(&entry).Error - if err != nil { + if err := db.Create(&entry).Error; err != nil { fields := log.Fields{ "CanteenId": entry.CanteenId, "Count": entry.Count, @@ -198,8 +197,8 @@ func updateDb(canteen *CanteenApInformation, count uint32, db *gorm.DB) error { "Percent": entry.Percent, "Timestamp": entry.Timestamp} log.WithError(res.Error).WithFields(fields).Error("could not create headcount entry") + return err } - return err } return nil } @@ -216,17 +215,15 @@ func (canteen CanteenApInformation) requestApData() []AccessPoint { // Ensure we close the body once we leave this function if resp.Body != nil { defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) } // Parse as JSON - aps := []AccessPoint{} - err = json.NewDecoder(resp.Body).Decode(&aps) - if err != nil { + var aps []AccessPoint + if err = json.NewDecoder(resp.Body).Decode(&aps); err != nil { log.WithError(err).Error("Canteen HeadCount parsing output as JSON failed for: ", canteen.CanteenId) return []AccessPoint{} } diff --git a/server/backend/cron/cronjobs.go b/server/backend/cron/cronjobs.go index fc6858b9..5d2bd422 100644 --- a/server/backend/cron/cronjobs.go +++ b/server/backend/cron/cronjobs.go @@ -1,9 +1,11 @@ package cron import ( - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" + "github.com/TUM-Dev/Campus-Backend/server/env" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/mmcdole/gofeed" log "github.com/sirupsen/logrus" @@ -12,10 +14,9 @@ import ( ) type CronService struct { - db *gorm.DB - gf *gofeed.Parser - useMensa bool - APNs *ios_apns.Service + db *gorm.DB + gf *gofeed.Parser + APNs *ios_apns.Service } const StorageDir = "/Storage/" // target location of files @@ -36,21 +37,22 @@ const ( AlarmType = "alarm" */ ) -func New(db *gorm.DB, mensaCronActivated bool) *CronService { +func New(db *gorm.DB) *CronService { return &CronService{ - db: db, - gf: gofeed.NewParser(), - APNs: ios_apns.NewCronService(db), - useMensa: mensaCronActivated, + db: db, + gf: gofeed.NewParser(), + APNs: ios_apns.NewCronService(db), } } func (c *CronService) Run() error { - log.WithField("MensaCronsRunning", c.useMensa).Trace("running cron service") + log.WithField("MensaCronActive", env.IsMensaCronActive()).Debug("running cron service") g := new(errgroup.Group) - g.Go(func() error { return c.dishNameDownloadCron() }) - g.Go(func() error { return c.averageRatingComputation() }) + if env.IsMensaCronActive() { + g.Go(func() error { return c.dishNameDownloadCron() }) + g.Go(func() error { return c.averageRatingComputation() }) + } for { log.Trace("Cron: checking for pending") @@ -72,7 +74,7 @@ func (c *CronService) Run() error { for _, cronjob := range res { // Persist run to DB right away var offset int32 = 0 - if c.useMensa { + if env.IsMensaCronActive() { if cronjob.Type.String == AverageRatingComputation { if time.Now().Hour() == 16 { offset = 18 * 3600 // fast-forward 18 Hours to the next day + does not need to be computed overnight @@ -95,11 +97,11 @@ func (c *CronService) Run() error { case FileDownloadType: g.Go(func() error { return c.fileDownloadCron() }) case DishNameDownload: - if c.useMensa { + if env.IsMensaCronActive() { g.Go(c.dishNameDownloadCron) } case AverageRatingComputation: //call every five minutes between 11AM and 4 PM on weekdays - if c.useMensa { + if env.IsMensaCronActive() { g.Go(c.averageRatingComputation) } /* diff --git a/server/backend/cron/fileDownload.go b/server/backend/cron/fileDownload.go index 32f36757..f70e1f10 100644 --- a/server/backend/cron/fileDownload.go +++ b/server/backend/cron/fileDownload.go @@ -3,16 +3,17 @@ package cron import ( "bytes" "fmt" - "github.com/TUM-Dev/Campus-Backend/server/model" - "github.com/disintegration/imaging" - "github.com/gabriel-vasile/mimetype" - log "github.com/sirupsen/logrus" - "gorm.io/gorm" "image" "io" "net/http" "os" "strings" + + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/disintegration/imaging" + "github.com/gabriel-vasile/mimetype" + log "github.com/sirupsen/logrus" + "gorm.io/gorm" ) // fileDownloadCron Downloads all files that are not marked as finished in the database. diff --git a/server/backend/cron/news.go b/server/backend/cron/news.go index d48dd805..02198907 100644 --- a/server/backend/cron/news.go +++ b/server/backend/cron/news.go @@ -5,15 +5,16 @@ import ( "database/sql" "errors" "fmt" + "regexp" + "strings" + "time" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/guregu/null" "github.com/microcosm-cc/bluemonday" "github.com/mmcdole/gofeed" log "github.com/sirupsen/logrus" "gorm.io/gorm" - "regexp" - "strings" - "time" ) const ( diff --git a/server/backend/device.go b/server/backend/device.go index 05938d8b..0250f4e7 100644 --- a/server/backend/device.go +++ b/server/backend/device.go @@ -2,10 +2,11 @@ package backend import ( "context" - pb "github.com/TUM-Dev/Campus-Backend/server/api" "sync" "time" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" @@ -22,6 +23,15 @@ type deviceBuffer struct { interval time.Duration // flush interval } +func newDeviceBuffer() *deviceBuffer { + return &deviceBuffer{ + lock: sync.Mutex{}, + devices: make(map[string]*model.Devices), + interval: time.Minute, + } + +} + func (s *CampusServer) RunDeviceFlusher() error { for { time.Sleep(s.deviceBuf.interval) diff --git a/server/backend/influx/influxClient.go b/server/backend/influx/influxClient.go index 266047e4..afb985d6 100644 --- a/server/backend/influx/influxClient.go +++ b/server/backend/influx/influxClient.go @@ -5,12 +5,13 @@ import ( "crypto/sha256" "encoding/hex" "errors" + "os" + "github.com/TUM-Dev/Campus-Backend/server/env" influxdb2 "github.com/influxdata/influxdb-client-go/v2" "github.com/influxdata/influxdb-client-go/v2/api" "github.com/influxdata/influxdb-client-go/v2/api/write" log "github.com/sirupsen/logrus" - "os" ) var ( diff --git a/server/backend/influxdb.go b/server/backend/influxdb.go index 1028186d..28ae23d9 100644 --- a/server/backend/influxdb.go +++ b/server/backend/influxdb.go @@ -3,9 +3,10 @@ package backend import ( "context" "errors" + "os" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" influxdb2 "github.com/influxdata/influxdb-client-go/v2" - "os" ) const ( diff --git a/server/backend/iosNotifications.go b/server/backend/iosNotifications.go index c43131ef..bc759e92 100644 --- a/server/backend/iosNotifications.go +++ b/server/backend/iosNotifications.go @@ -2,7 +2,8 @@ package backend import ( "context" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" diff --git a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go index 1091b8f7..3108b090 100644 --- a/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go +++ b/server/backend/ios_notifications/ios_apns/iosAPNsRepository.go @@ -4,16 +4,17 @@ import ( "bytes" "encoding/json" "errors" + "io" + "net/http" + "strconv" + "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/env" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "golang.org/x/net/http2" "gorm.io/gorm" - "io" - "net/http" - "strconv" - "time" ) const ( @@ -100,20 +101,18 @@ func (r *Repository) SendNotification(notification *model.IOSNotificationPayload resp, err := client.Do(req) if err != nil { - log.Error(err) + log.WithError(err).Error("Could not send notification") return nil, ErrCouldNotSendNotification } - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { + if err := Body.Close(); err != nil { log.WithError(err).Error("Could not close body") } }(resp.Body) var response model.IOSRemoteNotificationResponse if err = json.NewDecoder(resp.Body).Decode(&response); err != nil && err != io.EOF { - log.Error(err) + log.WithError(err).Error("Could not decode APNs response") return nil, ErrCouldNotDecodeAPNsResponse } @@ -137,15 +136,13 @@ func NewRepository(db *gorm.DB, token *ios_apns_jwt.Token) *Repository { func NewCronRepository(db *gorm.DB) (*Repository, error) { if err := ValidateRequirementsForIOSNotificationsService(); err != nil { - log.Warn(err) - + log.WithError(err).Warn("Failed to validate requirements for ios notifications service") return nil, err } token, err := ios_apns_jwt.NewToken() - if err != nil { - log.Fatal(err) + log.WithError(err).Fatal("Could not create APNs token") } return NewRepository(db, token), nil diff --git a/server/backend/ios_notifications/ios_apns/iosAPNsService.go b/server/backend/ios_notifications/ios_apns/iosAPNsService.go index 37427fca..ef79c2e1 100644 --- a/server/backend/ios_notifications/ios_apns/iosAPNsService.go +++ b/server/backend/ios_notifications/ios_apns/iosAPNsService.go @@ -4,6 +4,7 @@ package ios_apns import ( "errors" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/model" diff --git a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go index 0b6fe133..cb9cecd3 100644 --- a/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go +++ b/server/backend/ios_notifications/ios_apns/ios_apns_jwt/iosAPNsToken.go @@ -6,12 +6,13 @@ import ( "crypto/x509" "encoding/pem" "errors" - "github.com/golang-jwt/jwt" - log "github.com/sirupsen/logrus" "os" "path/filepath" "sync" "time" + + "github.com/golang-jwt/jwt" + log "github.com/sirupsen/logrus" ) const ( @@ -39,7 +40,6 @@ type Token struct { func NewToken() (*Token, error) { encryptionKey, err := APNsEncryptionKeyFromFile() - if err != nil { return nil, err } @@ -50,9 +50,7 @@ func NewToken() (*Token, error) { TeamId: ApnsTeamId, } - _, err = token.Generate() - - if err != nil { + if err = token.Generate(); err != nil { return nil, err } @@ -106,7 +104,7 @@ func (t *Token) GenerateNewTokenIfExpired() (bearer string) { defer t.Unlock() if t.IsExpired() { - _, err := t.Generate() + err := t.Generate() if err != nil { return "" } @@ -119,9 +117,9 @@ func (t *Token) IsExpired() bool { return currentTimestamp() >= (t.IssuedAt + TokenTimeout) } -func (t *Token) Generate() (bool, error) { +func (t *Token) Generate() error { if t.EncryptionKey == nil { - return false, ErrorAuthKeyNil + return ErrorAuthKeyNil } issuedAt := currentTimestamp() @@ -141,13 +139,13 @@ func (t *Token) Generate() (bool, error) { token, err := jwtToken.SignedString(t.EncryptionKey) if err != nil { - return false, err + return err } t.IssuedAt = issuedAt t.Bearer = token - return true, nil + return nil } func currentTimestamp() int64 { diff --git a/server/backend/ios_notifications/ios_crypto/encryptedString.go b/server/backend/ios_notifications/ios_crypto/encryptedString.go index 24a04a53..24a7aac4 100644 --- a/server/backend/ios_notifications/ios_crypto/encryptedString.go +++ b/server/backend/ios_notifications/ios_crypto/encryptedString.go @@ -11,6 +11,7 @@ import ( "encoding/base64" "encoding/pem" "errors" + log "github.com/sirupsen/logrus" ) @@ -97,19 +98,16 @@ func SymmetricEncrypt(plaintext string, key string) (*EncryptedString, error) { func SymmetricDecrypt(encryptedString EncryptedString, key string) (string, error) { bytesKey := []byte(key) bytesEncryptedString, err := base64.StdEncoding.DecodeString(string(encryptedString)) - if err != nil { return "", err } c, err := aes.NewCipher(bytesKey) - if err != nil { return "", err } gcm, err := cipher.NewGCM(c) - if err != nil { return "", err } @@ -118,7 +116,6 @@ func SymmetricDecrypt(encryptedString EncryptedString, key string) (string, erro nonce, ciphertext := bytesEncryptedString[:nonceSize], bytesEncryptedString[nonceSize:] plaintext, err := gcm.Open(nil, nonce, ciphertext, nil) - if err != nil { return "", err } diff --git a/server/backend/ios_notifications/ios_device/iosDeviceRepository.go b/server/backend/ios_notifications/ios_device/iosDeviceRepository.go index 334fe82a..969256c0 100644 --- a/server/backend/ios_notifications/ios_device/iosDeviceRepository.go +++ b/server/backend/ios_notifications/ios_device/iosDeviceRepository.go @@ -2,6 +2,7 @@ package ios_device import ( "errors" + "github.com/TUM-Dev/Campus-Backend/server/model" "gorm.io/gorm" ) diff --git a/server/backend/ios_notifications/ios_device/iosDeviceService.go b/server/backend/ios_notifications/ios_device/iosDeviceService.go index 3256ff0d..8f5209d7 100644 --- a/server/backend/ios_notifications/ios_device/iosDeviceService.go +++ b/server/backend/ios_notifications/ios_device/iosDeviceService.go @@ -2,7 +2,7 @@ package ios_device import ( - pb "github.com/TUM-Dev/Campus-Backend/server/api" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/model" "google.golang.org/grpc/codes" diff --git a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go index 12f7207c..e2c02b0d 100644 --- a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go +++ b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetRepository.go @@ -1,11 +1,12 @@ package ios_devices_activity_reset import ( + "time" + "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" "gorm.io/gorm" "gorm.io/gorm/clause" - "time" ) type Repository struct { diff --git a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go index ddea9248..764c590e 100644 --- a/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go +++ b/server/backend/ios_notifications/ios_devices_activity_reset/iosDevicesActivityResetService.go @@ -1,10 +1,11 @@ package ios_devices_activity_reset import ( + "time" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" log "github.com/sirupsen/logrus" "gorm.io/gorm" - "time" ) type Service struct { diff --git a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go index 32a3faa9..4bc9bfec 100644 --- a/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go +++ b/server/backend/ios_notifications/ios_request_response/iosRequestResponseService.go @@ -5,7 +5,8 @@ package ios_request_response import ( "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/campus_api" "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" @@ -76,19 +77,19 @@ func (service *Service) handleDeviceCampusTokenRequest(requestLog *model.IOSDevi apiGrades, err := campus_api.FetchGrades(campusToken) if err != nil { - log.Error("Could not fetch grades: ", err) + log.WithError(err).Error("Could not fetch grades") return nil, ErrInternalHandleGrades } oldEncryptedGrades, err := service.Repository.GetIOSEncryptedGrades(requestLog.DeviceID) if err != nil { - log.Error("Could not get old grades: ", err) + log.WithError(err).Error("Could not get old grades") return nil, ErrInternalHandleGrades } oldGrades, err := decryptGrades(oldEncryptedGrades, campusToken) if err != nil { - log.Error("Could not decrypt old grades: ", err) + log.WithError(err).Error("Could not decrypt old grades") return nil, ErrInternalHandleGrades } @@ -104,7 +105,7 @@ func (service *Service) handleDeviceCampusTokenRequest(requestLog *model.IOSDevi err = service.Repository.DeleteEncryptedGrades(requestLog.DeviceID) if err != nil { - log.Error("Could not delete old grades: ", err) + log.WithError(err).Error("Could not delete old grades") return nil, ErrInternalHandleGrades } @@ -129,7 +130,7 @@ func (service *Service) deleteRequestLog(requestLog *model.IOSDeviceRequestLog) err := service.Repository.DeleteAllRequestLogsForThisDeviceWithType(requestLog) if err != nil { - log.Error("Could not delete request logs: ", err) + log.WithError(err).Error("Could not delete request logs") } } @@ -139,7 +140,7 @@ func decryptGrades(grades []model.IOSEncryptedGrade, campusToken string) ([]mode err := encryptedGrade.Decrypt(campusToken) if err != nil { - log.Error("Could not decrypt grade: ", err) + log.WithError(err).Error("Could not decrypt grade") return nil, status.Error(codes.Internal, "Could not decrypt grade") } @@ -177,15 +178,13 @@ func (service *Service) encryptGradesAndStoreInDatabase(grades []model.IOSGrade, } err := encryptedGrade.Encrypt(campusToken) - if err != nil { - log.Error("Could not encrypt grade: ", err) + log.WithError(err).Error("Could not encrypt grade") } err = service.Repository.SaveEncryptedGrade(&encryptedGrade) - if err != nil { - log.Error("Could not save grade: ", err) + log.WithError(err).Error("Could not save grade") } } } @@ -210,12 +209,11 @@ func sendGradesToDevice(device *model.IOSDevice, grades []model.IOSGrade, apns * Alert(alertTitle, "", alertBody). Encrypt(device.PublicKey) - log.WithField("DeviceID", device.DeviceID).Infof("Sending push notification") + log.WithField("DeviceID", device.DeviceID).Info("Sending push notification") _, err := apns.SendAlertNotification(notificationPayload) - if err != nil { - log.Error("Could not send notification: ", err) + log.WithField("DeviceID", device.DeviceID).WithError(err).Error("Could not send notification") } } diff --git a/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go b/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go index 1e1f9ee6..715684db 100644 --- a/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go +++ b/server/backend/ios_notifications/ios_scheduling/iosSchedulingService.go @@ -3,13 +3,14 @@ package ios_scheduling import ( + "sync" + "github.com/TUM-Dev/Campus-Backend/server/backend/influx" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_device" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_scheduled_update_log" "github.com/TUM-Dev/Campus-Backend/server/model" log "github.com/sirupsen/logrus" - "sync" ) const ( diff --git a/server/backend/migration/20210709193000.go b/server/backend/migration/20210709193000.go index f3945cb7..c8e3967a 100644 --- a/server/backend/migration/20210709193000.go +++ b/server/backend/migration/20210709193000.go @@ -2,6 +2,7 @@ package migration import ( "database/sql" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" "github.com/guregu/null" diff --git a/server/backend/migration/20221119131300.go b/server/backend/migration/20221119131300.go index 2f4588dc..393bf9ee 100644 --- a/server/backend/migration/20221119131300.go +++ b/server/backend/migration/20221119131300.go @@ -4,6 +4,7 @@ import ( "database/sql" _ "embed" "encoding/json" + "github.com/TUM-Dev/Campus-Backend/server/backend/cron" "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" diff --git a/server/backend/migration/20230825000000.go b/server/backend/migration/20230825000000.go index 6f64ea82..2e49d370 100644 --- a/server/backend/migration/20230825000000.go +++ b/server/backend/migration/20230825000000.go @@ -1,8 +1,11 @@ package migration import ( + "database/sql" + "github.com/TUM-Dev/Campus-Backend/server/model" "github.com/go-gormigrate/gormigrate/v2" + "github.com/guregu/null" "gorm.io/gorm" ) @@ -12,14 +15,19 @@ func (m TumDBMigrator) migrate20230825000000() *gormigrate.Migration { return &gormigrate.Migration{ ID: "20230825000000", Migrate: func(tx *gorm.DB) error { - // deactivete the crontab (Rollback deletes this from the enum) - // given that previously, not cronjobs for this type existed there is no need to remove offending entries first + if err := tx.Delete(&model.Crontab{}, "type = 'chat'").Error; err != nil { + return err + } return SafeEnumRollback(tx, &model.Crontab{}, "type", "chat") }, Rollback: func(tx *gorm.DB) error { - // activete the crontab (Migrate adds this from to the enum) - // given that previously, not cronjobs for this type existed there is no need to add entries first - return SafeEnumMigrate(tx, &model.Crontab{}, "type", "chat") + if err := SafeEnumMigrate(tx, &model.Crontab{}, "type", "chat"); err != nil { + return err + } + return tx.Create(&model.Crontab{ + Interval: 60 * 10, // Every 10 minutes + Type: null.String{NullString: sql.NullString{String: "chat", Valid: true}}, + }).Error }, } } diff --git a/server/backend/migration/20230904000000.go b/server/backend/migration/20230904000000.go index dd75988d..b397022b 100644 --- a/server/backend/migration/20230904000000.go +++ b/server/backend/migration/20230904000000.go @@ -16,7 +16,7 @@ func (m TumDBMigrator) migrate20230904000000() *gormigrate.Migration { ID: "20230904000000", Migrate: func(tx *gorm.DB) error { // remove "canteenHeadCount" in the enum - if err := tx.Where("type = ?", "ticketsales").Delete(&model.Crontab{}).Error; err != nil { + if err := tx.Delete(&model.Crontab{}, "type = 'ticketsales'").Error; err != nil { return err } if err := SafeEnumRollback(tx, model.Crontab{}, "type", "ticketsales"); err != nil { diff --git a/server/backend/migration/migration.go b/server/backend/migration/migration.go index 1613c268..7cd9acf6 100644 --- a/server/backend/migration/migration.go +++ b/server/backend/migration/migration.go @@ -35,14 +35,21 @@ func (m TumDBMigrator) Migrate() error { return err } log.Info("Using manual migration") - mig := gormigrate.New(m.database, gormigrate.DefaultOptions, []*gormigrate.Migration{ + gormigrateOptions := &gormigrate.Options{ + TableName: gormigrate.DefaultOptions.TableName, + IDColumnName: gormigrate.DefaultOptions.IDColumnName, + IDColumnSize: gormigrate.DefaultOptions.IDColumnSize, + UseTransaction: true, + ValidateUnknownMigrations: true, + } + mig := gormigrate.New(m.database, gormigrateOptions, []*gormigrate.Migration{ m.migrate20210709193000(), m.migrate20220126230000(), m.migrate20220713000000(), m.migrate20221119131300(), m.migrate20221210000000(), - m.migrate20230904000000(), m.migrate20230825000000(), + m.migrate20230904000000(), }) err := mig.Migrate() return err diff --git a/server/backend/migration/safeEnumMigrate.go b/server/backend/migration/safeEnumMigrate.go index 0d106b9a..376bdaa4 100644 --- a/server/backend/migration/safeEnumMigrate.go +++ b/server/backend/migration/safeEnumMigrate.go @@ -3,8 +3,9 @@ package migration import ( "errors" "fmt" - "gorm.io/gorm" "strings" + + "gorm.io/gorm" ) func SafeEnumMigrate(tx *gorm.DB, table interface{}, column string, additionalTypes ...string) error { diff --git a/server/backend/migration/safeEnumMigrate_test.go b/server/backend/migration/safeEnumMigrate_test.go index 920bcc2a..bbec8d44 100644 --- a/server/backend/migration/safeEnumMigrate_test.go +++ b/server/backend/migration/safeEnumMigrate_test.go @@ -2,13 +2,14 @@ package migration_test import ( "fmt" - "github.com/TUM-Dev/Campus-Backend/server/backend/migration" - log "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" "math/rand" "regexp" "strings" "testing" + + "github.com/TUM-Dev/Campus-Backend/server/backend/migration" + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" ) var ( diff --git a/server/backend/migration/static_data/iosInitialSchedulingPriorities.json b/server/backend/migration/static_data/iosInitialSchedulingPriorities.json index 603b4205..4f78e940 100644 --- a/server/backend/migration/static_data/iosInitialSchedulingPriorities.json +++ b/server/backend/migration/static_data/iosInitialSchedulingPriorities.json @@ -20,4 +20,4 @@ "to_hour": 6, "priority": 1 } -] \ No newline at end of file +] diff --git a/server/backend/news.go b/server/backend/news.go new file mode 100644 index 00000000..1b86ef33 --- /dev/null +++ b/server/backend/news.go @@ -0,0 +1,36 @@ +package backend + +import ( + "context" + "fmt" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" +) + +func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (newsSources *pb.NewsSourceReply, err error) { + if err = s.checkDevice(ctx); err != nil { + return + } + + var sources []model.NewsSource + if err := s.db.Joins("Files").Find(&sources).Error; err != nil { + log.WithError(err).Error("could not find newsSources") + return nil, status.Error(codes.Internal, "could not GetNewsSources") + } + + var resp []*pb.NewsSource + for _, source := range sources { + log.WithField("title", source.Title).Trace("sending news source") + resp = append(resp, &pb.NewsSource{ + Source: fmt.Sprintf("%d", source.Source), + Title: source.Title, + Icon: source.Files.URL.String, + }) + } + return &pb.NewsSourceReply{Sources: resp}, nil +} diff --git a/server/backend/newsAlerts.go b/server/backend/newsAlerts.go new file mode 100644 index 00000000..c35f32a9 --- /dev/null +++ b/server/backend/newsAlerts.go @@ -0,0 +1,38 @@ +package backend + +import ( + "context" + "errors" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" + "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/gorm" +) + +func (s *CampusServer) GetTopNews(ctx context.Context, _ *emptypb.Empty) (*pb.GetTopNewsReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err + } + + var res *model.NewsAlert + err := s.db.Joins("Files").Where("NOW() between `from` and `to`").First(&res).Error + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, status.Error(codes.NotFound, "no current active top news") + } else if err != nil { + log.WithError(err).Error("could not GetTopNews") + return nil, status.Error(codes.Internal, "could not GetTopNews") + } + + return &pb.GetTopNewsReply{ + ImageUrl: res.Files.URL.String, + Link: res.Link.String, + Created: timestamppb.New(res.Created), + From: timestamppb.New(res.From), + To: timestamppb.New(res.To), + }, nil +} diff --git a/server/backend/newsAlerts_test.go b/server/backend/newsAlerts_test.go new file mode 100644 index 00000000..68c7e1eb --- /dev/null +++ b/server/backend/newsAlerts_test.go @@ -0,0 +1,115 @@ +package backend + +import ( + "context" + "database/sql" + "regexp" + "testing" + "time" + + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/guregu/null" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type NewsAlertSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *NewsAlertSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +const ExpectedGetTopNewsQuery = "SELECT `news_alert`.`news_alert`,`news_alert`.`file`,`news_alert`.`name`,`news_alert`.`link`,`news_alert`.`created`,`news_alert`.`from`,`news_alert`.`to`,`Files`.`file` AS `Files__file`,`Files`.`name` AS `Files__name`,`Files`.`path` AS `Files__path`,`Files`.`downloads` AS `Files__downloads`,`Files`.`url` AS `Files__url`,`Files`.`downloaded` AS `Files__downloaded` FROM `news_alert` LEFT JOIN `files` `Files` ON `news_alert`.`file` = `Files`.`file` WHERE NOW() between `from` and `to` ORDER BY `news_alert`.`news_alert` LIMIT 1" + +func (s *NewsAlertSuite) Test_GetTopNewsOne() { + expectedAlert := model.NewsAlert{ + NewsAlert: 1, + FilesID: 3001, + Files: model.Files{ + File: 3001, + Name: "Tournament_app_02-02.png", + Path: "newsalerts/", + Downloads: 0, + URL: sql.NullString{Valid: false}, + Downloaded: sql.NullBool{Bool: true, Valid: true}, + }, + Name: null.String{NullString: sql.NullString{String: "Exzellenzuniversität", Valid: true}}, + Link: null.String{NullString: sql.NullString{String: "https://tum.de", Valid: true}}, + Created: time.Time.Add(time.Now(), time.Hour*-4), + From: time.Time.Add(time.Now(), time.Hour*-2), + To: time.Time.Add(time.Now(), time.Hour*2), + } + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)). + WillReturnRows(sqlmock.NewRows([]string{"news_alert", "file", "name", "link", "created", "from", "to", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"}). + AddRow(expectedAlert.NewsAlert, expectedAlert.FilesID, expectedAlert.Name, expectedAlert.Link, expectedAlert.Created, expectedAlert.From, expectedAlert.To, expectedAlert.Files.File, expectedAlert.Files.Name, expectedAlert.Files.Path, expectedAlert.Files.Downloads, expectedAlert.Files.URL, expectedAlert.Files.Downloaded)) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + require.Equal(s.T(), &pb.GetTopNewsReply{ + ImageUrl: expectedAlert.Files.URL.String, + Link: expectedAlert.Link.String, + Created: timestamppb.New(expectedAlert.Created), + From: timestamppb.New(expectedAlert.From), + To: timestamppb.New(expectedAlert.To), + }, response) +} +func (s *NewsAlertSuite) Test_GetTopNewsNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)).WillReturnError(gorm.ErrRecordNotFound) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.Equal(s.T(), status.Error(codes.NotFound, "no current active top news"), err) + require.Nil(s.T(), response) +} +func (s *NewsAlertSuite) Test_GetTopNewsError() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetTopNewsQuery)).WillReturnError(gorm.ErrInvalidDB) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetTopNews(metadata.NewIncomingContext(context.Background(), meta), nil) + require.Equal(s.T(), status.Error(codes.Internal, "could not GetTopNews"), err) + require.Nil(s.T(), response) +} + +func (s *NewsAlertSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestNewsAlertSuite(t *testing.T) { + suite.Run(t, new(NewsAlertSuite)) +} diff --git a/server/backend/news_test.go b/server/backend/news_test.go new file mode 100644 index 00000000..6345bf7a --- /dev/null +++ b/server/backend/news_test.go @@ -0,0 +1,125 @@ +package backend + +import ( + "context" + "database/sql" + "fmt" + "regexp" + "testing" + + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + "github.com/guregu/null" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/metadata" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type NewsSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *NewsSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +func file(id int32) *model.Files { + return &model.Files{ + File: id, + Name: fmt.Sprintf("src_%d.png", id), + Path: "news/sources", + Downloads: 1, + URL: sql.NullString{Valid: false}, + Downloaded: sql.NullBool{Bool: true, Valid: true}, + } +} + +func source1() *model.NewsSource { + return &model.NewsSource{ + Source: 1, + Title: "Amazing News 1", + URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing1", Valid: true}}, + FilesID: file(2).File, + Files: *file(2), + Hook: null.String{NullString: sql.NullString{String: "", Valid: true}}, + } +} + +func source2() *model.NewsSource { + return &model.NewsSource{ + Source: 2, + Title: "Amazing News 2", + URL: null.String{NullString: sql.NullString{String: "https://example.com/amazing2", Valid: true}}, + FilesID: file(2).File, + Files: *file(2), + Hook: null.String{NullString: sql.NullString{String: "hook", Valid: true}}, + } +} + +const ExpectedGetSourceQuery = "SELECT `newsSource`.`source`,`newsSource`.`title`,`newsSource`.`url`,`newsSource`.`icon`,`newsSource`.`hook`,`Files`.`file` AS `Files__file`,`Files`.`name` AS `Files__name`,`Files`.`path` AS `Files__path`,`Files`.`downloads` AS `Files__downloads`,`Files`.`url` AS `Files__url`,`Files`.`downloaded` AS `Files__downloaded` FROM `newsSource` LEFT JOIN `files` `Files` ON `newsSource`.`icon` = `Files`.`file`" + +func (s *NewsSuite) Test_GetNewsSourcesMultiple() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetSourceQuery)). + WillReturnRows(sqlmock.NewRows([]string{"source", "title", "url", "icon", "hook", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"}). + AddRow(source1().Source, source1().Title, source1().URL, source1().FilesID, source1().Hook, source1().Files.File, source1().Files.Name, source1().Files.Path, source1().Files.Downloads, source1().Files.URL, source1().Files.Downloaded). + AddRow(source2().Source, source2().Title, source2().URL, source2().FilesID, source2().Hook, source2().Files.File, source2().Files.Name, source2().Files.Path, source2().Files.Downloads, source2().Files.URL, source2().Files.Downloaded)) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + expectedResp := &pb.NewsSourceReply{ + Sources: []*pb.NewsSource{ + {Source: fmt.Sprintf("%d", source1().Source), Title: source1().Title, Icon: source1().Files.URL.String}, + {Source: fmt.Sprintf("%d", source2().Source), Title: source2().Title, Icon: source2().Files.URL.String}, + }, + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *NewsSuite) Test_GetNewsSourcesNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetSourceQuery)). + WillReturnRows(sqlmock.NewRows([]string{"source", "title", "url", "icon", "hook", "Files__file", "Files__name", "Files__path", "Files__downloads", "Files__url", "Files__downloaded"})) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetNewsSources(metadata.NewIncomingContext(context.Background(), meta), nil) + require.NoError(s.T(), err) + expectedResp := &pb.NewsSourceReply{ + Sources: []*pb.NewsSource(nil), + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *NewsSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestNewsSuite(t *testing.T) { + suite.Run(t, new(NewsSuite)) +} diff --git a/server/backend/rpcserver.go b/server/backend/rpcserver.go index af412a6f..1a29439e 100644 --- a/server/backend/rpcserver.go +++ b/server/backend/rpcserver.go @@ -3,8 +3,9 @@ package backend import ( "context" "errors" - "fmt" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + "net" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns" "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_apns/ios_apns_jwt" "github.com/TUM-Dev/Campus-Backend/server/model" @@ -12,19 +13,14 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/emptypb" - "google.golang.org/protobuf/types/known/timestamppb" "gorm.io/gorm" - "net" - "sync" - "time" ) func (s *CampusServer) GRPCServe(l net.Listener) error { grpcServer := grpc.NewServer() pb.RegisterCampusServer(grpcServer, s) if err := grpcServer.Serve(l); err != nil { - log.Fatalf("failed to serve: %v", err) + log.WithError(err).Fatal("failed to serve") } return grpcServer.Serve(l) } @@ -44,19 +40,15 @@ func New(db *gorm.DB) *CampusServer { initTagRatingOptions(db) return &CampusServer{ - db: db, - deviceBuf: &deviceBuffer{ - lock: sync.Mutex{}, - devices: make(map[string]*model.Devices), - interval: time.Minute, - }, + db: db, + deviceBuf: newDeviceBuffer(), iOSNotificationsService: NewIOSNotificationsService(), } } func NewIOSNotificationsService() *IOSNotificationsService { if err := ios_apns.ValidateRequirementsForIOSNotificationsService(); err != nil { - log.Warn(err) + log.WithError(err).Warn("failed to validate requirements for ios notifications service") return &IOSNotificationsService{ APNSToken: nil, @@ -65,9 +57,8 @@ func NewIOSNotificationsService() *IOSNotificationsService { } token, err := ios_apns_jwt.NewToken() - if err != nil { - log.Fatal(err) + log.WithError(err).Fatal("failed to create new token") } return &IOSNotificationsService{ @@ -76,32 +67,6 @@ func NewIOSNotificationsService() *IOSNotificationsService { } } -func (s *CampusServer) GetNewsSources(ctx context.Context, _ *emptypb.Empty) (newsSources *pb.NewsSourceArray, err error) { - if err = s.checkDevice(ctx); err != nil { - return - } - - var sources []model.NewsSource - if err := s.db.Find(&sources).Error; err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - var resp []*pb.NewsSource - for _, source := range sources { - var icon model.Files - if err := s.db.Where("file = ?", source.Icon).First(&icon).Error; err != nil { - icon = model.Files{File: 0} - } - log.WithField("Title", source.Title).Info("sending news source") - resp = append(resp, &pb.NewsSource{ - Source: fmt.Sprintf("%d", source.Source), - Title: source.Title, - Icon: icon.URL.String, - }) - } - return &pb.NewsSourceArray{Sources: resp}, nil -} - // SearchRooms returns all rooms that match the given search query. func (s *CampusServer) SearchRooms(ctx context.Context, req *pb.SearchRoomsRequest) (*pb.SearchRoomsReply, error) { if err := s.checkDevice(ctx); err != nil { @@ -145,25 +110,6 @@ func (s *CampusServer) SearchRooms(ctx context.Context, req *pb.SearchRoomsReque return response, nil } -func (s *CampusServer) GetTopNews(ctx context.Context, _ *emptypb.Empty) (*pb.GetTopNewsReply, error) { - if err := s.checkDevice(ctx); err != nil { - return nil, err - } - - var res *model.NewsAlert - err := s.db.Joins("Company").Where("NOW() between `from` and `to`").Limit(1).First(&res).Error - if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - log.WithError(err).Errorf("Failed to fetch top news") - } else if res != nil { - return &pb.GetTopNewsReply{ - //ImageUrl: res.Name, - Link: res.Link.String, - To: timestamppb.New(res.To), - }, nil - } - return &pb.GetTopNewsReply{}, nil -} - func (s *CampusServer) GetIOSNotificationsService() *IOSNotificationsService { return s.iOSNotificationsService } diff --git a/server/backend/static_data/cafeteriaRatingTags.json b/server/backend/static_data/cafeteriaRatingTags.json index 2dc3a6fb..1e8f023c 100644 --- a/server/backend/static_data/cafeteriaRatingTags.json +++ b/server/backend/static_data/cafeteriaRatingTags.json @@ -37,4 +37,4 @@ "tagNameEnglish": "Credibility of the menu" } ] -} \ No newline at end of file +} diff --git a/server/backend/static_data/dishNameTags.json b/server/backend/static_data/dishNameTags.json index 583878c4..8c6100b1 100644 --- a/server/backend/static_data/dishNameTags.json +++ b/server/backend/static_data/dishNameTags.json @@ -584,4 +584,4 @@ "notincluded": [] } ] -} \ No newline at end of file +} diff --git a/server/backend/static_data/dishRatingTags.json b/server/backend/static_data/dishRatingTags.json index 2d9e9941..8c751c80 100644 --- a/server/backend/static_data/dishRatingTags.json +++ b/server/backend/static_data/dishRatingTags.json @@ -37,4 +37,4 @@ "tagNameEnglish": "Appearance" } ] -} \ No newline at end of file +} diff --git a/server/backend/updateNews_test.go b/server/backend/updateNews_test.go new file mode 100644 index 00000000..e4e635af --- /dev/null +++ b/server/backend/updateNews_test.go @@ -0,0 +1,96 @@ +package backend + +import ( + "context" + "database/sql" + "regexp" + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/DATA-DOG/go-sqlmock" + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + "google.golang.org/grpc/metadata" + "gorm.io/driver/mysql" + "gorm.io/gorm" +) + +type UpdateNoteSuite struct { + suite.Suite + DB *gorm.DB + mock sqlmock.Sqlmock + deviceBuf *deviceBuffer +} + +func (s *UpdateNoteSuite) SetupSuite() { + var ( + db *sql.DB + err error + ) + + db, s.mock, err = sqlmock.New() + require.NoError(s.T(), err) + + dialector := mysql.New(mysql.Config{ + Conn: db, + DriverName: "mysql", + }) + s.mock.ExpectQuery("SELECT VERSION()"). + WillReturnRows(sqlmock.NewRows([]string{"VERSION()"}).AddRow("10.11.4-MariaDB")) + s.DB, err = gorm.Open(dialector, &gorm.Config{}) + require.NoError(s.T(), err) + + s.deviceBuf = newDeviceBuffer() +} + +const ExpectedGetUpdateNoteQuery = "SELECT * FROM `update_note` WHERE `update_note`.`version_code` = ? ORDER BY `update_note`.`version_code` LIMIT 1" + +func (s *UpdateNoteSuite) Test_GetUpdateNoteOne() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)). + WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"}). + AddRow(1, "1.0.0", "Test Message")) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.NoError(s.T(), err) + expectedResp := &pb.GetUpdateNoteReply{ + Message: "Test Message", + VersionName: "1.0.0", + } + require.Equal(s.T(), expectedResp, response) +} + +func (s *UpdateNoteSuite) Test_GetUpdateNoteNone() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)). + WillReturnRows(sqlmock.NewRows([]string{"version_code", "version_name", "message"})) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.Equal(s.T(), status.Error(codes.NotFound, "No update note found"), err) + require.Nil(s.T(), response) +} + +func (s *UpdateNoteSuite) Test_GetUpdateNoteError() { + s.mock.ExpectQuery(regexp.QuoteMeta(ExpectedGetUpdateNoteQuery)).WillReturnError(gorm.ErrInvalidDB) + + meta := metadata.MD{} + server := CampusServer{db: s.DB, deviceBuf: s.deviceBuf} + response, err := server.GetUpdateNote(metadata.NewIncomingContext(context.Background(), meta), &pb.GetUpdateNoteRequest{Version: 1}) + require.Equal(s.T(), status.Error(codes.Internal, "Internal server error"), err) + require.Nil(s.T(), response) +} + +func (s *UpdateNoteSuite) AfterTest(_, _ string) { + require.NoError(s.T(), s.mock.ExpectationsWereMet()) +} + +// In order for 'go test' to run this suite, we need to create +// a normal test function and pass our suite to suite.Run +func TestUpdateNoteSuite(t *testing.T) { + suite.Run(t, new(UpdateNoteSuite)) +} diff --git a/server/backend/updateNote.go b/server/backend/updateNote.go new file mode 100644 index 00000000..a9f48164 --- /dev/null +++ b/server/backend/updateNote.go @@ -0,0 +1,30 @@ +package backend + +import ( + "context" + "errors" + + "google.golang.org/grpc/codes" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" + "github.com/TUM-Dev/Campus-Backend/server/model" + log "github.com/sirupsen/logrus" + "google.golang.org/grpc/status" + "gorm.io/gorm" +) + +func (s *CampusServer) GetUpdateNote(ctx context.Context, req *pb.GetUpdateNoteRequest) (*pb.GetUpdateNoteReply, error) { + if err := s.checkDevice(ctx); err != nil { + return nil, err + } + + res := model.UpdateNote{VersionCode: req.Version} + if err := s.db.First(&res).Error; errors.Is(err, gorm.ErrRecordNotFound) { + return nil, status.Error(codes.NotFound, "No update note found") + } else if err != nil { + log.WithField("VersionCode", req.Version).WithError(err).Error("Failed to get update note") + return nil, status.Error(codes.Internal, "Internal server error") + } + + return &pb.GetUpdateNoteReply{Message: res.Message, VersionName: res.VersionName}, nil +} diff --git a/server/backend/validators.go b/server/backend/validators.go index b8c456d3..042c0a1d 100644 --- a/server/backend/validators.go +++ b/server/backend/validators.go @@ -2,7 +2,8 @@ package backend import ( "errors" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" ) func ValidateRegisterDevice(request *pb.RegisterDeviceRequest) error { diff --git a/server/env/environment.go b/server/env/environment.go index cea605a8..0526d478 100644 --- a/server/env/environment.go +++ b/server/env/environment.go @@ -13,3 +13,7 @@ func IsDev() bool { func IsProd() bool { return GetEnvironment() == "prod" } + +func IsMensaCronActive() bool { + return os.Getenv("MensaCronDisabled") != "true" +} diff --git a/server/go.mod b/server/go.mod index 64319e11..e25b8ccb 100644 --- a/server/go.mod +++ b/server/go.mod @@ -3,26 +3,27 @@ module github.com/TUM-Dev/Campus-Backend/server go 1.21 require ( + github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/disintegration/imaging v1.6.2 github.com/gabriel-vasile/mimetype v1.4.2 - github.com/getsentry/sentry-go v0.23.0 - github.com/go-gormigrate/gormigrate/v2 v2.1.0 + github.com/getsentry/sentry-go v0.24.1 + github.com/go-gormigrate/gormigrate/v2 v2.1.1 + github.com/gofrs/uuid/v5 v5.0.0 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 github.com/guregu/null v4.0.0+incompatible github.com/influxdata/influxdb-client-go/v2 v2.12.3 github.com/makasim/sentryhook v0.4.2 github.com/microcosm-cc/bluemonday v1.0.25 github.com/mmcdole/gofeed v1.2.1 - github.com/satori/go.uuid v1.2.0 + github.com/onrik/gorm-logrus v0.5.0 github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/stretchr/testify v1.8.4 - golang.org/x/net v0.14.0 + golang.org/x/net v0.15.0 golang.org/x/sync v0.3.0 - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.57.0 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 + google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb + google.golang.org/grpc v1.58.0 google.golang.org/protobuf v1.31.0 gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.4 @@ -35,7 +36,6 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect - github.com/golang/glog v1.1.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect @@ -48,8 +48,8 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/image v0.5.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/server/go.sum b/server/go.sum index 49281d6f..86e36c83 100644 --- a/server/go.sum +++ b/server/go.sum @@ -42,6 +42,8 @@ github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.1.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= @@ -114,8 +116,8 @@ github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= -github.com/getsentry/sentry-go v0.23.0 h1:dn+QRCeJv4pPt9OjVXiMcGIBIefaTJPw/h0bZWO05nE= -github.com/getsentry/sentry-go v0.23.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.24.1 h1:W6/0GyTy8J6ge6lVCc94WB6Gx2ZuLrgopnn9w8Hiwuk= +github.com/getsentry/sentry-go v0.24.1/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= @@ -125,8 +127,8 @@ github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3Bop github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gormigrate/gormigrate/v2 v2.1.0 h1:4/1xr9CjOox714EJWbxkF00lrNmbWJToSZzhykKKcKY= -github.com/go-gormigrate/gormigrate/v2 v2.1.0/go.mod h1:gpA97koYGyjqaiLDTmLE5W7nyYTmI26AYIf2a/earuo= +github.com/go-gormigrate/gormigrate/v2 v2.1.1 h1:eGS0WTFRV30r103lU8JNXY27KbviRnqqIDobW3EV3iY= +github.com/go-gormigrate/gormigrate/v2 v2.1.1/go.mod h1:L7nJ620PFDKei9QOhJzqA8kRCk+E3UbV2f5gv+1ndLc= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -146,13 +148,11 @@ github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofrs/uuid/v5 v5.0.0 h1:p544++a97kEL+svbcFbCQVM9KFu0Yo25UoISXGNNH9M= +github.com/gofrs/uuid/v5 v5.0.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -236,8 +236,8 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1 h1:LSsiG61v9IzzxMkqEr6nrix4miJI62xlRjwT7BYD2SM= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.17.1/go.mod h1:Hbb13e3/WtqQ8U5hLGkek9gJvBLasHuPFI0UEGfnQ10= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/guregu/null v4.0.0+incompatible h1:4zw0ckM7ECd6FNNddc3Fu4aty9nTlpkkzH7dPn4/4Gw= github.com/guregu/null v4.0.0+incompatible/go.mod h1:ePGpQaN9cw0tj45IR5E5ehMvsFlLlQZAkkOXZurJ3NM= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -273,18 +273,10 @@ github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/ github.com/iris-contrib/httpexpect/v2 v2.3.1/go.mod h1:ICTf89VBKSD3KB0fsyyHviKF8G8hyepP0dOXJPWz3T0= github.com/iris-contrib/jade v1.1.4/go.mod h1:EDqR+ur9piDl6DUgs6qRrlfzmlx/D5UybogqrXvJTBE= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= -github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -348,15 +340,11 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mediocregopher/radix/v3 v3.8.0/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= -github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= -github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -391,6 +379,8 @@ github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onrik/gorm-logrus v0.5.0 h1:JKeFH+j8AIpCDtsxHgteMtQeZtJ1k+M6UlUXwfkd2+o= +github.com/onrik/gorm-logrus v0.5.0/go.mod h1:QSx05I0N2V7M7ehsThQQmQE6K1H+drVYU2NQVNko4nw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -420,15 +410,12 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -543,8 +530,6 @@ golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -634,8 +619,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -740,8 +725,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -756,8 +741,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -896,8 +881,8 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -920,10 +905,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.57.0 h1:kfzNeI/klCGD2YPMUlaGNT3pxvYfga7smW3Vth8Zsiw= -google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= +google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= +google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -963,12 +946,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= -gorm.io/driver/postgres v1.5.2 h1:ytTDxxEv+MplXOfFe3Lzm7SjG09fcdb3Z/c056DTBx0= -gorm.io/driver/postgres v1.5.2/go.mod h1:fmpX0m2I1PKuR7mKZiEluwrP3hbs+ps7JIGMUBpCgl8= -gorm.io/driver/sqlite v1.5.1 h1:hYyrLkAWE71bcarJDPdZNTLWtr8XrSjOWyjUYI6xdL4= -gorm.io/driver/sqlite v1.5.1/go.mod h1:7MZZ2Z8bqyfSQA1gYEV6MagQWj3cpUkJj9Z+d1HEMEQ= -gorm.io/driver/sqlserver v1.5.0 h1:zol7ePfY1XiPfjEvjjBh4VatIF3kycNcPE0EMCXznHY= -gorm.io/driver/sqlserver v1.5.0/go.mod h1:tBAqioK34BHl0Iiez+BFfG5/K9nDAlhLxRkgc2qy3+4= gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw= gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/server/main.go b/server/main.go index 916d029f..9e624b66 100644 --- a/server/main.go +++ b/server/main.go @@ -5,8 +5,6 @@ import ( "embed" "encoding/json" "errors" - "github.com/TUM-Dev/Campus-Backend/server/env" - "github.com/makasim/sentryhook" "io/fs" "net" "net/http" @@ -15,12 +13,16 @@ import ( "strings" "time" - pb "github.com/TUM-Dev/Campus-Backend/server/api" + "github.com/TUM-Dev/Campus-Backend/server/env" + "github.com/makasim/sentryhook" + + pb "github.com/TUM-Dev/Campus-Backend/server/api/tumdev" "github.com/TUM-Dev/Campus-Backend/server/backend" "github.com/TUM-Dev/Campus-Backend/server/backend/cron" "github.com/TUM-Dev/Campus-Backend/server/backend/migration" "github.com/getsentry/sentry-go" "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/onrik/gorm-logrus" log "github.com/sirupsen/logrus" "github.com/soheilhy/cmux" "golang.org/x/sync/errgroup" @@ -45,18 +47,6 @@ func main() { setupTelemetry() defer sentry.Flush(2 * time.Second) // make sure that sentry handles shutdowns gracefully - // Connect to DB - var conn gorm.Dialector - shouldAutoMigrate := false - dbHost := os.Getenv("DB_DSN") - if dbHost != "" { - log.Info("Connecting to dsn") - conn = mysql.Open(dbHost) - } else { - log.Error("Failed to start! The 'DB_DSN' environment variable is not defined. Take a look at the README.md for more details.") - os.Exit(-1) - } - // initializing connection to InfluxDB err := backend.ConnectToInfluxDB() if errors.Is(err, backend.ErrInfluxTokenNotConfigured) { @@ -67,54 +57,38 @@ func main() { log.WithError(err).Error("InfluxDB connection failed - health check failed") } - db, err := gorm.Open(conn, &gorm.Config{}) - if err != nil { - panic("failed to connect database") - } + db := setupDB() - // Migrate the schema - tumMigrator := migration.New(db, shouldAutoMigrate) - err = tumMigrator.Migrate() - if err != nil { - log.WithError(err).Fatal("Failed to migrate database") - return - } - - var mensaCronActivated = true - if len(os.Args) > 2 && os.Args[1] == "-MensaCron" && os.Args[2] == "0" { - mensaCronActivated = false - log.Info("Cronjobs for the cafeteria rating are deactivated. Remove commandline argument <-MensaCron 0> or set it to 1.", len(os.Args)) - } - // Create any other background services (these shouldn't do any long running work here) - cronService := cron.New(db, mensaCronActivated) + // Create any other background services (these shouldn't do any long-running work here) + cronService := cron.New(db) campusService := backend.New(db) // Listen to our configured ports listener, err := net.Listen("tcp", httpPort) if err != nil { - log.Fatalf("failed to listen: %v", err) + log.WithError(err).Fatal("failed to listen") } - m := cmux.New(listener) - grpcListener := m.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc")) - httpListener := m.Match(cmux.HTTP1Fast()) + mux := cmux.New(listener) + grpcListener := mux.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc")) + httpListener := mux.Match(cmux.HTTP1Fast()) // HTTP Stuff - mux := http.NewServeMux() - httpServer := &http.Server{Handler: mux} - mux.HandleFunc("/imprint", func(w http.ResponseWriter, r *http.Request) { + httpMux := http.NewServeMux() + httpServer := &http.Server{Handler: httpMux} + httpMux.HandleFunc("/imprint", func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("Hello, world!")) }) - mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + httpMux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("healthy")) }) static, _ := fs.Sub(swagfs, "swagger") - mux.Handle("/", http.FileServer(http.FS(static))) + httpMux.Handle("/", http.FileServer(http.FS(static))) // Main GRPC Server - grpcS := grpc.NewServer() - pb.RegisterCampusServer(grpcS, campusService) + grpcServer := grpc.NewServer() + pb.RegisterCampusServer(grpcServer, campusService) // GRPC Gateway for HTTP REST -> GRPC grpcGatewayMux := runtime.NewServeMux(runtime.WithIncomingHeaderMatcher( @@ -128,31 +102,52 @@ func main() { }), runtime.WithErrorHandler(errorHandler), ) - ctx := context.Background() opts := []grpc.DialOption{ grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithUserAgent("internal"), grpc.WithUnaryInterceptor(addMethodNameInterceptor), } - if err := pb.RegisterCampusHandlerFromEndpoint(ctx, grpcGatewayMux, httpPort, opts); err != nil { - panic(err) + if err := pb.RegisterCampusHandlerFromEndpoint(context.Background(), grpcGatewayMux, httpPort, opts); err != nil { + log.WithError(err).Panic("could not RegisterCampusHandlerFromEndpoint") } - restPrefix := "/v1" - mux.Handle("/v1/", http.StripPrefix(restPrefix, grpcGatewayMux)) + httpMux.Handle("/v1/", http.StripPrefix("/v1", grpcGatewayMux)) // Start each server in its own go routine and logs any errors g := errgroup.Group{} - g.Go(func() error { return grpcS.Serve(grpcListener) }) + g.Go(func() error { return grpcServer.Serve(grpcListener) }) g.Go(func() error { return httpServer.Serve(httpListener) }) - g.Go(func() error { return m.Serve() }) + g.Go(func() error { return mux.Serve() }) g.Go(func() error { return cronService.Run() }) // Setup cron jobs g.Go(func() error { return campusService.RunDeviceFlusher() }) // Setup campus service log.Info("running server") - err = g.Wait() + if err := g.Wait(); err != nil { + log.WithError(err).Error("encountered issue while running the server") + } +} + +// setupDB connects to the database and migrates it if necessary +func setupDB() *gorm.DB { + // Connect to DB + var conn gorm.Dialector + if dbHost := os.Getenv("DB_DSN"); dbHost == "" { + log.Fatal("Failed to start! The 'DB_DSN' environment variable is not defined. Take a look at the README.md for more details.") + } else { + log.Info("Connecting to dsn") + conn = mysql.Open(dbHost) + } + + db, err := gorm.Open(conn, &gorm.Config{Logger: gorm_logrus.New()}) if err != nil { - log.Error(err) + log.WithError(err).Panic("failed to connect database") } + + // Migrate the schema + // currently not activated as + if err := migration.New(db, false).Migrate(); err != nil { + log.WithError(err).Fatal("Failed to migrate database") + } + return db } // setupTelemetry initializes our telemetry stack @@ -177,7 +172,7 @@ func setupTelemetry() { }); err != nil { log.WithError(err).Error("Sentry initialization failed") } - log.AddHook(sentryhook.New([]log.Level{log.PanicLevel, log.FatalLevel, log.ErrorLevel})) + log.AddHook(sentryhook.New([]log.Level{log.PanicLevel, log.FatalLevel, log.ErrorLevel, log.WarnLevel})) } else { log.Info("continuing without sentry") } @@ -226,9 +221,7 @@ func errorHandler(_ context.Context, _ *runtime.ServeMux, _ runtime.Marshaler, w w.Header().Set("Content-Type", "application/json") w.WriteHeader(errorResp.StatusCode) - err = json.NewEncoder(w).Encode(errorResp) - - if err != nil { + if err = json.NewEncoder(w).Encode(errorResp); err != nil { log.WithError(err).Error("Marshal error response failed") return } diff --git a/server/model/crontab.go b/server/model/crontab.go index a4506833..6e775f14 100644 --- a/server/model/crontab.go +++ b/server/model/crontab.go @@ -11,14 +11,9 @@ func (Crontab) TableName() string { // Crontab struct is a row record of the crontab table in the tca database type Crontab struct { - //[ 0] cron int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Cron int32 `gorm:"primary_key;AUTO_INCREMENT;column:cron;type:int;" json:"cron"` - //[ 1] interval int null: false primary: false isArray: false auto: false col: int len: -1 default: [7200] - Interval int32 `gorm:"column:interval;type:int;default:7200;" json:"interval"` - //[ 2] lastRun int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] - LastRun int32 `gorm:"column:lastRun;type:int;default:0;" json:"last_run"` - //[ 3] type char(10) null: true primary: false isArray: false auto: false col: char len: 10 default: [] - Type null.String `gorm:"column:type;type:enum ('news', 'mensa', 'kino', 'roomfinder', 'alarm', 'fileDownload','dishNameDownload','averageRatingComputation', 'iosNotifications', 'iosActivityReset', 'canteenHeadCount');" json:"type"` - //[ 4] id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - ID null.Int `gorm:"column:id;type:int;" json:"id"` + Cron int32 `gorm:"primary_key;AUTO_INCREMENT;column:cron;type:int;" json:"cron"` + Interval int32 `gorm:"column:interval;type:int;default:7200;" json:"interval"` + LastRun int32 `gorm:"column:lastRun;type:int;default:0;" json:"last_run"` + Type null.String `gorm:"column:type;type:enum ('news', 'mensa', 'kino', 'roomfinder', 'alarm', 'fileDownload','dishNameDownload','averageRatingComputation', 'iosNotifications', 'iosActivityReset', 'canteenHeadCount');" json:"type"` + ID null.Int `gorm:"column:id;type:int;" json:"id"` } diff --git a/server/model/devices.go b/server/model/devices.go index 6f179a75..213330be 100755 --- a/server/model/devices.go +++ b/server/model/devices.go @@ -8,38 +8,21 @@ import ( // Devices struct is a row record of the devices table in the tca database type Devices struct { - //[ 0] device int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Device int32 `gorm:"primary_key;AUTO_INCREMENT;column:device;type:int;" json:"device"` - //[ 1] member int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Member null.Int `gorm:"column:member;type:int;" json:"member"` - //[ 2] uuid varchar(50) null: false primary: false isArray: false auto: false col: varchar len: 50 default: [] - UUID string `gorm:"column:uuid;type:varchar(50);" json:"uuid"` - //[ 3] created timestamp null: true primary: false isArray: false auto: false col: timestamp len: -1 default: [] - Created null.Time `gorm:"column:created;type:timestamp;" json:"created"` - //[ 4] lastAccess timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [0000-00-00 00:00:00] - LastAccess time.Time `gorm:"column:lastAccess;type:timestamp;default:0000-00-00 00:00:00;" json:"last_access"` - //[ 5] lastApi text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - LastAPI string `gorm:"column:lastApi;type:text;size:16777215;" json:"last_api"` - //[ 6] developer char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] - Developer string `gorm:"column:developer;type:char;size:5;default:false;" json:"developer"` - //[ 7] osVersion text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - OsVersion string `gorm:"column:osVersion;type:text;size:16777215;" json:"os_version"` - //[ 8] appVersion text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - AppVersion string `gorm:"column:appVersion;type:text;size:16777215;" json:"app_version"` - //[ 9] counter int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] - Counter int32 `gorm:"column:counter;type:int;default:0;" json:"counter"` - //[10] pk text(4294967295) null: true primary: false isArray: false auto: false col: text len: 4294967295 default: [] - Pk null.String `gorm:"column:pk;type:text;size:4294967295;" json:"pk"` - //[11] pkActive char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] - PkActive string `gorm:"column:pkActive;type:char;size:5;default:false;" json:"pk_active"` - //[12] gcmToken text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - GcmToken null.String `gorm:"column:gcmToken;type:text;size:65535;" json:"gcm_token"` - //[13] gcmStatus varchar(200) null: true primary: false isArray: false auto: false col: varchar len: 200 default: [] - GcmStatus null.String `gorm:"column:gcmStatus;type:varchar(200);" json:"gcm_status"` - //[14] confirmationKey varchar(35) null: true primary: false isArray: false auto: false col: varchar len: 35 default: [] + Device int32 `gorm:"primary_key;AUTO_INCREMENT;column:device;type:int;" json:"device"` + Member null.Int `gorm:"column:member;type:int;" json:"member"` + UUID string `gorm:"column:uuid;type:varchar(50);" json:"uuid"` + Created null.Time `gorm:"column:created;type:timestamp;" json:"created"` + LastAccess time.Time `gorm:"column:lastAccess;type:timestamp;default:0000-00-00 00:00:00;" json:"last_access"` + LastAPI string `gorm:"column:lastApi;type:text;size:16777215;" json:"last_api"` + Developer string `gorm:"column:developer;type:char;size:5;default:false;" json:"developer"` + OsVersion string `gorm:"column:osVersion;type:text;size:16777215;" json:"os_version"` + AppVersion string `gorm:"column:appVersion;type:text;size:16777215;" json:"app_version"` + Counter int32 `gorm:"column:counter;type:int;default:0;" json:"counter"` + Pk null.String `gorm:"column:pk;type:text;size:4294967295;" json:"pk"` + PkActive string `gorm:"column:pkActive;type:char;size:5;default:false;" json:"pk_active"` + GcmToken null.String `gorm:"column:gcmToken;type:text;size:65535;" json:"gcm_token"` + GcmStatus null.String `gorm:"column:gcmStatus;type:varchar(200);" json:"gcm_status"` ConfirmationKey null.String `gorm:"column:confirmationKey;type:varchar(35);" json:"confirmation_key"` - //[15] keyCreated datetime null: true primary: false isArray: false auto: false col: datetime len: -1 default: [] - KeyCreated null.Time `gorm:"column:keyCreated;type:datetime;" json:"key_created"` - //[16] keyConfirmed datetime null: true primary: false isArray: false auto: false col: datetime len: -1 default: [] - KeyConfirmed null.Time `gorm:"column:keyConfirmed;type:datetime;" json:"key_confirmed"` + KeyCreated null.Time `gorm:"column:keyCreated;type:datetime;" json:"key_created"` + KeyConfirmed null.Time `gorm:"column:keyConfirmed;type:datetime;" json:"key_confirmed"` } diff --git a/server/model/dish.go b/server/model/dish.go index 9737bd8b..cb787aad 100644 --- a/server/model/dish.go +++ b/server/model/dish.go @@ -2,6 +2,7 @@ package model import ( "database/sql" + "github.com/guregu/null" ) diff --git a/server/model/files.go b/server/model/files.go index d683253a..01c64983 100644 --- a/server/model/files.go +++ b/server/model/files.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,15 +17,11 @@ var ( // Files struct is a row record of the files table in the tca database type Files struct { - //[ 0] file int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - File int32 `gorm:"primary_key;AUTO_INCREMENT;column:file;type:int;" json:"file"` - //[ 1] name text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Name string `gorm:"column:name;type:text;size:16777215;" json:"name"` - //[ 2] path text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Path string `gorm:"column:path;type:text;size:16777215;" json:"path"` - //[ 3] downloads int null: false primary: false isArray: false auto: false col: int len: -1 default: [0] + File int32 `gorm:"primary_key;AUTO_INCREMENT;column:file;type:int;" json:"file"` + Name string `gorm:"column:name;type:text;size:16777215;" json:"name"` + Path string `gorm:"column:path;type:text;size:16777215;" json:"path"` Downloads int32 `gorm:"column:downloads;type:int;default:0;" json:"downloads"` - URL sql.NullString `gorm:"column:url;default:null;" json:"url"` // URL of the files source (if any) + URL sql.NullString `gorm:"column:url;default:null;" json:"url"` // URL of the files source (if any) Downloaded sql.NullBool `gorm:"column:downloaded;type:boolean;default:1;" json:"downloaded"` // true when file is ready to be served, false when still being downloaded } diff --git a/server/model/iosRemoteNotification.go b/server/model/iosRemoteNotification.go index bca828b5..4c7464c9 100644 --- a/server/model/iosRemoteNotification.go +++ b/server/model/iosRemoteNotification.go @@ -4,6 +4,7 @@ package model import ( "encoding/json" + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" ) diff --git a/server/model/ios_grade.go b/server/model/ios_grade.go index 4d6d282a..1d38cbb1 100644 --- a/server/model/ios_grade.go +++ b/server/model/ios_grade.go @@ -2,8 +2,9 @@ package model import ( "encoding/xml" - "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" "time" + + "github.com/TUM-Dev/Campus-Backend/server/backend/ios_notifications/ios_crypto" ) // IOSGrades is a wrapper for a list of grades => XML stuff @@ -33,13 +34,11 @@ type customDate struct { func (c *customDate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { var v string - err := d.DecodeElement(&v, &start) - if err != nil { + if err := d.DecodeElement(&v, &start); err != nil { return err } t, err := time.Parse("2006-01-02", v) - if err != nil { return err } @@ -66,13 +65,11 @@ type IOSEncryptedGrade struct { func (e *IOSEncryptedGrade) Encrypt(key string) error { encryptedTitle, err := ios_crypto.SymmetricEncrypt(e.LectureTitle, key) - if err != nil { return err } encryptedGrade, err := ios_crypto.SymmetricEncrypt(e.Grade, key) - if err != nil { return err } @@ -86,13 +83,11 @@ func (e *IOSEncryptedGrade) Encrypt(key string) error { func (e *IOSEncryptedGrade) Decrypt(key string) error { decryptedTitle, err := ios_crypto.SymmetricDecrypt(ios_crypto.EncryptedString(e.LectureTitle), key) - if err != nil { return err } decryptedGrade, err := ios_crypto.SymmetricDecrypt(ios_crypto.EncryptedString(e.Grade), key) - if err != nil { return err } diff --git a/server/model/news.go b/server/model/news.go index 4ea2e5bd..04c32c5f 100755 --- a/server/model/news.go +++ b/server/model/news.go @@ -15,24 +15,15 @@ var ( // News struct is a row record of the news table in the tca database type News struct { - //[ 0] news int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - News int32 `gorm:"primary_key;AUTO_INCREMENT;column:news;type:int;" json:"news"` - //[ 1] date datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [] - Date time.Time `gorm:"column:date;type:datetime;" json:"date"` - //[ 2] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 3] title text(255) null: false primary: false isArray: false auto: false col: text len: 255 default: [] - Title string `gorm:"column:title;type:text;size:255;" json:"title"` - //[ 4] description text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Description string `gorm:"column:description;type:text;size:65535;" json:"description"` - //[ 5] src int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Src int32 `gorm:"column:src;type:int;" json:"src"` - //[ 6] link varchar(190) null: false primary: false isArray: false auto: false col: varchar len: 190 default: [] - Link string `gorm:"column:link;type:varchar(190);" json:"link"` - //[ 7] image text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Image null.String `gorm:"column:image;type:text;size:65535;" json:"image"` - //[ 8] file int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - File null.Int `gorm:"column:file;type:int;" json:"file"` + News int32 `gorm:"primary_key;AUTO_INCREMENT;column:news;type:int;" json:"news"` + Date time.Time `gorm:"column:date;type:datetime;" json:"date"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + Title string `gorm:"column:title;type:text;size:255;" json:"title"` + Description string `gorm:"column:description;type:text;size:65535;" json:"description"` + Src int32 `gorm:"column:src;type:int;" json:"src"` + Link string `gorm:"column:link;type:varchar(190);" json:"link"` + Image null.String `gorm:"column:image;type:text;size:65535;" json:"image"` + File null.Int `gorm:"column:file;type:int;" json:"file"` } // TableName sets the insert table name for this struct type diff --git a/server/model/news_alert.go b/server/model/news_alert.go index ad5f126a..0956940a 100644 --- a/server/model/news_alert.go +++ b/server/model/news_alert.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,20 +17,14 @@ var ( // NewsAlert struct is a row record of the news_alert table in the tca database type NewsAlert struct { - //[ 0] news_alert int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - NewsAlert int32 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` - //[ 1] file int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - File null.Int `gorm:"column:file;type:int;" json:"file"` - //[ 2] name varchar(100) null: true primary: false isArray: false auto: false col: varchar len: 100 default: [] - Name null.String `gorm:"column:name;type:varchar(100);" json:"name"` - //[ 3] link text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Link null.String `gorm:"column:link;type:text;size:65535;" json:"link"` - //[ 4] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 5] from datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [CURRENT_TIMESTAMP] - From time.Time `gorm:"column:from;type:datetime;default:CURRENT_TIMESTAMP;" json:"from"` - //[ 6] to datetime null: false primary: false isArray: false auto: false col: datetime len: -1 default: [CURRENT_TIMESTAMP] - To time.Time `gorm:"column:to;type:datetime;default:CURRENT_TIMESTAMP;" json:"to"` + NewsAlert int32 `gorm:"primary_key;AUTO_INCREMENT;column:news_alert;type:int;" json:"news_alert"` + FilesID int32 `gorm:"column:file;not null"` + Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` + Name null.String `gorm:"column:name;type:varchar(100);" json:"name"` + Link null.String `gorm:"column:link;type:text;size:65535;" json:"link"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + From time.Time `gorm:"column:from;type:datetime;default:CURRENT_TIMESTAMP;" json:"from"` + To time.Time `gorm:"column:to;type:datetime;default:CURRENT_TIMESTAMP;" json:"to"` } // TableName sets the insert table name for this struct type diff --git a/server/model/news_source.go b/server/model/news_source.go index 8fe0f222..69b91cfe 100644 --- a/server/model/news_source.go +++ b/server/model/news_source.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,12 @@ var ( // NewsSource struct is a row record of the newsSource table in the tca database type NewsSource struct { - //[ 0] source int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Source int32 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;" json:"source"` - //[ 1] title text(16777215) null: false primary: false isArray: false auto: false col: text len: 16777215 default: [] - Title string `gorm:"column:title;type:text;size:16777215;" json:"title"` - //[ 2] url text(16777215) null: true primary: false isArray: false auto: false col: text len: 16777215 default: [] - URL null.String `gorm:"column:url;type:text;size:16777215;" json:"url"` - //[ 3] icon int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Icon null.Int `gorm:"column:icon;type:int;" json:"icon"` - //[ 4] hook char(12) null: true primary: false isArray: false auto: false col: char len: 12 default: [] - Hook null.String `gorm:"column:hook;type:char;size:12;" json:"hook"` + Source int32 `gorm:"primary_key;AUTO_INCREMENT;column:source;type:int;"` + Title string `gorm:"column:title;type:text;size:16777215;"` + URL null.String `gorm:"column:url;type:text;size:16777215;"` + FilesID int32 `gorm:"column:icon;not null"` + Files Files `gorm:"foreignKey:FilesID;references:file;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` + Hook null.String `gorm:"column:hook;type:char;size:12;"` } // TableName sets the insert table name for this struct type diff --git a/server/model/notification.go b/server/model/notification.go index 0acb42a0..c6ada430 100644 --- a/server/model/notification.go +++ b/server/model/notification.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,20 +17,12 @@ var ( // Notification struct is a row record of the notification table in the tca database type Notification struct { - //[ 0] notification int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Notification int32 `gorm:"primary_key;AUTO_INCREMENT;column:notification;type:int;" json:"notification"` - //[ 1] type int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Type int32 `gorm:"column:type;type:int;" json:"type"` - //[ 2] location int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Location null.Int `gorm:"column:location;type:int;" json:"location"` - //[ 3] title text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Title string `gorm:"column:title;type:text;size:65535;" json:"title"` - //[ 4] description text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Description string `gorm:"column:description;type:text;size:65535;" json:"description"` - //[ 5] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 6] signature text(65535) null: true primary: false isArray: false auto: false col: text len: 65535 default: [] - Signature null.String `gorm:"column:signature;type:text;size:65535;" json:"signature"` - //[ 7] silent tinyint null: false primary: false isArray: false auto: false col: tinyint len: -1 default: [0] - Silent int32 `gorm:"column:silent;type:tinyint;default:0;" json:"silent"` + Notification int32 `gorm:"primary_key;AUTO_INCREMENT;column:notification;type:int;" json:"notification"` + Type int32 `gorm:"column:type;type:int;" json:"type"` + Location null.Int `gorm:"column:location;type:int;" json:"location"` + Title string `gorm:"column:title;type:text;size:65535;" json:"title"` + Description string `gorm:"column:description;type:text;size:65535;" json:"description"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + Signature null.String `gorm:"column:signature;type:text;size:65535;" json:"signature"` + Silent int32 `gorm:"column:silent;type:tinyint;default:0;" json:"silent"` } diff --git a/server/model/notification_confirmation.go b/server/model/notification_confirmation.go index 94b532a3..51b7e88d 100644 --- a/server/model/notification_confirmation.go +++ b/server/model/notification_confirmation.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,14 +17,9 @@ var ( // NotificationConfirmation struct is a row record of the notification_confirmation table in the tca database type NotificationConfirmation struct { - //[ 0] notification int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - Notification int32 `gorm:"primary_key;column:notification;type:int;" json:"notification"` - //[ 1] device int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - Device int32 `gorm:"primary_key;column:device;type:int;" json:"device"` - //[ 2] sent tinyint null: false primary: false isArray: false auto: false col: tinyint len: -1 default: [0] - Sent int32 `gorm:"column:sent;type:tinyint;default:0;" json:"sent"` - //[ 3] created timestamp null: false primary: false isArray: false auto: false col: timestamp len: -1 default: [CURRENT_TIMESTAMP] - Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` - //[ 4] received timestamp null: true primary: false isArray: false auto: false col: timestamp len: -1 default: [] - Received null.Time `gorm:"column:received;type:timestamp;" json:"received"` + Notification int32 `gorm:"primary_key;column:notification;type:int;" json:"notification"` + Device int32 `gorm:"primary_key;column:device;type:int;" json:"device"` + Sent int32 `gorm:"column:sent;type:tinyint;default:0;" json:"sent"` + Created time.Time `gorm:"column:created;type:timestamp;default:CURRENT_TIMESTAMP;" json:"created"` + Received null.Time `gorm:"column:received;type:timestamp;" json:"received"` } diff --git a/server/model/notification_type.go b/server/model/notification_type.go index dcd355c1..3b2ae0c7 100644 --- a/server/model/notification_type.go +++ b/server/model/notification_type.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,7 @@ var ( // NotificationType struct is a row record of the notification_type table in the tca database type NotificationType struct { - //[ 0] type int null: false primary: true isArray: false auto: true col: int len: -1 default: [] - Type int32 `gorm:"primary_key;AUTO_INCREMENT;column:type;type:int;" json:"type"` - //[ 1] name text(65535) null: false primary: false isArray: false auto: false col: text len: 65535 default: [] - Name string `gorm:"column:name;type:text;size:65535;" json:"name"` - //[ 2] confirmation char(5) null: false primary: false isArray: false auto: false col: char len: 5 default: [false] + Type int32 `gorm:"primary_key;AUTO_INCREMENT;column:type;type:int;" json:"type"` + Name string `gorm:"column:name;type:text;size:65535;" json:"name"` Confirmation string `gorm:"column:confirmation;type:char;size:5;default:false;" json:"confirmation"` } diff --git a/server/model/roomfinder_building2area.go b/server/model/roomfinder_building2area.go index 0b3837ea..b8babe58 100644 --- a/server/model/roomfinder_building2area.go +++ b/server/model/roomfinder_building2area.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,14 +17,10 @@ var ( // RoomfinderBuilding2area struct is a row record of the roomfinder_building2area table in the tca database type RoomfinderBuilding2area struct { - //[ 0] area_id int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - AreaID int32 `gorm:"column:area_id;type:int;" json:"area_id"` - //[ 1] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] + AreaID int32 `gorm:"column:area_id;type:int;" json:"area_id"` BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 2] campus char(1) null: false primary: false isArray: false auto: false col: char len: 1 default: [] - Campus string `gorm:"column:campus;type:char;size:1;" json:"campus"` - //[ 3] name varchar(32) null: false primary: false isArray: false auto: false col: varchar len: 32 default: [] - Name string `gorm:"column:name;type:varchar(32);" json:"name"` + Campus string `gorm:"column:campus;type:char;size:1;" json:"campus"` + Name string `gorm:"column:name;type:varchar(32);" json:"name"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_buildings.go b/server/model/roomfinder_buildings.go index 13a00c46..24616e88 100644 --- a/server/model/roomfinder_buildings.go +++ b/server/model/roomfinder_buildings.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,11 @@ var ( // RoomfinderBuildings struct is a row record of the roomfinder_buildings table in the tca database type RoomfinderBuildings struct { - //[ 0] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] - BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 1] utm_zone varchar(4) null: true primary: false isArray: false auto: false col: varchar len: 4 default: [] - UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` - //[ 2] utm_easting varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` - //[ 3] utm_northing varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` - //[ 4] default_map_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` + BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` + UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` + UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` + UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` + DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_buildings2gps.go b/server/model/roomfinder_buildings2gps.go index d9604eab..ba428520 100644 --- a/server/model/roomfinder_buildings2gps.go +++ b/server/model/roomfinder_buildings2gps.go @@ -2,11 +2,12 @@ package model import ( "database/sql" - "gorm.io/gorm" "time" + "gorm.io/gorm" + + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -18,11 +19,8 @@ var ( // RoomfinderBuildings2gps struct is a row record of the roomfinder_buildings2gps table in the tca database type RoomfinderBuildings2gps struct { - //[ 0] id varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] - ID string `gorm:"primary_key;column:id;type:varchar(8);" json:"id"` - //[ 1] latitude varchar(30) null: true primary: false isArray: false auto: false col: varchar len: 30 default: [] - Latitude null.String `gorm:"column:latitude;type:varchar(30);" json:"latitude"` - //[ 2] longitude varchar(30) null: true primary: false isArray: false auto: false col: varchar len: 30 default: [] + ID string `gorm:"primary_key;column:id;type:varchar(8);" json:"id"` + Latitude null.String `gorm:"column:latitude;type:varchar(30);" json:"latitude"` Longitude null.String `gorm:"column:longitude;type:varchar(30);" json:"longitude"` } diff --git a/server/model/roomfinder_buildings2maps.go b/server/model/roomfinder_buildings2maps.go index 734d22a2..6559cf03 100644 --- a/server/model/roomfinder_buildings2maps.go +++ b/server/model/roomfinder_buildings2maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,8 @@ var ( // RoomfinderBuildings2maps struct is a row record of the roomfinder_buildings2maps table in the tca database type RoomfinderBuildings2maps struct { - //[ 0] building_nr varchar(8) null: false primary: true isArray: false auto: false col: varchar len: 8 default: [] BuildingNr string `gorm:"primary_key;column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 1] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` + MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_maps.go b/server/model/roomfinder_maps.go index 6b578e33..a1f2fae7 100644 --- a/server/model/roomfinder_maps.go +++ b/server/model/roomfinder_maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,16 +17,11 @@ var ( // RoomfinderMaps struct is a row record of the roomfinder_maps table in the tca database type RoomfinderMaps struct { - //[ 0] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` - //[ 1] description varchar(64) null: false primary: false isArray: false auto: false col: varchar len: 64 default: [] + MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` Description string `gorm:"column:description;type:varchar(64);" json:"description"` - //[ 2] scale int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Scale int32 `gorm:"column:scale;type:int;" json:"scale"` - //[ 3] width int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Width int32 `gorm:"column:width;type:int;" json:"width"` - //[ 4] height int null: false primary: false isArray: false auto: false col: int len: -1 default: [] - Height int32 `gorm:"column:height;type:int;" json:"height"` + Scale int32 `gorm:"column:scale;type:int;" json:"scale"` + Width int32 `gorm:"column:width;type:int;" json:"width"` + Height int32 `gorm:"column:height;type:int;" json:"height"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_rooms.go b/server/model/roomfinder_rooms.go index 58f9e3e8..e7fb8c2e 100644 --- a/server/model/roomfinder_rooms.go +++ b/server/model/roomfinder_rooms.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,34 +17,20 @@ var ( // RoomfinderRooms struct is a row record of the roomfinder_rooms table in the tca database type RoomfinderRooms struct { - //[ 0] room_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - RoomID int32 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` - //[ 1] room_code varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - RoomCode null.String `gorm:"column:room_code;type:varchar(32);" json:"room_code"` - //[ 2] building_nr varchar(8) null: true primary: false isArray: false auto: false col: varchar len: 8 default: [] - BuildingNr null.String `gorm:"column:building_nr;type:varchar(8);" json:"building_nr"` - //[ 3] arch_id varchar(16) null: true primary: false isArray: false auto: false col: varchar len: 16 default: [] - ArchID null.String `gorm:"column:arch_id;type:varchar(16);" json:"arch_id"` - //[ 4] info varchar(64) null: true primary: false isArray: false auto: false col: varchar len: 64 default: [] - Info null.String `gorm:"column:info;type:varchar(64);" json:"info"` - //[ 5] address varchar(128) null: true primary: false isArray: false auto: false col: varchar len: 128 default: [] - Address null.String `gorm:"column:address;type:varchar(128);" json:"address"` - //[ 6] purpose_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - PurposeID null.Int `gorm:"column:purpose_id;type:int;" json:"purpose_id"` - //[ 7] purpose varchar(64) null: true primary: false isArray: false auto: false col: varchar len: 64 default: [] - Purpose null.String `gorm:"column:purpose;type:varchar(64);" json:"purpose"` - //[ 8] seats int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - Seats null.Int `gorm:"column:seats;type:int;" json:"seats"` - //[ 9] utm_zone varchar(4) null: true primary: false isArray: false auto: false col: varchar len: 4 default: [] - UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` - //[10] utm_easting varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` - //[11] utm_northing varchar(32) null: true primary: false isArray: false auto: false col: varchar len: 32 default: [] - UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` - //[12] unit_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - UnitID null.Int `gorm:"column:unit_id;type:int;" json:"unit_id"` - //[13] default_map_id int null: true primary: false isArray: false auto: false col: int len: -1 default: [] - DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` + RoomID int32 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` + RoomCode null.String `gorm:"column:room_code;type:varchar(32);" json:"room_code"` + BuildingNr null.String `gorm:"column:building_nr;type:varchar(8);" json:"building_nr"` + ArchID null.String `gorm:"column:arch_id;type:varchar(16);" json:"arch_id"` + Info null.String `gorm:"column:info;type:varchar(64);" json:"info"` + Address null.String `gorm:"column:address;type:varchar(128);" json:"address"` + PurposeID null.Int `gorm:"column:purpose_id;type:int;" json:"purpose_id"` + Purpose null.String `gorm:"column:purpose;type:varchar(64);" json:"purpose"` + Seats null.Int `gorm:"column:seats;type:int;" json:"seats"` + UtmZone null.String `gorm:"column:utm_zone;type:varchar(4);" json:"utm_zone"` + UtmEasting null.String `gorm:"column:utm_easting;type:varchar(32);" json:"utm_easting"` + UtmNorthing null.String `gorm:"column:utm_northing;type:varchar(32);" json:"utm_northing"` + UnitID null.Int `gorm:"column:unit_id;type:int;" json:"unit_id"` + DefaultMapID null.Int `gorm:"column:default_map_id;type:int;" json:"default_map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/roomfinder_rooms2maps.go b/server/model/roomfinder_rooms2maps.go index 61b1b135..1af8d278 100644 --- a/server/model/roomfinder_rooms2maps.go +++ b/server/model/roomfinder_rooms2maps.go @@ -4,8 +4,8 @@ import ( "database/sql" "time" + "github.com/gofrs/uuid/v5" "github.com/guregu/null" - "github.com/satori/go.uuid" ) var ( @@ -17,10 +17,8 @@ var ( // RoomfinderRooms2maps struct is a row record of the roomfinder_rooms2maps table in the tca database type RoomfinderRooms2maps struct { - //[ 0] room_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] RoomID int32 `gorm:"primary_key;column:room_id;type:int;" json:"room_id"` - //[ 1] map_id int null: false primary: true isArray: false auto: false col: int len: -1 default: [] - MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` + MapID int32 `gorm:"primary_key;column:map_id;type:int;" json:"map_id"` } // TableName sets the insert table name for this struct type diff --git a/server/model/updateNote.go b/server/model/updateNote.go new file mode 100755 index 00000000..15ec9c7d --- /dev/null +++ b/server/model/updateNote.go @@ -0,0 +1,13 @@ +package model + +// UpdateNote struct for update notes +type UpdateNote struct { + VersionCode int32 `gorm:"primary_key;AUTO_INCREMENT;column:version_code;type:int;"` + VersionName string `gorm:"column:version_name;type:text;"` + Message string `gorm:"column:message;type:text;"` +} + +// TableName sets the insert table name for this struct type +func (n *UpdateNote) TableName() string { + return "update_note" +} diff --git a/server/swagger/fav.png b/server/swagger/fav.png new file mode 100644 index 00000000..43c43acb Binary files /dev/null and b/server/swagger/fav.png differ diff --git a/server/swagger/favicon-16x16.png b/server/swagger/favicon-16x16.png deleted file mode 100644 index 8b194e61..00000000 Binary files a/server/swagger/favicon-16x16.png and /dev/null differ diff --git a/server/swagger/favicon-32x32.png b/server/swagger/favicon-32x32.png deleted file mode 100644 index 249737fe..00000000 Binary files a/server/swagger/favicon-32x32.png and /dev/null differ diff --git a/server/swagger/index.html b/server/swagger/index.html index 60d2c93f..168efec7 100644 --- a/server/swagger/index.html +++ b/server/swagger/index.html @@ -5,55 +5,26 @@ Swagger UI - - - -
- - diff --git a/server/swagger/oauth2-redirect.html b/server/swagger/oauth2-redirect.html index 64b171f7..56409171 100644 --- a/server/swagger/oauth2-redirect.html +++ b/server/swagger/oauth2-redirect.html @@ -13,7 +13,7 @@ var isValid, qp, arr; if (/code|token|error/.test(window.location.hash)) { - qp = window.location.hash.substring(1); + qp = window.location.hash.substring(1).replace('?', '&'); } else { qp = location.search.substring(1); } @@ -38,7 +38,7 @@ authId: oauth2.auth.name, source: "auth", level: "warning", - message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server" + message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server." }); } @@ -58,7 +58,7 @@ authId: oauth2.auth.name, source: "auth", level: "error", - message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server" + message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server." }); } } else { @@ -67,9 +67,13 @@ window.close(); } - window.addEventListener('DOMContentLoaded', function () { - run(); - }); + if (document.readyState !== 'loading') { + run(); + } else { + document.addEventListener('DOMContentLoaded', function () { + run(); + }); + } diff --git a/server/swagger/swagger-ui-bundle.js b/server/swagger/swagger-ui-bundle.js index 6607e499..c512dd47 100644 --- a/server/swagger/swagger-ui-bundle.js +++ b/server/swagger/swagger-ui-bundle.js @@ -1,3 +1,3 @@ /*! For license information please see swagger-ui-bundle.js.LICENSE.txt */ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SwaggerUIBundle=t():e.SwaggerUIBundle=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist",n(n.s=489)}([function(e,t,n){"use strict";e.exports=n(566)},function(e,t,n){e.exports=function(){"use strict";var e=Array.prototype.slice;function t(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function n(e){return i(e)?e:J(e)}function r(e){return u(e)?e:K(e)}function o(e){return s(e)?e:Y(e)}function a(e){return i(e)&&!c(e)?e:G(e)}function i(e){return!(!e||!e[f])}function u(e){return!(!e||!e[p])}function s(e){return!(!e||!e[h])}function c(e){return u(e)||s(e)}function l(e){return!(!e||!e[d])}t(r,n),t(o,n),t(a,n),n.isIterable=i,n.isKeyed=u,n.isIndexed=s,n.isAssociative=c,n.isOrdered=l,n.Keyed=r,n.Indexed=o,n.Set=a;var f="@@__IMMUTABLE_ITERABLE__@@",p="@@__IMMUTABLE_KEYED__@@",h="@@__IMMUTABLE_INDEXED__@@",d="@@__IMMUTABLE_ORDERED__@@",m="delete",v=5,g=1<>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?A(e)+t:t}function C(){return!0}function j(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function T(e,t){return I(e,t,0)}function P(e,t){return I(e,t,t)}function I(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}var N=0,M=1,R=2,D="function"==typeof Symbol&&Symbol.iterator,L="@@iterator",B=D||L;function F(e){this.next=e}function z(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function U(){return{value:void 0,done:!0}}function q(e){return!!H(e)}function V(e){return e&&"function"==typeof e.next}function W(e){var t=H(e);return t&&t.call(e)}function H(e){var t=e&&(D&&e[D]||e[L]);if("function"==typeof t)return t}function $(e){return e&&"number"==typeof e.length}function J(e){return null==e?ie():i(e)?e.toSeq():ce(e)}function K(e){return null==e?ie().toKeyedSeq():i(e)?u(e)?e.toSeq():e.fromEntrySeq():ue(e)}function Y(e){return null==e?ie():i(e)?u(e)?e.entrySeq():e.toIndexedSeq():se(e)}function G(e){return(null==e?ie():i(e)?u(e)?e.entrySeq():e:se(e)).toSetSeq()}F.prototype.toString=function(){return"[Iterator]"},F.KEYS=N,F.VALUES=M,F.ENTRIES=R,F.prototype.inspect=F.prototype.toSource=function(){return this.toString()},F.prototype[B]=function(){return this},t(J,n),J.of=function(){return J(arguments)},J.prototype.toSeq=function(){return this},J.prototype.toString=function(){return this.__toString("Seq {","}")},J.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},J.prototype.__iterate=function(e,t){return fe(this,e,t,!0)},J.prototype.__iterator=function(e,t){return pe(this,e,t,!0)},t(K,J),K.prototype.toKeyedSeq=function(){return this},t(Y,J),Y.of=function(){return Y(arguments)},Y.prototype.toIndexedSeq=function(){return this},Y.prototype.toString=function(){return this.__toString("Seq [","]")},Y.prototype.__iterate=function(e,t){return fe(this,e,t,!1)},Y.prototype.__iterator=function(e,t){return pe(this,e,t,!1)},t(G,J),G.of=function(){return G(arguments)},G.prototype.toSetSeq=function(){return this},J.isSeq=ae,J.Keyed=K,J.Set=G,J.Indexed=Y;var Q,Z,X,ee="@@__IMMUTABLE_SEQ__@@";function te(e){this._array=e,this.size=e.length}function ne(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function re(e){this._iterable=e,this.size=e.length||e.size}function oe(e){this._iterator=e,this._iteratorCache=[]}function ae(e){return!(!e||!e[ee])}function ie(){return Q||(Q=new te([]))}function ue(e){var t=Array.isArray(e)?new te(e).fromEntrySeq():V(e)?new oe(e).fromEntrySeq():q(e)?new re(e).fromEntrySeq():"object"==typeof e?new ne(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function se(e){var t=le(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function ce(e){var t=le(e)||"object"==typeof e&&new ne(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function le(e){return $(e)?new te(e):V(e)?new oe(e):q(e)?new re(e):void 0}function fe(e,t,n,r){var o=e._cache;if(o){for(var a=o.length-1,i=0;i<=a;i++){var u=o[n?a-i:i];if(!1===t(u[1],r?u[0]:i,e))return i+1}return i}return e.__iterateUncached(t,n)}function pe(e,t,n,r){var o=e._cache;if(o){var a=o.length-1,i=0;return new F((function(){var e=o[n?a-i:i];return i++>a?U():z(t,r?e[0]:i-1,e[1])}))}return e.__iteratorUncached(t,n)}function he(e,t){return t?de(t,e,"",{"":e}):me(e)}function de(e,t,n,r){return Array.isArray(t)?e.call(r,n,Y(t).map((function(n,r){return de(e,n,r,t)}))):ve(t)?e.call(r,n,K(t).map((function(n,r){return de(e,n,r,t)}))):t}function me(e){return Array.isArray(e)?Y(e).map(me).toList():ve(e)?K(e).map(me).toMap():e}function ve(e){return e&&(e.constructor===Object||void 0===e.constructor)}function ge(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function ye(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||u(e)!==u(t)||s(e)!==s(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!c(e);if(l(e)){var r=e.entries();return t.every((function(e,t){var o=r.next().value;return o&&ge(o[1],e)&&(n||ge(o[0],t))}))&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var a=e;e=t,t=a}var f=!0,p=t.__iterate((function(t,r){if(n?!e.has(t):o?!ge(t,e.get(r,b)):!ge(e.get(r,b),t))return f=!1,!1}));return f&&e.size===p}function be(e,t){if(!(this instanceof be))return new be(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(Z)return Z;Z=this}}function we(e,t){if(!e)throw new Error(t)}function xe(e,t,n){if(!(this instanceof xe))return new xe(e,t,n);if(we(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),tr?U():z(e,o,n[t?r-o++:o++])}))},t(ne,K),ne.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},ne.prototype.has=function(e){return this._object.hasOwnProperty(e)},ne.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,a=0;a<=o;a++){var i=r[t?o-a:a];if(!1===e(n[i],i,this))return a+1}return a},ne.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,a=0;return new F((function(){var i=r[t?o-a:a];return a++>o?U():z(e,i,n[i])}))},ne.prototype[d]=!0,t(re,Y),re.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=W(this._iterable),r=0;if(V(n))for(var o;!(o=n.next()).done&&!1!==e(o.value,r++,this););return r},re.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=W(this._iterable);if(!V(n))return new F(U);var r=0;return new F((function(){var t=n.next();return t.done?t:z(e,r++,t.value)}))},t(oe,Y),oe.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n,r=this._iterator,o=this._iteratorCache,a=0;a=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return z(e,o,r[o++])}))},t(be,Y),be.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},be.prototype.get=function(e,t){return this.has(e)?this._value:t},be.prototype.includes=function(e){return ge(this._value,e)},be.prototype.slice=function(e,t){var n=this.size;return j(e,t,n)?this:new be(this._value,P(t,n)-T(e,n))},be.prototype.reverse=function(){return this},be.prototype.indexOf=function(e){return ge(this._value,e)?0:-1},be.prototype.lastIndexOf=function(e){return ge(this._value,e)?this.size:-1},be.prototype.__iterate=function(e,t){for(var n=0;n=0&&t=0&&nn?U():z(e,a++,i)}))},xe.prototype.equals=function(e){return e instanceof xe?this._start===e._start&&this._end===e._end&&this._step===e._step:ye(this,e)},t(_e,n),t(Ee,_e),t(Se,_e),t(ke,_e),_e.Keyed=Ee,_e.Indexed=Se,_e.Set=ke;var Ae="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),r=65535&(t|=0);return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0};function Oe(e){return e>>>1&1073741824|3221225471&e}function Ce(e){if(!1===e||null==e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null==e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!=e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)n^=e/=4294967295;return Oe(n)}if("string"===t)return e.length>Fe?je(e):Te(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return Pe(e);if("function"==typeof e.toString)return Te(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function je(e){var t=qe[e];return void 0===t&&(t=Te(e),Ue===ze&&(Ue=0,qe={}),Ue++,qe[e]=t),t}function Te(e){for(var t=0,n=0;n0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}var Re,De="function"==typeof WeakMap;De&&(Re=new WeakMap);var Le=0,Be="__immutablehash__";"function"==typeof Symbol&&(Be=Symbol(Be));var Fe=16,ze=255,Ue=0,qe={};function Ve(e){we(e!==1/0,"Cannot perform this action with an infinite size.")}function We(e){return null==e?ot():He(e)&&!l(e)?e:ot().withMutations((function(t){var n=r(e);Ve(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}function He(e){return!(!e||!e[Je])}t(We,Ee),We.of=function(){var t=e.call(arguments,0);return ot().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},We.prototype.toString=function(){return this.__toString("Map {","}")},We.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},We.prototype.set=function(e,t){return at(this,e,t)},We.prototype.setIn=function(e,t){return this.updateIn(e,b,(function(){return t}))},We.prototype.remove=function(e){return at(this,e,b)},We.prototype.deleteIn=function(e){return this.updateIn(e,(function(){return b}))},We.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},We.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=vt(this,_n(e),t,n);return r===b?void 0:r},We.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):ot()},We.prototype.merge=function(){return pt(this,void 0,arguments)},We.prototype.mergeWith=function(t){return pt(this,t,e.call(arguments,1))},We.prototype.mergeIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.merge?e.merge.apply(e,n):n[n.length-1]}))},We.prototype.mergeDeep=function(){return pt(this,ht,arguments)},We.prototype.mergeDeepWith=function(t){var n=e.call(arguments,1);return pt(this,dt(t),n)},We.prototype.mergeDeepIn=function(t){var n=e.call(arguments,1);return this.updateIn(t,ot(),(function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,n):n[n.length-1]}))},We.prototype.sort=function(e){return qt(fn(this,e))},We.prototype.sortBy=function(e,t){return qt(fn(this,t,e))},We.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},We.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new S)},We.prototype.asImmutable=function(){return this.__ensureOwner()},We.prototype.wasAltered=function(){return this.__altered},We.prototype.__iterator=function(e,t){return new et(this,e,t)},We.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate((function(t){return r++,e(t[1],t[0],n)}),t),r},We.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?rt(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},We.isMap=He;var $e,Je="@@__IMMUTABLE_MAP__@@",Ke=We.prototype;function Ye(e,t){this.ownerID=e,this.entries=t}function Ge(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function Qe(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function Ze(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function Xe(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function et(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&nt(e._root)}function tt(e,t){return z(e,t[0],t[1])}function nt(e,t){return{node:e,index:0,__prev:t}}function rt(e,t,n,r){var o=Object.create(Ke);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function ot(){return $e||($e=rt(0))}function at(e,t,n){var r,o;if(e._root){var a=_(w),i=_(x);if(r=it(e._root,e.__ownerID,0,void 0,t,n,a,i),!i.value)return e;o=e.size+(a.value?n===b?-1:1:0)}else{if(n===b)return e;o=1,r=new Ye(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?rt(o,r):ot()}function it(e,t,n,r,o,a,i,u){return e?e.update(t,n,r,o,a,i,u):a===b?e:(E(u),E(i),new Xe(t,r,[o,a]))}function ut(e){return e.constructor===Xe||e.constructor===Ze}function st(e,t,n,r,o){if(e.keyHash===r)return new Ze(t,r,[e.entry,o]);var a,i=(0===n?e.keyHash:e.keyHash>>>n)&y,u=(0===n?r:r>>>n)&y;return new Ge(t,1<>>=1)i[u]=1&n?t[a++]:void 0;return i[r]=o,new Qe(e,a+1,i)}function pt(e,t,n){for(var o=[],a=0;a>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function yt(e,t,n,r){var o=r?e:k(e);return o[t]=n,o}function bt(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var a=new Array(o),i=0,u=0;u=xt)return ct(e,s,r,o);var p=e&&e===this.ownerID,h=p?s:k(s);return f?u?c===l-1?h.pop():h[c]=h.pop():h[c]=[r,o]:h.push([r,o]),p?(this.entries=h,this):new Ye(e,h)}},Ge.prototype.get=function(e,t,n,r){void 0===t&&(t=Ce(n));var o=1<<((0===e?t:t>>>e)&y),a=this.bitmap;return 0==(a&o)?r:this.nodes[gt(a&o-1)].get(e+v,t,n,r)},Ge.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&y,s=1<=_t)return ft(e,p,c,u,d);if(l&&!d&&2===p.length&&ut(p[1^f]))return p[1^f];if(l&&d&&1===p.length&&ut(d))return d;var m=e&&e===this.ownerID,g=l?d?c:c^s:c|s,w=l?d?yt(p,f,d,m):wt(p,f,m):bt(p,f,d,m);return m?(this.bitmap=g,this.nodes=w,this):new Ge(e,g,w)},Qe.prototype.get=function(e,t,n,r){void 0===t&&(t=Ce(n));var o=(0===e?t:t>>>e)&y,a=this.nodes[o];return a?a.get(e+v,t,n,r):r},Qe.prototype.update=function(e,t,n,r,o,a,i){void 0===n&&(n=Ce(r));var u=(0===t?n:n>>>t)&y,s=o===b,c=this.nodes,l=c[u];if(s&&!l)return this;var f=it(l,e,t+v,n,r,o,a,i);if(f===l)return this;var p=this.count;if(l){if(!f&&--p0&&r=0&&e>>t&y;if(r>=this.array.length)return new Ct([],e);var o,a=0===r;if(t>0){var i=this.array[r];if((o=i&&i.removeBefore(e,t-v,n))===i&&a)return this}if(a&&!o)return this;var u=Lt(this,e);if(!a)for(var s=0;s>>t&y;if(o>=this.array.length)return this;if(t>0){var a=this.array[o];if((r=a&&a.removeAfter(e,t-v,n))===a&&o===this.array.length-1)return this}var i=Lt(this,e);return i.array.splice(o+1),r&&(i.array[o]=r),i};var jt,Tt,Pt={};function It(e,t){var n=e._origin,r=e._capacity,o=Ut(r),a=e._tail;return i(e._root,e._level,0);function i(e,t,n){return 0===t?u(e,n):s(e,t,n)}function u(e,i){var u=i===o?a&&a.array:e&&e.array,s=i>n?0:n-i,c=r-i;return c>g&&(c=g),function(){if(s===c)return Pt;var e=t?--c:s++;return u&&u[e]}}function s(e,o,a){var u,s=e&&e.array,c=a>n?0:n-a>>o,l=1+(r-a>>o);return l>g&&(l=g),function(){for(;;){if(u){var e=u();if(e!==Pt)return e;u=null}if(c===l)return Pt;var n=t?--l:c++;u=i(s&&s[n],o-v,a+(n<=e.size||t<0)return e.withMutations((function(e){t<0?Ft(e,t).set(0,n):Ft(e,0,t+1).set(t,n)}));t+=e._origin;var r=e._tail,o=e._root,a=_(x);return t>=Ut(e._capacity)?r=Dt(r,e.__ownerID,0,t,n,a):o=Dt(o,e.__ownerID,e._level,t,n,a),a.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Nt(e._origin,e._capacity,e._level,o,r):e}function Dt(e,t,n,r,o,a){var i,u=r>>>n&y,s=e&&u0){var c=e&&e.array[u],l=Dt(c,t,n-v,r,o,a);return l===c?e:((i=Lt(e,t)).array[u]=l,i)}return s&&e.array[u]===o?e:(E(a),i=Lt(e,t),void 0===o&&u===i.array.length-1?i.array.pop():i.array[u]=o,i)}function Lt(e,t){return t&&e&&t===e.ownerID?e:new Ct(e?e.array.slice():[],t)}function Bt(e,t){if(t>=Ut(e._capacity))return e._tail;if(t<1<0;)n=n.array[t>>>r&y],r-=v;return n}}function Ft(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new S,o=e._origin,a=e._capacity,i=o+t,u=void 0===n?a:n<0?a+n:o+n;if(i===o&&u===a)return e;if(i>=u)return e.clear();for(var s=e._level,c=e._root,l=0;i+l<0;)c=new Ct(c&&c.array.length?[void 0,c]:[],r),l+=1<<(s+=v);l&&(i+=l,o+=l,u+=l,a+=l);for(var f=Ut(a),p=Ut(u);p>=1<f?new Ct([],r):h;if(h&&p>f&&iv;g-=v){var b=f>>>g&y;m=m.array[b]=Lt(m.array[b],r)}m.array[f>>>v&y]=h}if(u=p)i-=p,u-=p,s=v,c=null,d=d&&d.removeBefore(r,0,i);else if(i>o||p>>s&y;if(w!==p>>>s&y)break;w&&(l+=(1<o&&(c=c.removeBefore(r,s,i-l)),c&&pa&&(a=c.size),i(s)||(c=c.map((function(e){return he(e)}))),r.push(c)}return a>e.size&&(e=e.setSize(a)),mt(e,t,r)}function Ut(e){return e>>v<=g&&i.size>=2*a.size?(r=(o=i.filter((function(e,t){return void 0!==e&&u!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=a.remove(t),o=u===i.size-1?i.pop():i.set(u,void 0))}else if(s){if(n===i.get(u)[1])return e;r=a,o=i.set(u,[t,n])}else r=a.set(t,i.size),o=i.set(i.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):Wt(r,o)}function Jt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function Kt(e){this._iter=e,this.size=e.size}function Yt(e){this._iter=e,this.size=e.size}function Gt(e){this._iter=e,this.size=e.size}function Qt(e){var t=bn(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=wn,t.__iterateUncached=function(t,n){var r=this;return e.__iterate((function(e,n){return!1!==t(n,e,r)}),n)},t.__iteratorUncached=function(t,n){if(t===R){var r=e.__iterator(t,n);return new F((function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===M?N:M,n)},t}function Zt(e,t,n){var r=bn(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var a=e.get(r,b);return a===b?o:t.call(n,a,r,e)},r.__iterateUncached=function(r,o){var a=this;return e.__iterate((function(e,o,i){return!1!==r(t.call(n,e,o,i),o,a)}),o)},r.__iteratorUncached=function(r,o){var a=e.__iterator(R,o);return new F((function(){var o=a.next();if(o.done)return o;var i=o.value,u=i[0];return z(r,u,t.call(n,i[1],u,e),o)}))},r}function Xt(e,t){var n=bn(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=Qt(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=wn,n.__iterate=function(t,n){var r=this;return e.__iterate((function(e,n){return t(e,n,r)}),!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function en(e,t,n,r){var o=bn(e);return r&&(o.has=function(r){var o=e.get(r,b);return o!==b&&!!t.call(n,o,r,e)},o.get=function(r,o){var a=e.get(r,b);return a!==b&&t.call(n,a,r,e)?a:o}),o.__iterateUncached=function(o,a){var i=this,u=0;return e.__iterate((function(e,a,s){if(t.call(n,e,a,s))return u++,o(e,r?a:u-1,i)}),a),u},o.__iteratorUncached=function(o,a){var i=e.__iterator(R,a),u=0;return new F((function(){for(;;){var a=i.next();if(a.done)return a;var s=a.value,c=s[0],l=s[1];if(t.call(n,l,c,e))return z(o,r?c:u++,l,a)}}))},o}function tn(e,t,n){var r=We().asMutable();return e.__iterate((function(o,a){r.update(t.call(n,o,a,e),0,(function(e){return e+1}))})),r.asImmutable()}function nn(e,t,n){var r=u(e),o=(l(e)?qt():We()).asMutable();e.__iterate((function(a,i){o.update(t.call(n,a,i,e),(function(e){return(e=e||[]).push(r?[i,a]:a),e}))}));var a=yn(e);return o.map((function(t){return mn(e,a(t))}))}function rn(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),j(t,n,o))return e;var a=T(t,o),i=P(n,o);if(a!=a||i!=i)return rn(e.toSeq().cacheResult(),t,n,r);var u,s=i-a;s==s&&(u=s<0?0:s);var c=bn(e);return c.size=0===u?u:e.size&&u||void 0,!r&&ae(e)&&u>=0&&(c.get=function(t,n){return(t=O(this,t))>=0&&tu)return U();var e=o.next();return r||t===M?e:z(t,s-1,t===N?void 0:e.value[1],e)}))},c}function on(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterate(r,o);var i=0;return e.__iterate((function(e,o,u){return t.call(n,e,o,u)&&++i&&r(e,o,a)})),i},r.__iteratorUncached=function(r,o){var a=this;if(o)return this.cacheResult().__iterator(r,o);var i=e.__iterator(R,o),u=!0;return new F((function(){if(!u)return U();var e=i.next();if(e.done)return e;var o=e.value,s=o[0],c=o[1];return t.call(n,c,s,a)?r===R?e:z(r,s,c,e):(u=!1,U())}))},r}function an(e,t,n,r){var o=bn(e);return o.__iterateUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterate(o,a);var u=!0,s=0;return e.__iterate((function(e,a,c){if(!u||!(u=t.call(n,e,a,c)))return s++,o(e,r?a:s-1,i)})),s},o.__iteratorUncached=function(o,a){var i=this;if(a)return this.cacheResult().__iterator(o,a);var u=e.__iterator(R,a),s=!0,c=0;return new F((function(){var e,a,l;do{if((e=u.next()).done)return r||o===M?e:z(o,c++,o===N?void 0:e.value[1],e);var f=e.value;a=f[0],l=f[1],s&&(s=t.call(n,l,a,i))}while(s);return o===R?e:z(o,a,l,e)}))},o}function un(e,t){var n=u(e),o=[e].concat(t).map((function(e){return i(e)?n&&(e=r(e)):e=n?ue(e):se(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===o.length)return e;if(1===o.length){var a=o[0];if(a===e||n&&u(a)||s(e)&&s(a))return a}var c=new te(o);return n?c=c.toKeyedSeq():s(e)||(c=c.toSetSeq()),(c=c.flatten(!0)).size=o.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),c}function sn(e,t,n){var r=bn(e);return r.__iterateUncached=function(r,o){var a=0,u=!1;function s(e,c){var l=this;e.__iterate((function(e,o){return(!t||c0}function dn(e,t,r){var o=bn(e);return o.size=new te(r).map((function(e){return e.size})).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(M,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var a=r.map((function(e){return e=n(e),W(o?e.reverse():e)})),i=0,u=!1;return new F((function(){var n;return u||(n=a.map((function(e){return e.next()})),u=n.some((function(e){return e.done}))),u?U():z(e,i++,t.apply(null,n.map((function(e){return e.value}))))}))},o}function mn(e,t){return ae(e)?t:e.constructor(t)}function vn(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function gn(e){return Ve(e.size),A(e)}function yn(e){return u(e)?r:s(e)?o:a}function bn(e){return Object.create((u(e)?K:s(e)?Y:G).prototype)}function wn(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):J.prototype.cacheResult.call(this)}function xn(e,t){return e>t?1:e=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kn(e,t)},Vn.prototype.pushAll=function(e){if(0===(e=o(e)).size)return this;Ve(e.size);var t=this.size,n=this._head;return e.reverse().forEach((function(e){t++,n={value:e,next:n}})),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kn(t,n)},Vn.prototype.pop=function(){return this.slice(1)},Vn.prototype.unshift=function(){return this.push.apply(this,arguments)},Vn.prototype.unshiftAll=function(e){return this.pushAll(e)},Vn.prototype.shift=function(){return this.pop.apply(this,arguments)},Vn.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Yn()},Vn.prototype.slice=function(e,t){if(j(e,t,this.size))return this;var n=T(e,this.size);if(P(t,this.size)!==this.size)return Se.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Kn(r,o)},Vn.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kn(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Vn.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},Vn.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new F((function(){if(r){var t=r.value;return r=r.next,z(e,n++,t)}return U()}))},Vn.isStack=Wn;var Hn,$n="@@__IMMUTABLE_STACK__@@",Jn=Vn.prototype;function Kn(e,t,n,r){var o=Object.create(Jn);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Yn(){return Hn||(Hn=Kn(0))}function Gn(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}Jn[$n]=!0,Jn.withMutations=Ke.withMutations,Jn.asMutable=Ke.asMutable,Jn.asImmutable=Ke.asImmutable,Jn.wasAltered=Ke.wasAltered,n.Iterator=F,Gn(n,{toArray:function(){Ve(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate((function(t,n){e[n]=t})),e},toIndexedSeq:function(){return new Kt(this)},toJS:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJS?e.toJS():e})).__toJS()},toJSON:function(){return this.toSeq().map((function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e})).__toJS()},toKeyedSeq:function(){return new Jt(this,!0)},toMap:function(){return We(this.toKeyedSeq())},toObject:function(){Ve(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e},toOrderedMap:function(){return qt(this.toKeyedSeq())},toOrderedSet:function(){return Ln(u(this)?this.valueSeq():this)},toSet:function(){return jn(u(this)?this.valueSeq():this)},toSetSeq:function(){return new Yt(this)},toSeq:function(){return s(this)?this.toIndexedSeq():u(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Vn(u(this)?this.valueSeq():this)},toList:function(){return St(u(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return mn(this,un(this,e.call(arguments,0)))},includes:function(e){return this.some((function(t){return ge(t,e)}))},entries:function(){return this.__iterator(R)},every:function(e,t){Ve(this.size);var n=!0;return this.__iterate((function(r,o,a){if(!e.call(t,r,o,a))return n=!1,!1})),n},filter:function(e,t){return mn(this,en(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return Ve(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){Ve(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(r){n?n=!1:t+=e,t+=null!=r?r.toString():""})),t},keys:function(){return this.__iterator(N)},map:function(e,t){return mn(this,Zt(this,e,t))},reduce:function(e,t,n){var r,o;return Ve(this.size),arguments.length<2?o=!0:r=t,this.__iterate((function(t,a,i){o?(o=!1,r=t):r=e.call(n,r,t,a,i)})),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return mn(this,Xt(this,!0))},slice:function(e,t){return mn(this,rn(this,e,t,!0))},some:function(e,t){return!this.every(tr(e),t)},sort:function(e){return mn(this,fn(this,e))},values:function(){return this.__iterator(M)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return A(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return tn(this,e,t)},equals:function(e){return ye(this,e)},entrySeq:function(){var e=this;if(e._cache)return new te(e._cache);var t=e.toSeq().map(er).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(tr(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate((function(n,o,a){if(e.call(t,n,o,a))return r=[o,n],!1})),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(C)},flatMap:function(e,t){return mn(this,cn(this,e,t))},flatten:function(e){return mn(this,sn(this,e,!0))},fromEntrySeq:function(){return new Gt(this)},get:function(e,t){return this.find((function(t,n){return ge(n,e)}),void 0,t)},getIn:function(e,t){for(var n,r=this,o=_n(e);!(n=o.next()).done;){var a=n.value;if((r=r&&r.get?r.get(a,b):b)===b)return t}return r},groupBy:function(e,t){return nn(this,e,t)},has:function(e){return this.get(e,b)!==b},hasIn:function(e){return this.getIn(e,b)!==b},isSubset:function(e){return e="function"==typeof e.includes?e:n(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:n(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return ge(t,e)}))},keySeq:function(){return this.toSeq().map(Xn).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return pn(this,e)},maxBy:function(e,t){return pn(this,t,e)},min:function(e){return pn(this,e?nr(e):ar)},minBy:function(e,t){return pn(this,t?nr(t):ar,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return mn(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return mn(this,an(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(tr(e),t)},sortBy:function(e,t){return mn(this,fn(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return mn(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return mn(this,on(this,e,t))},takeUntil:function(e,t){return this.takeWhile(tr(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=ir(this))}});var Qn=n.prototype;Qn[f]=!0,Qn[B]=Qn.values,Qn.__toJS=Qn.toArray,Qn.__toStringMapper=rr,Qn.inspect=Qn.toSource=function(){return this.toString()},Qn.chain=Qn.flatMap,Qn.contains=Qn.includes,Gn(r,{flip:function(){return mn(this,Qt(this))},mapEntries:function(e,t){var n=this,r=0;return mn(this,this.toSeq().map((function(o,a){return e.call(t,[a,o],r++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return mn(this,this.toSeq().flip().map((function(r,o){return e.call(t,r,o,n)})).flip())}});var Zn=r.prototype;function Xn(e,t){return t}function er(e,t){return[t,e]}function tr(e){return function(){return!e.apply(this,arguments)}}function nr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return"string"==typeof e?JSON.stringify(e):String(e)}function or(){return k(arguments)}function ar(e,t){return et?-1:0}function ir(e){if(e.size===1/0)return 0;var t=l(e),n=u(e),r=t?1:0;return ur(e.__iterate(n?t?function(e,t){r=31*r+sr(Ce(e),Ce(t))|0}:function(e,t){r=r+sr(Ce(e),Ce(t))|0}:t?function(e){r=31*r+Ce(e)|0}:function(e){r=r+Ce(e)|0}),r)}function ur(e,t){return t=Ae(t,3432918353),t=Ae(t<<15|t>>>-15,461845907),t=Ae(t<<13|t>>>-13,5),t=Ae((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Oe((t=Ae(t^t>>>13,3266489909))^t>>>16)}function sr(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}return Zn[p]=!0,Zn[B]=Qn.entries,Zn.__toJS=Qn.toObject,Zn.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+rr(e)},Gn(o,{toKeyedSeq:function(){return new Jt(this,!1)},filter:function(e,t){return mn(this,en(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return mn(this,Xt(this,!1))},slice:function(e,t){return mn(this,rn(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=T(e,e<0?this.count():this.size);var r=this.slice(0,e);return mn(this,1===n?r:r.concat(k(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return mn(this,sn(this,e,!1))},get:function(e,t){return(e=O(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=O(this,e))>=0&&(void 0!==this.size?this.size===1/0||e1)try{return decodeURIComponent(t[1])}catch(e){console.error(e)}return null}function Ie(e){return t=e.replace(/\.[^./]*$/,""),Y()(J()(t));var t}function Ne(e,t,n,r,a){if(!t)return[];var u=[],s=t.get("nullable"),c=t.get("required"),f=t.get("maximum"),h=t.get("minimum"),d=t.get("type"),m=t.get("format"),g=t.get("maxLength"),b=t.get("minLength"),x=t.get("uniqueItems"),_=t.get("maxItems"),E=t.get("minItems"),S=t.get("pattern"),k=n||!0===c,A=null!=e;if(s&&null===e||!d||!(k||A&&"array"===d||!(!k&&!A)))return[];var O="string"===d&&e,C="array"===d&&l()(e)&&e.length,j="array"===d&&W.a.List.isList(e)&&e.count(),T=[O,C,j,"array"===d&&"string"==typeof e&&e,"file"===d&&e instanceof ue.a.File,"boolean"===d&&(e||!1===e),"number"===d&&(e||0===e),"integer"===d&&(e||0===e),"object"===d&&"object"===i()(e)&&null!==e,"object"===d&&"string"==typeof e&&e],P=I()(T).call(T,(function(e){return!!e}));if(k&&!P&&!r)return u.push("Required field is not provided"),u;if("object"===d&&(null===a||"application/json"===a)){var N,M=e;if("string"==typeof e)try{M=JSON.parse(e)}catch(e){return u.push("Parameter string value must be valid JSON"),u}if(t&&t.has("required")&&Ee(c.isList)&&c.isList()&&y()(c).call(c,(function(e){void 0===M[e]&&u.push({propKey:e,error:"Required property not found"})})),t&&t.has("properties"))y()(N=t.get("properties")).call(N,(function(e,t){var n=Ne(M[t],e,!1,r,a);u.push.apply(u,o()(p()(n).call(n,(function(e){return{propKey:t,error:e}}))))}))}if(S){var R=function(e,t){if(!new RegExp(t).test(e))return"Value must follow pattern "+t}(e,S);R&&u.push(R)}if(E&&"array"===d){var D=function(e,t){var n;if(!e&&t>=1||e&&e.lengtht)return v()(n="Array must not contain more then ".concat(t," item")).call(n,1===t?"":"s")}(e,_);L&&u.push({needRemove:!0,error:L})}if(x&&"array"===d){var B=function(e,t){if(e&&("true"===t||!0===t)){var n=Object(V.fromJS)(e),r=n.toSet();if(e.length>r.size){var o=Object(V.Set)();if(y()(n).call(n,(function(e,t){w()(n).call(n,(function(t){return Ee(t.equals)?t.equals(e):t===e})).size>1&&(o=o.add(t))})),0!==o.size)return p()(o).call(o,(function(e){return{index:e,error:"No duplicates allowed."}})).toArray()}}}(e,x);B&&u.push.apply(u,o()(B))}if(g||0===g){var F=function(e,t){var n;if(e.length>t)return v()(n="Value must be no longer than ".concat(t," character")).call(n,1!==t?"s":"")}(e,g);F&&u.push(F)}if(b){var z=function(e,t){var n;if(e.lengtht)return"Value must be less than ".concat(t)}(e,f);U&&u.push(U)}if(h||0===h){var q=function(e,t){if(e2&&void 0!==arguments[2]?arguments[2]:{},r=n.isOAS3,o=void 0!==r&&r,a=n.bypassRequiredCheck,i=void 0!==a&&a,u=e.get("required"),s=Object(le.a)(e,{isOAS3:o}),c=s.schema,l=s.parameterContentMediaType;return Ne(t,c,u,i,l)},Re=function(e,t,n){if(e&&(!e.xml||!e.xml.name)){if(e.xml=e.xml||{},!e.$$ref)return e.type||e.items||e.properties||e.additionalProperties?'\n\x3c!-- XML example cannot be generated; root element name is undefined --\x3e':null;var r=e.$$ref.match(/\S*\/(\S+)$/);e.xml.name=r[1]}return Object(ie.memoizedCreateXMLExample)(e,t,n)},De=[{when:/json/,shouldStringifyTypes:["string"]}],Le=["object"],Be=function(e,t,n,r){var a=Object(ie.memoizedSampleFromSchema)(e,t,r),u=i()(a),s=S()(De).call(De,(function(e,t){var r;return t.when.test(n)?v()(r=[]).call(r,o()(e),o()(t.shouldStringifyTypes)):e}),Le);return te()(s,(function(e){return e===u}))?M()(a,null,2):a},Fe=function(e,t,n,r){var o,a=Be(e,t,n,r);try{"\n"===(o=me.a.dump(me.a.load(a),{lineWidth:-1}))[o.length-1]&&(o=T()(o).call(o,0,o.length-1))}catch(e){return console.error(e),"error: could not generate yaml example"}return o.replace(/\t/g," ")},ze=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:void 0;return e&&Ee(e.toJS)&&(e=e.toJS()),r&&Ee(r.toJS)&&(r=r.toJS()),/xml/.test(t)?Re(e,n,r):/(yaml|yml)/.test(t)?Fe(e,n,t,r):Be(e,n,t,r)},Ue=function(){var e={},t=ue.a.location.search;if(!t)return{};if(""!=t){var n=t.substr(1).split("&");for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(r=n[r].split("="),e[decodeURIComponent(r[0])]=r[1]&&decodeURIComponent(r[1])||"")}return e},qe=function(t){return(t instanceof e?t:e.from(t.toString(),"utf-8")).toString("base64")},Ve={operationsSorter:{alpha:function(e,t){return e.get("path").localeCompare(t.get("path"))},method:function(e,t){return e.get("method").localeCompare(t.get("method"))}},tagsSorter:{alpha:function(e,t){return e.localeCompare(t)}}},We=function(e){var t=[];for(var n in e){var r=e[n];void 0!==r&&""!==r&&t.push([n,"=",encodeURIComponent(r).replace(/%20/g,"+")].join(""))}return t.join("&")},He=function(e,t,n){return!!X()(n,(function(n){return re()(e[n],t[n])}))};function $e(e){return"string"!=typeof e||""===e?"":Object(H.sanitizeUrl)(e)}function Je(e){return!(!e||D()(e).call(e,"localhost")>=0||D()(e).call(e,"127.0.0.1")>=0||"none"===e)}function Ke(e){if(!W.a.OrderedMap.isOrderedMap(e))return null;if(!e.size)return null;var t=B()(e).call(e,(function(e,t){return z()(t).call(t,"2")&&_()(e.get("content")||{}).length>0})),n=e.get("default")||W.a.OrderedMap(),r=(n.get("content")||W.a.OrderedMap()).keySeq().toJS().length?n:null;return t||r}var Ye=function(e){return"string"==typeof e||e instanceof String?q()(e).call(e).replace(/\s/g,"%20"):""},Ge=function(e){return ce()(Ye(e).replace(/%20/g,"_"))},Qe=function(e){return w()(e).call(e,(function(e,t){return/^x-/.test(t)}))},Ze=function(e){return w()(e).call(e,(function(e,t){return/^pattern|maxLength|minLength|maximum|minimum/.test(t)}))};function Xe(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){return!0};if("object"!==i()(e)||l()(e)||null===e||!t)return e;var o=A()({},e);return y()(n=_()(o)).call(n,(function(e){e===t&&r(o[e],e)?delete o[e]:o[e]=Xe(o[e],t,r)})),o}function et(e){if("string"==typeof e)return e;if(e&&e.toJS&&(e=e.toJS()),"object"===i()(e)&&null!==e)try{return M()(e,null,2)}catch(t){return String(e)}return null==e?"":e.toString()}function tt(e){return"number"==typeof e?e.toString():e}function nt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.returnAll,r=void 0!==n&&n,o=t.allowHashes,a=void 0===o||o;if(!W.a.Map.isMap(e))throw new Error("paramToIdentifier: received a non-Im.Map parameter as input");var i,u,s,c=e.get("name"),l=e.get("in"),f=[];e&&e.hashCode&&l&&c&&a&&f.push(v()(i=v()(u="".concat(l,".")).call(u,c,".hash-")).call(i,e.hashCode()));l&&c&&f.push(v()(s="".concat(l,".")).call(s,c));return f.push(c),r?f:f[0]||""}function rt(e,t){var n,r=nt(e,{returnAll:!0});return w()(n=p()(r).call(r,(function(e){return t[e]}))).call(n,(function(e){return void 0!==e}))[0]}function ot(){return it(pe()(32).toString("base64"))}function at(e){return it(de()("sha256").update(e).digest("base64"))}function it(e){return e.replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}var ut=function(e){return!e||!(!ge(e)||!e.isEmpty())}}).call(this,n(132).Buffer)},function(e,t){e.exports=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var r=n(184);function o(e,t){for(var n=0;n-1){var a=n[o];return o>0&&(n.splice(o,1),n.unshift(a)),a.value}return r}return{get:o,put:function(t,a){o(t)===r&&(n.unshift({key:t,value:a}),n.length>e&&n.pop())},getEntries:function(){return n},clear:function(){n=[]}}}(l,p);function d(){var t=h.get(arguments);if(t===r){if(t=e.apply(null,arguments),f){var n=h.getEntries(),o=n.find((function(e){return f(e.value,t)}));o&&(t=o.value)}h.put(arguments,t)}return t}return d.clearCache=function(){return h.clear()},d}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return"function"==typeof e?"function "+(e.name||"unnamed")+"()":typeof e})).join(", ");throw new Error("createSelector expects all input-selectors to be functions, but received the following types: ["+n+"]")}return t}function u(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r>",i=function(){invariant(!1,"ImmutablePropTypes type checking code is stripped in production.")};i.isRequired=i;var u=function(){return i};function s(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":e instanceof o.Iterable?"Immutable."+e.toSource().split(" ")[0]:t}function c(e){function t(t,n,r,o,i,u){for(var s=arguments.length,c=Array(s>6?s-6:0),l=6;l4)}function l(e){var t=e.get("swagger");return"string"==typeof t&&i()(t).call(t,"2.0")}function f(e){return function(t,n){return function(r){return n&&n.specSelectors&&n.specSelectors.specJson?c(n.specSelectors.specJson())?s.a.createElement(e,o()({},r,n,{Ori:t})):s.a.createElement(t,r):(console.warn("OAS3 wrapper: couldn't get spec"),null)}}}},function(e,t,n){var r=n(17),o=n(221),a=n(43),i=n(176),u=n(219),s=n(334),c=o("wks"),l=r.Symbol,f=l&&l.for,p=s?l:l&&l.withoutSetter||i;e.exports=function(e){if(!a(c,e)||!u&&"string"!=typeof c[e]){var t="Symbol."+e;u&&a(l,e)?c[e]=l[e]:c[e]=s&&f?f(t):p(t)}return c[e]}},function(e,t,n){var r=n(34);e.exports=function(e){return r[e+"Prototype"]}},function(e,t,n){var r=n(246);e.exports=function(e,t,n){var o=null==e?void 0:r(e,t);return void 0===o?n:o}},function(e,t,n){e.exports=n(865)},function(e,t){e.exports=function(e){return"function"==typeof e}},function(e,t,n){var r=n(41);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},function(e,t,n){var r=n(28),o=n(58),a=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return a(o(e),t)}},function(e,t,n){var r=n(34),o=n(43),a=n(231),i=n(59).f;e.exports=function(e){var t=r.Symbol||(r.Symbol={});o(t,e)||i(t,e,{value:a.f(e)})}},function(e,t,n){e.exports=n(546)},function(e,t,n){var r=n(32);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SPEC",(function(){return ee})),n.d(t,"UPDATE_URL",(function(){return te})),n.d(t,"UPDATE_JSON",(function(){return ne})),n.d(t,"UPDATE_PARAM",(function(){return re})),n.d(t,"UPDATE_EMPTY_PARAM_INCLUSION",(function(){return oe})),n.d(t,"VALIDATE_PARAMS",(function(){return ae})),n.d(t,"SET_RESPONSE",(function(){return ie})),n.d(t,"SET_REQUEST",(function(){return ue})),n.d(t,"SET_MUTATED_REQUEST",(function(){return se})),n.d(t,"LOG_REQUEST",(function(){return ce})),n.d(t,"CLEAR_RESPONSE",(function(){return le})),n.d(t,"CLEAR_REQUEST",(function(){return fe})),n.d(t,"CLEAR_VALIDATE_PARAMS",(function(){return pe})),n.d(t,"UPDATE_OPERATION_META_VALUE",(function(){return he})),n.d(t,"UPDATE_RESOLVED",(function(){return de})),n.d(t,"UPDATE_RESOLVED_SUBTREE",(function(){return me})),n.d(t,"SET_SCHEME",(function(){return ve})),n.d(t,"updateSpec",(function(){return ge})),n.d(t,"updateResolved",(function(){return ye})),n.d(t,"updateUrl",(function(){return be})),n.d(t,"updateJsonSpec",(function(){return we})),n.d(t,"parseToJson",(function(){return xe})),n.d(t,"resolveSpec",(function(){return Ee})),n.d(t,"requestResolvedSubtree",(function(){return Ae})),n.d(t,"changeParam",(function(){return Oe})),n.d(t,"changeParamByIdentity",(function(){return Ce})),n.d(t,"updateResolvedSubtree",(function(){return je})),n.d(t,"invalidateResolvedSubtreeCache",(function(){return Te})),n.d(t,"validateParams",(function(){return Pe})),n.d(t,"updateEmptyParamInclusion",(function(){return Ie})),n.d(t,"clearValidateParams",(function(){return Ne})),n.d(t,"changeConsumesValue",(function(){return Me})),n.d(t,"changeProducesValue",(function(){return Re})),n.d(t,"setResponse",(function(){return De})),n.d(t,"setRequest",(function(){return Le})),n.d(t,"setMutatedRequest",(function(){return Be})),n.d(t,"logRequest",(function(){return Fe})),n.d(t,"executeRequest",(function(){return ze})),n.d(t,"execute",(function(){return Ue})),n.d(t,"clearResponse",(function(){return qe})),n.d(t,"clearRequest",(function(){return Ve})),n.d(t,"setScheme",(function(){return We}));var r=n(25),o=n.n(r),a=n(52),i=n.n(a),u=n(73),s=n.n(u),c=n(18),l=n.n(c),f=n(40),p=n.n(f),h=n(24),d=n.n(h),m=n(4),v=n.n(m),g=n(324),y=n.n(g),b=n(30),w=n.n(b),x=n(206),_=n.n(x),E=n(67),S=n.n(E),k=n(12),A=n.n(k),O=n(207),C=n.n(O),j=n(19),T=n.n(j),P=n(22),I=n.n(P),N=n(2),M=n.n(N),R=n(15),D=n.n(R),L=n(23),B=n.n(L),F=n(325),z=n.n(F),U=n(71),q=n(1),V=n(88),W=n.n(V),H=n(140),$=n(463),J=n.n($),K=n(464),Y=n.n(K),G=n(326),Q=n.n(G),Z=n(5),X=["path","method"],ee="spec_update_spec",te="spec_update_url",ne="spec_update_json",re="spec_update_param",oe="spec_update_empty_param_inclusion",ae="spec_validate_param",ie="spec_set_response",ue="spec_set_request",se="spec_set_mutated_request",ce="spec_log_request",le="spec_clear_response",fe="spec_clear_request",pe="spec_clear_validate_param",he="spec_update_operation_meta_value",de="spec_update_resolved",me="spec_update_resolved_subtree",ve="set_scheme";function ge(e){var t,n=(t=e,J()(t)?t:"").replace(/\t/g," ");if("string"==typeof e)return{type:ee,payload:n}}function ye(e){return{type:de,payload:e}}function be(e){return{type:te,payload:e}}function we(e){return{type:ne,payload:e}}var xe=function(e){return function(t){var n=t.specActions,r=t.specSelectors,o=t.errActions,a=r.specStr,i=null;try{e=e||a(),o.clear({source:"parser"}),i=U.a.load(e)}catch(e){return console.error(e),o.newSpecErr({source:"parser",level:"error",message:e.reason,line:e.mark&&e.mark.line?e.mark.line+1:void 0})}return i&&"object"===l()(i)?n.updateJsonSpec(i):{}}},_e=!1,Ee=function(e,t){return function(n){var r=n.specActions,o=n.specSelectors,a=n.errActions,i=n.fn,u=i.fetch,s=i.resolve,c=i.AST,l=void 0===c?{}:c,f=n.getConfigs;_e||(console.warn("specActions.resolveSpec is deprecated since v3.10.0 and will be removed in v4.0.0; use requestResolvedSubtree instead!"),_e=!0);var p=f(),h=p.modelPropertyMacro,m=p.parameterMacro,g=p.requestInterceptor,b=p.responseInterceptor;void 0===e&&(e=o.specJson()),void 0===t&&(t=o.url());var w=l.getLineNumberForPath?l.getLineNumberForPath:function(){},x=o.specStr();return s({fetch:u,spec:e,baseDoc:t,modelPropertyMacro:h,parameterMacro:m,requestInterceptor:g,responseInterceptor:b}).then((function(e){var t=e.spec,n=e.errors;if(a.clear({type:"thrown"}),d()(n)&&n.length>0){var o=v()(n).call(n,(function(e){return console.error(e),e.line=e.fullPath?w(x,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e}));a.newThrownErrBatch(o)}return r.updateResolved(t)}))}},Se=[],ke=Y()(s()(p.a.mark((function e(){var t,n,r,o,a,i,u,c,l,f,h,m,g,b,x,E,k,O;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=Se.system){e.next=4;break}return console.error("debResolveSubtrees: don't have a system to operate on, aborting."),e.abrupt("return");case 4:if(n=t.errActions,r=t.errSelectors,o=t.fn,a=o.resolveSubtree,i=o.fetch,u=o.AST,c=void 0===u?{}:u,l=t.specSelectors,f=t.specActions,a){e.next=8;break}return console.error("Error: Swagger-Client did not provide a `resolveSubtree` method, doing nothing."),e.abrupt("return");case 8:return h=c.getLineNumberForPath?c.getLineNumberForPath:function(){},m=l.specStr(),g=t.getConfigs(),b=g.modelPropertyMacro,x=g.parameterMacro,E=g.requestInterceptor,k=g.responseInterceptor,e.prev=11,e.next=14,w()(Se).call(Se,function(){var e=s()(p.a.mark((function e(t,o){var u,c,f,g,w,O,j,T,P;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t;case 2:return u=e.sent,c=u.resultMap,f=u.specWithCurrentSubtrees,e.next=7,a(f,o,{baseDoc:l.url(),modelPropertyMacro:b,parameterMacro:x,requestInterceptor:E,responseInterceptor:k});case 7:if(g=e.sent,w=g.errors,O=g.spec,r.allErrors().size&&n.clearBy((function(e){var t;return"thrown"!==e.get("type")||"resolver"!==e.get("source")||!_()(t=e.get("fullPath")).call(t,(function(e,t){return e===o[t]||void 0===o[t]}))})),d()(w)&&w.length>0&&(j=v()(w).call(w,(function(e){return e.line=e.fullPath?h(m,e.fullPath):null,e.path=e.fullPath?e.fullPath.join("."):null,e.level="error",e.type="thrown",e.source="resolver",y()(e,"message",{enumerable:!0,value:e.message}),e})),n.newThrownErrBatch(j)),!O||!l.isOAS3()||"components"!==o[0]||"securitySchemes"!==o[1]){e.next=15;break}return e.next=15,S.a.all(v()(T=A()(P=C()(O)).call(P,(function(e){return"openIdConnect"===e.type}))).call(T,function(){var e=s()(p.a.mark((function e(t){var n,r;return p.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n={url:t.openIdConnectUrl,requestInterceptor:E,responseInterceptor:k},e.prev=1,e.next=4,i(n);case 4:(r=e.sent)instanceof Error||r.status>=400?console.error(r.statusText+" "+n.url):t.openIdConnectData=JSON.parse(r.text),e.next=11;break;case 8:e.prev=8,e.t0=e.catch(1),console.error(e.t0);case 11:case"end":return e.stop()}}),e,null,[[1,8]])})));return function(t){return e.apply(this,arguments)}}()));case 15:return Q()(c,o,O),Q()(f,o,O),e.abrupt("return",{resultMap:c,specWithCurrentSubtrees:f});case 18:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),S.a.resolve({resultMap:(l.specResolvedSubtree([])||Object(q.Map)()).toJS(),specWithCurrentSubtrees:l.specJson().toJS()}));case 14:O=e.sent,delete Se.system,Se=[],e.next=22;break;case 19:e.prev=19,e.t0=e.catch(11),console.error(e.t0);case 22:f.updateResolvedSubtree([],O.resultMap);case 23:case"end":return e.stop()}}),e,null,[[11,19]])}))),35),Ae=function(e){return function(t){var n;T()(n=v()(Se).call(Se,(function(e){return e.join("@@")}))).call(n,e.join("@@"))>-1||(Se.push(e),Se.system=t,ke())}};function Oe(e,t,n,r,o){return{type:re,payload:{path:e,value:r,paramName:t,paramIn:n,isXml:o}}}function Ce(e,t,n,r){return{type:re,payload:{path:e,param:t,value:n,isXml:r}}}var je=function(e,t){return{type:me,payload:{path:e,value:t}}},Te=function(){return{type:me,payload:{path:[],value:Object(q.Map)()}}},Pe=function(e,t){return{type:ae,payload:{pathMethod:e,isOAS3:t}}},Ie=function(e,t,n,r){return{type:oe,payload:{pathMethod:e,paramName:t,paramIn:n,includeEmptyValue:r}}};function Ne(e){return{type:pe,payload:{pathMethod:e}}}function Me(e,t){return{type:he,payload:{path:e,value:t,key:"consumes_value"}}}function Re(e,t){return{type:he,payload:{path:e,value:t,key:"produces_value"}}}var De=function(e,t,n){return{payload:{path:e,method:t,res:n},type:ie}},Le=function(e,t,n){return{payload:{path:e,method:t,req:n},type:ue}},Be=function(e,t,n){return{payload:{path:e,method:t,req:n},type:se}},Fe=function(e){return{payload:e,type:ce}},ze=function(e){return function(t){var n,r,o=t.fn,a=t.specActions,i=t.specSelectors,u=t.getConfigs,c=t.oas3Selectors,l=e.pathName,f=e.method,h=e.operation,m=u(),g=m.requestInterceptor,y=m.responseInterceptor,b=h.toJS();h&&h.get("parameters")&&I()(n=A()(r=h.get("parameters")).call(r,(function(e){return e&&!0===e.get("allowEmptyValue")}))).call(n,(function(t){if(i.parameterInclusionSettingFor([l,f],t.get("name"),t.get("in"))){e.parameters=e.parameters||{};var n=Object(Z.B)(t,e.parameters);(!n||n&&0===n.size)&&(e.parameters[t.get("name")]="")}}));if(e.contextUrl=W()(i.url()).toString(),b&&b.operationId?e.operationId=b.operationId:b&&l&&f&&(e.operationId=o.opId(b,l,f)),i.isOAS3()){var w,x=M()(w="".concat(l,":")).call(w,f);e.server=c.selectedServer(x)||c.selectedServer();var _=c.serverVariables({server:e.server,namespace:x}).toJS(),E=c.serverVariables({server:e.server}).toJS();e.serverVariables=D()(_).length?_:E,e.requestContentType=c.requestContentType(l,f),e.responseContentType=c.responseContentType(l,f)||"*/*";var S,k=c.requestBodyValue(l,f),O=c.requestBodyInclusionSetting(l,f);if(k&&k.toJS)e.requestBody=A()(S=v()(k).call(k,(function(e){return q.Map.isMap(e)?e.get("value"):e}))).call(S,(function(e,t){return(d()(e)?0!==e.length:!Object(Z.q)(e))||O.get(t)})).toJS();else e.requestBody=k}var C=B()({},e);C=o.buildRequest(C),a.setRequest(e.pathName,e.method,C);var j=function(){var t=s()(p.a.mark((function t(n){var r,o;return p.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,g.apply(undefined,[n]);case 2:return r=t.sent,o=B()({},r),a.setMutatedRequest(e.pathName,e.method,o),t.abrupt("return",r);case 6:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}();e.requestInterceptor=j,e.responseInterceptor=y;var T=z()();return o.execute(e).then((function(t){t.duration=z()()-T,a.setResponse(e.pathName,e.method,t)})).catch((function(t){"Failed to fetch"===t.message&&(t.name="",t.message='**Failed to fetch.** \n**Possible Reasons:** \n - CORS \n - Network Failure \n - URL scheme must be "http" or "https" for CORS request.'),a.setResponse(e.pathName,e.method,{error:!0,err:Object(H.serializeError)(t)})}))}},Ue=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.path,n=e.method,r=i()(e,X);return function(e){var a=e.fn.fetch,i=e.specSelectors,u=e.specActions,s=i.specJsonWithResolvedSubtrees().toJS(),c=i.operationScheme(t,n),l=i.contentTypeValues([t,n]).toJS(),f=l.requestContentType,p=l.responseContentType,h=/xml/i.test(f),d=i.parameterValues([t,n],h).toJS();return u.executeRequest(o()(o()({},r),{},{fetch:a,spec:s,pathName:t,method:n,parameters:d,requestContentType:f,scheme:c,responseContentType:p}))}};function qe(e,t){return{type:le,payload:{path:e,method:t}}}function Ve(e,t){return{type:fe,payload:{path:e,method:t}}}function We(e,t,n){return{type:ve,payload:{scheme:e,path:t,method:n}}}},function(e,t,n){var r;!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=e.length?{done:!0}:{done:!1,value:e[u++]}},e:function(e){throw e},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var c,l=!0,f=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return l=e.done,e},e:function(e){f=!0,c=e},f:function(){try{l||null==n.return||n.return()}finally{if(f)throw c}}}},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){var r=n(17),o=n(42),a=r.String,i=r.TypeError;e.exports=function(e){if(o(e))return e;throw i(a(e)+" is not an object")}},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){var r=n(428),o=n(430),a=n(843);e.exports=function(e,t){if(null==e)return{};var n,i,u=a(e,t);if(r){var s=r(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(u[n]=e[n])}return u},e.exports.__esModule=!0,e.exports.default=e.exports},function(e,t,n){"use strict";n.r(t),n.d(t,"UPDATE_SELECTED_SERVER",(function(){return r})),n.d(t,"UPDATE_REQUEST_BODY_VALUE",(function(){return o})),n.d(t,"UPDATE_REQUEST_BODY_VALUE_RETAIN_FLAG",(function(){return a})),n.d(t,"UPDATE_REQUEST_BODY_INCLUSION",(function(){return i})),n.d(t,"UPDATE_ACTIVE_EXAMPLES_MEMBER",(function(){return u})),n.d(t,"UPDATE_REQUEST_CONTENT_TYPE",(function(){return s})),n.d(t,"UPDATE_RESPONSE_CONTENT_TYPE",(function(){return c})),n.d(t,"UPDATE_SERVER_VARIABLE_VALUE",(function(){return l})),n.d(t,"SET_REQUEST_BODY_VALIDATE_ERROR",(function(){return f})),n.d(t,"CLEAR_REQUEST_BODY_VALIDATE_ERROR",(function(){return p})),n.d(t,"CLEAR_REQUEST_BODY_VALUE",(function(){return h})),n.d(t,"setSelectedServer",(function(){return d})),n.d(t,"setRequestBodyValue",(function(){return m})),n.d(t,"setRetainRequestBodyValueFlag",(function(){return v})),n.d(t,"setRequestBodyInclusion",(function(){return g})),n.d(t,"setActiveExamplesMember",(function(){return y})),n.d(t,"setRequestContentType",(function(){return b})),n.d(t,"setResponseContentType",(function(){return w})),n.d(t,"setServerVariableValue",(function(){return x})),n.d(t,"setRequestBodyValidateError",(function(){return _})),n.d(t,"clearRequestBodyValidateError",(function(){return E})),n.d(t,"initRequestBodyValidateError",(function(){return S})),n.d(t,"clearRequestBodyValue",(function(){return k}));var r="oas3_set_servers",o="oas3_set_request_body_value",a="oas3_set_request_body_retain_flag",i="oas3_set_request_body_inclusion",u="oas3_set_active_examples_member",s="oas3_set_request_content_type",c="oas3_set_response_content_type",l="oas3_set_server_variable_value",f="oas3_set_request_body_validate_error",p="oas3_clear_request_body_validate_error",h="oas3_clear_request_body_value";function d(e,t){return{type:r,payload:{selectedServerUrl:e,namespace:t}}}function m(e){var t=e.value,n=e.pathMethod;return{type:o,payload:{value:t,pathMethod:n}}}var v=function(e){var t=e.value,n=e.pathMethod;return{type:a,payload:{value:t,pathMethod:n}}};function g(e){var t=e.value,n=e.pathMethod,r=e.name;return{type:i,payload:{value:t,pathMethod:n,name:r}}}function y(e){var t=e.name,n=e.pathMethod,r=e.contextType,o=e.contextName;return{type:u,payload:{name:t,pathMethod:n,contextType:r,contextName:o}}}function b(e){var t=e.value,n=e.pathMethod;return{type:s,payload:{value:t,pathMethod:n}}}function w(e){var t=e.value,n=e.path,r=e.method;return{type:c,payload:{value:t,path:n,method:r}}}function x(e){var t=e.server,n=e.namespace,r=e.key,o=e.val;return{type:l,payload:{server:t,namespace:n,key:r,val:o}}}var _=function(e){var t=e.path,n=e.method,r=e.validationErrors;return{type:f,payload:{path:t,method:n,validationErrors:r}}},E=function(e){var t=e.path,n=e.method;return{type:p,payload:{path:t,method:n}}},S=function(e){var t=e.pathMethod;return{type:p,payload:{path:t[0],method:t[1]}}},k=function(e){var t=e.pathMethod;return{type:h,payload:{pathMethod:t}}}},function(e,t,n){var r=n(148),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},function(e,t,n){e.exports=n(662)},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){var r=n(34),o=n(17),a=n(41),i=function(e){return a(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e])||i(o[e]):r[e]&&r[e][t]||o[e]&&o[e][t]}},function(e,t,n){var r=n(17),o=n(111),a=r.Object;e.exports=function(e){return a(o(e))}},function(e,t,n){var r=n(17),o=n(46),a=n(335),i=n(337),u=n(50),s=n(174),c=r.TypeError,l=Object.defineProperty,f=Object.getOwnPropertyDescriptor,p="enumerable",h="configurable",d="writable";t.f=o?i?function(e,t,n){if(u(e),t=s(t),u(n),"function"==typeof e&&"prototype"===t&&"value"in n&&d in n&&!n.writable){var r=f(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:h in n?n.configurable:r.configurable,enumerable:p in n?n.enumerable:r.enumerable,writable:!1})}return l(e,t,n)}:l:function(e,t,n){if(u(e),t=s(t),u(n),a)try{return l(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";n.d(t,"b",(function(){return m})),n.d(t,"e",(function(){return v})),n.d(t,"c",(function(){return y})),n.d(t,"a",(function(){return b})),n.d(t,"d",(function(){return w}));var r=n(49),o=n.n(r),a=n(18),i=n.n(a),u=n(106),s=n.n(u),c=n(2),l=n.n(c),f=n(31),p=n.n(f),h=function(e){return String.prototype.toLowerCase.call(e)},d=function(e){return e.replace(/[^\w]/gi,"_")};function m(e){var t=e.openapi;return!!t&&s()(t).call(t,"3")}function v(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},o=r.v2OperationIdCompatibilityMode;if(!e||"object"!==i()(e))return null;var a=(e.operationId||"").replace(/\s/g,"");return a.length?d(e.operationId):g(t,n,{v2OperationIdCompatibilityMode:o})}function g(e,t){var n,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=r.v2OperationIdCompatibilityMode;if(o){var a,i,u=l()(a="".concat(t.toLowerCase(),"_")).call(a,e).replace(/[\s!@#$%^&*()_+=[{\]};:<>|./?,\\'""-]/g,"_");return(u=u||l()(i="".concat(e.substring(1),"_")).call(i,t)).replace(/((_){2,})/g,"_").replace(/^(_)*/g,"").replace(/([_])*$/g,"")}return l()(n="".concat(h(t))).call(n,d(e))}function y(e,t){var n;return l()(n="".concat(h(t),"-")).call(n,e)}function b(e,t){return e&&e.paths?function(e,t){return function(e,t,n){if(!e||"object"!==i()(e)||!e.paths||"object"!==i()(e.paths))return null;var r=e.paths;for(var o in r)for(var a in r[o])if("PARAMETERS"!==a.toUpperCase()){var u=r[o][a];if(u&&"object"===i()(u)){var s={spec:e,pathName:o,method:a.toUpperCase(),operation:u},c=t(s);if(n&&c)return s}}return}(e,t,!0)||null}(e,(function(e){var n=e.pathName,r=e.method,o=e.operation;if(!o||"object"!==i()(o))return!1;var a=o.operationId;return[v(o,n,r),y(n,r),a].some((function(e){return e&&e===t}))})):null}function w(e){var t=e.spec,n=t.paths,r={};if(!n||t.$$normalized)return e;for(var a in n){var u,s=n[a];if(null!=s&&p()(u=["object","function"]).call(u,i()(s))){var c=s.parameters,f=function(e){var n,u=s[e];if(null==u||!p()(n=["object","function"]).call(n,i()(u)))return"continue";var f=v(u,a,e);if(f){r[f]?r[f].push(u):r[f]=[u];var h=r[f];if(h.length>1)h.forEach((function(e,t){var n;e.__originalOperationId=e.__originalOperationId||e.operationId,e.operationId=l()(n="".concat(f)).call(n,t+1)}));else if(void 0!==u.operationId){var d=h[0];d.__originalOperationId=d.__originalOperationId||u.operationId,d.operationId=f}}if("parameters"!==e){var m=[],g={};for(var y in t)"produces"!==y&&"consumes"!==y&&"security"!==y||(g[y]=t[y],m.push(g));if(c&&(g.parameters=c,m.push(g)),m.length){var b,w=o()(m);try{for(w.s();!(b=w.n()).done;){var x=b.value;for(var _ in x)if(u[_]){if("parameters"===_){var E,S=o()(x[_]);try{var k=function(){var e=E.value;u[_].some((function(t){return t.name&&t.name===e.name||t.$ref&&t.$ref===e.$ref||t.$$ref&&t.$$ref===e.$$ref||t===e}))||u[_].push(e)};for(S.s();!(E=S.n()).done;)k()}catch(e){S.e(e)}finally{S.f()}}}else u[_]=x[_]}}catch(e){w.e(e)}finally{w.f()}}}};for(var h in s)f(h)}}return t.$$normalized=!0,e}},function(e,t,n){"use strict";n.r(t),n.d(t,"NEW_THROWN_ERR",(function(){return o})),n.d(t,"NEW_THROWN_ERR_BATCH",(function(){return a})),n.d(t,"NEW_SPEC_ERR",(function(){return i})),n.d(t,"NEW_SPEC_ERR_BATCH",(function(){return u})),n.d(t,"NEW_AUTH_ERR",(function(){return s})),n.d(t,"CLEAR",(function(){return c})),n.d(t,"CLEAR_BY",(function(){return l})),n.d(t,"newThrownErr",(function(){return f})),n.d(t,"newThrownErrBatch",(function(){return p})),n.d(t,"newSpecErr",(function(){return h})),n.d(t,"newSpecErrBatch",(function(){return d})),n.d(t,"newAuthErr",(function(){return m})),n.d(t,"clear",(function(){return v})),n.d(t,"clearBy",(function(){return g}));var r=n(140),o="err_new_thrown_err",a="err_new_thrown_err_batch",i="err_new_spec_err",u="err_new_spec_err_batch",s="err_new_auth_err",c="err_clear",l="err_clear_by";function f(e){return{type:o,payload:Object(r.serializeError)(e)}}function p(e){return{type:a,payload:e}}function h(e){return{type:i,payload:e}}function d(e){return{type:u,payload:e}}function m(e){return{type:s,payload:e}}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{type:c,payload:e}}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!0};return{type:l,payload:e}}},function(e,t,n){var r=n(173),o=n(111);e.exports=function(e){return r(o(e))}},function(e,t,n){var r=n(338);e.exports=function(e){return r(e.length)}},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t){"function"==typeof Object.create?e.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}},function(e,t,n){var r=n(132),o=r.Buffer;function a(e,t){for(var n in e)t[n]=e[n]}function i(e,t,n){return o(e,t,n)}o.from&&o.alloc&&o.allocUnsafe&&o.allocUnsafeSlow?e.exports=r:(a(r,t),t.Buffer=i),a(o,i),i.from=function(e,t,n){if("number"==typeof e)throw new TypeError("Argument must not be a number");return o(e,t,n)},i.alloc=function(e,t,n){if("number"!=typeof e)throw new TypeError("Argument must be a number");var r=o(e);return void 0!==t?"string"==typeof n?r.fill(t,n):r.fill(t):r.fill(0),r},i.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return o(e)},i.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}},function(e,t,n){e.exports=n(431)},function(e,t,n){var r=n(17),o=n(75),a=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return a(e)}},function(e,t,n){n(77);var r=n(516),o=n(17),a=n(75),i=n(85),u=n(130),s=n(37)("toStringTag");for(var c in r){var l=o[c],f=l&&l.prototype;f&&a(f)!==s&&i(f,s,c),u[c]=u.Array}},function(e,t,n){var r=n(361),o="object"==typeof self&&self&&self.Object===Object&&self,a=r||o||Function("return this")();e.exports=a},function(e,t,n){"use strict";function r(e){return null==e}var o={isNothing:r,isObject:function(e){return"object"==typeof e&&null!==e},toArray:function(e){return Array.isArray(e)?e:r(e)?[]:[e]},repeat:function(e,t){var n,r="";for(n=0;nu&&(t=r-u+(a=" ... ").length),n-r>u&&(n=r+u-(i=" ...").length),{str:a+e.slice(t,n).replace(/\t/g,"→")+i,pos:r-t+a.length}}function c(e,t){return o.repeat(" ",t-e.length)+e}var l=function(e,t){if(t=Object.create(t||null),!e.buffer)return null;t.maxLength||(t.maxLength=79),"number"!=typeof t.indent&&(t.indent=1),"number"!=typeof t.linesBefore&&(t.linesBefore=3),"number"!=typeof t.linesAfter&&(t.linesAfter=2);for(var n,r=/\r?\n|\r|\0/g,a=[0],i=[],u=-1;n=r.exec(e.buffer);)i.push(n.index),a.push(n.index+n[0].length),e.position<=n.index&&u<0&&(u=a.length-2);u<0&&(u=a.length-1);var l,f,p="",h=Math.min(e.line+t.linesAfter,i.length).toString().length,d=t.maxLength-(t.indent+h+3);for(l=1;l<=t.linesBefore&&!(u-l<0);l++)f=s(e.buffer,a[u-l],i[u-l],e.position-(a[u]-a[u-l]),d),p=o.repeat(" ",t.indent)+c((e.line-l+1).toString(),h)+" | "+f.str+"\n"+p;for(f=s(e.buffer,a[u],i[u],e.position,d),p+=o.repeat(" ",t.indent)+c((e.line+1).toString(),h)+" | "+f.str+"\n",p+=o.repeat("-",t.indent+h+3+f.pos)+"^\n",l=1;l<=t.linesAfter&&!(u+l>=i.length);l++)f=s(e.buffer,a[u+l],i[u+l],e.position-(a[u]-a[u+l]),d),p+=o.repeat(" ",t.indent)+c((e.line+l+1).toString(),h)+" | "+f.str+"\n";return p.replace(/\n$/,"")},f=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],p=["scalar","sequence","mapping"];var h=function(e,t){if(t=t||{},Object.keys(t).forEach((function(t){if(-1===f.indexOf(t))throw new u('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')})),this.options=t,this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.representName=t.representName||null,this.defaultStyle=t.defaultStyle||null,this.multi=t.multi||!1,this.styleAliases=function(e){var t={};return null!==e&&Object.keys(e).forEach((function(n){e[n].forEach((function(e){t[String(e)]=n}))})),t}(t.styleAliases||null),-1===p.indexOf(this.kind))throw new u('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')};function d(e,t){var n=[];return e[t].forEach((function(e){var t=n.length;n.forEach((function(n,r){n.tag===e.tag&&n.kind===e.kind&&n.multi===e.multi&&(t=r)})),n[t]=e})),n}function m(e){return this.extend(e)}m.prototype.extend=function(e){var t=[],n=[];if(e instanceof h)n.push(e);else if(Array.isArray(e))n=n.concat(e);else{if(!e||!Array.isArray(e.implicit)&&!Array.isArray(e.explicit))throw new u("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");e.implicit&&(t=t.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit))}t.forEach((function(e){if(!(e instanceof h))throw new u("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(e.loadKind&&"scalar"!==e.loadKind)throw new u("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(e.multi)throw new u("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")})),n.forEach((function(e){if(!(e instanceof h))throw new u("Specified list of YAML types (or a single Type object) contains a non-Type object.")}));var r=Object.create(m.prototype);return r.implicit=(this.implicit||[]).concat(t),r.explicit=(this.explicit||[]).concat(n),r.compiledImplicit=d(r,"implicit"),r.compiledExplicit=d(r,"explicit"),r.compiledTypeMap=function(){var e,t,n={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function r(e){e.multi?(n.multi[e.kind].push(e),n.multi.fallback.push(e)):n[e.kind][e.tag]=n.fallback[e.tag]=e}for(e=0,t=arguments.length;e=0?"0b"+e.toString(2):"-0b"+e.toString(2).slice(1)},octal:function(e){return e>=0?"0o"+e.toString(8):"-0o"+e.toString(8).slice(1)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return e>=0?"0x"+e.toString(16).toUpperCase():"-0x"+e.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),A=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");var O=/^[-+]?[0-9]+e/;var C=new h("tag:yaml.org,2002:float",{kind:"scalar",resolve:function(e){return null!==e&&!(!A.test(e)||"_"===e[e.length-1])},construct:function(e){var t,n;return n="-"===(t=e.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===n?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?NaN:n*parseFloat(t,10)},predicate:function(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!=0||o.isNegativeZero(e))},represent:function(e,t){var n;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(o.isNegativeZero(e))return"-0.0";return n=e.toString(10),O.test(n)?n.replace("e",".e"):n},defaultStyle:"lowercase"}),j=w.extend({implicit:[x,_,k,C]}),T=j,P=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),I=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");var N=new h("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:function(e){return null!==e&&(null!==P.exec(e)||null!==I.exec(e))},construct:function(e){var t,n,r,o,a,i,u,s,c=0,l=null;if(null===(t=P.exec(e))&&(t=I.exec(e)),null===t)throw new Error("Date resolve error");if(n=+t[1],r=+t[2]-1,o=+t[3],!t[4])return new Date(Date.UTC(n,r,o));if(a=+t[4],i=+t[5],u=+t[6],t[7]){for(c=t[7].slice(0,3);c.length<3;)c+="0";c=+c}return t[9]&&(l=6e4*(60*+t[10]+ +(t[11]||0)),"-"===t[9]&&(l=-l)),s=new Date(Date.UTC(n,r,o,a,i,u,c)),l&&s.setTime(s.getTime()-l),s},instanceOf:Date,represent:function(e){return e.toISOString()}});var M=new h("tag:yaml.org,2002:merge",{kind:"scalar",resolve:function(e){return"<<"===e||null===e}}),R="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";var D=new h("tag:yaml.org,2002:binary",{kind:"scalar",resolve:function(e){if(null===e)return!1;var t,n,r=0,o=e.length,a=R;for(n=0;n64)){if(t<0)return!1;r+=6}return r%8==0},construct:function(e){var t,n,r=e.replace(/[\r\n=]/g,""),o=r.length,a=R,i=0,u=[];for(t=0;t>16&255),u.push(i>>8&255),u.push(255&i)),i=i<<6|a.indexOf(r.charAt(t));return 0===(n=o%4*6)?(u.push(i>>16&255),u.push(i>>8&255),u.push(255&i)):18===n?(u.push(i>>10&255),u.push(i>>2&255)):12===n&&u.push(i>>4&255),new Uint8Array(u)},predicate:function(e){return"[object Uint8Array]"===Object.prototype.toString.call(e)},represent:function(e){var t,n,r="",o=0,a=e.length,i=R;for(t=0;t>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]),o=(o<<8)+e[t];return 0===(n=a%3)?(r+=i[o>>18&63],r+=i[o>>12&63],r+=i[o>>6&63],r+=i[63&o]):2===n?(r+=i[o>>10&63],r+=i[o>>4&63],r+=i[o<<2&63],r+=i[64]):1===n&&(r+=i[o>>2&63],r+=i[o<<4&63],r+=i[64],r+=i[64]),r}}),L=Object.prototype.hasOwnProperty,B=Object.prototype.toString;var F=new h("tag:yaml.org,2002:omap",{kind:"sequence",resolve:function(e){if(null===e)return!0;var t,n,r,o,a,i=[],u=e;for(t=0,n=u.length;t>10),56320+(e-65536&1023))}for(var ae=new Array(256),ie=new Array(256),ue=0;ue<256;ue++)ae[ue]=re(ue)?1:0,ie[ue]=re(ue);function se(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||W,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function ce(e,t){var n={name:e.filename,buffer:e.input.slice(0,-1),position:e.position,line:e.line,column:e.position-e.lineStart};return n.snippet=l(n),new u(t,n)}function le(e,t){throw ce(e,t)}function fe(e,t){e.onWarning&&e.onWarning.call(null,ce(e,t))}var pe={YAML:function(e,t,n){var r,o,a;null!==e.version&&le(e,"duplication of %YAML directive"),1!==n.length&&le(e,"YAML directive accepts exactly one argument"),null===(r=/^([0-9]+)\.([0-9]+)$/.exec(n[0]))&&le(e,"ill-formed argument of the YAML directive"),o=parseInt(r[1],10),a=parseInt(r[2],10),1!==o&&le(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=a<2,1!==a&&2!==a&&fe(e,"unsupported YAML version of the document")},TAG:function(e,t,n){var r,o;2!==n.length&&le(e,"TAG directive accepts exactly two arguments"),r=n[0],o=n[1],Y.test(r)||le(e,"ill-formed tag handle (first argument) of the TAG directive"),H.call(e.tagMap,r)&&le(e,'there is a previously declared suffix for "'+r+'" tag handle'),G.test(o)||le(e,"ill-formed tag prefix (second argument) of the TAG directive");try{o=decodeURIComponent(o)}catch(t){le(e,"tag prefix is malformed: "+o)}e.tagMap[r]=o}};function he(e,t,n,r){var o,a,i,u;if(t1&&(e.result+=o.repeat("\n",t-1))}function we(e,t){var n,r,o=e.tag,a=e.anchor,i=[],u=!1;if(-1!==e.firstTabInLine)return!1;for(null!==e.anchor&&(e.anchorMap[e.anchor]=i),r=e.input.charCodeAt(e.position);0!==r&&(-1!==e.firstTabInLine&&(e.position=e.firstTabInLine,le(e,"tab characters must not be used in indentation")),45===r)&&ee(e.input.charCodeAt(e.position+1));)if(u=!0,e.position++,ge(e,!0,-1)&&e.lineIndent<=t)i.push(null),r=e.input.charCodeAt(e.position);else if(n=e.line,Ee(e,t,3,!1,!0),i.push(e.result),ge(e,!0,-1),r=e.input.charCodeAt(e.position),(e.line===n||e.lineIndent>t)&&0!==r)le(e,"bad indentation of a sequence entry");else if(e.lineIndentt?m=1:e.lineIndent===t?m=0:e.lineIndentt?m=1:e.lineIndent===t?m=0:e.lineIndentt)&&(g&&(i=e.line,u=e.lineStart,s=e.position),Ee(e,t,4,!0,o)&&(g?m=e.result:v=e.result),g||(me(e,p,h,d,m,v,i,u,s),d=m=v=null),ge(e,!0,-1),c=e.input.charCodeAt(e.position)),(e.line===a||e.lineIndent>t)&&0!==c)le(e,"bad indentation of a mapping entry");else if(e.lineIndent=0))break;0===a?le(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?le(e,"repeat of an indentation width identifier"):(f=t+a-1,l=!0)}if(X(i)){do{i=e.input.charCodeAt(++e.position)}while(X(i));if(35===i)do{i=e.input.charCodeAt(++e.position)}while(!Z(i)&&0!==i)}for(;0!==i;){for(ve(e),e.lineIndent=0,i=e.input.charCodeAt(e.position);(!l||e.lineIndentf&&(f=e.lineIndent),Z(i))p++;else{if(e.lineIndent0){for(o=i,a=0;o>0;o--)(i=ne(u=e.input.charCodeAt(++e.position)))>=0?a=(a<<4)+i:le(e,"expected hexadecimal character");e.result+=oe(a),e.position++}else le(e,"unknown escape sequence");n=r=e.position}else Z(u)?(he(e,n,r,!0),be(e,ge(e,!1,t)),n=r=e.position):e.position===e.lineStart&&ye(e)?le(e,"unexpected end of the document within a double quoted scalar"):(e.position++,r=e.position)}le(e,"unexpected end of the stream within a double quoted scalar")}(e,h)?g=!0:!function(e){var t,n,r;if(42!==(r=e.input.charCodeAt(e.position)))return!1;for(r=e.input.charCodeAt(++e.position),t=e.position;0!==r&&!ee(r)&&!te(r);)r=e.input.charCodeAt(++e.position);return e.position===t&&le(e,"name of an alias node must contain at least one character"),n=e.input.slice(t,e.position),H.call(e.anchorMap,n)||le(e,'unidentified alias "'+n+'"'),e.result=e.anchorMap[n],ge(e,!0,-1),!0}(e)?function(e,t,n){var r,o,a,i,u,s,c,l,f=e.kind,p=e.result;if(ee(l=e.input.charCodeAt(e.position))||te(l)||35===l||38===l||42===l||33===l||124===l||62===l||39===l||34===l||37===l||64===l||96===l)return!1;if((63===l||45===l)&&(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r)))return!1;for(e.kind="scalar",e.result="",o=a=e.position,i=!1;0!==l;){if(58===l){if(ee(r=e.input.charCodeAt(e.position+1))||n&&te(r))break}else if(35===l){if(ee(e.input.charCodeAt(e.position-1)))break}else{if(e.position===e.lineStart&&ye(e)||n&&te(l))break;if(Z(l)){if(u=e.line,s=e.lineStart,c=e.lineIndent,ge(e,!1,-1),e.lineIndent>=t){i=!0,l=e.input.charCodeAt(e.position);continue}e.position=a,e.line=u,e.lineStart=s,e.lineIndent=c;break}}i&&(he(e,o,a,!1),be(e,e.line-u),o=a=e.position,i=!1),X(l)||(a=e.position+1),l=e.input.charCodeAt(++e.position)}return he(e,o,a,!1),!!e.result||(e.kind=f,e.result=p,!1)}(e,h,1===n)&&(g=!0,null===e.tag&&(e.tag="?")):(g=!0,null===e.tag&&null===e.anchor||le(e,"alias node should not have any properties")),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):0===m&&(g=s&&we(e,d))),null===e.tag)null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);else if("?"===e.tag){for(null!==e.result&&"scalar"!==e.kind&&le(e,'unacceptable node kind for ! tag; it should be "scalar", not "'+e.kind+'"'),c=0,l=e.implicitTypes.length;c"),null!==e.result&&p.kind!==e.kind&&le(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+p.kind+'", not "'+e.kind+'"'),p.resolve(e.result,e.tag)?(e.result=p.construct(e.result,e.tag),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):le(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")}return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||g}function Se(e){var t,n,r,o,a=e.position,i=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap=Object.create(null),e.anchorMap=Object.create(null);0!==(o=e.input.charCodeAt(e.position))&&(ge(e,!0,-1),o=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==o));){for(i=!0,o=e.input.charCodeAt(++e.position),t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);for(r=[],(n=e.input.slice(t,e.position)).length<1&&le(e,"directive name must not be less than one character in length");0!==o;){for(;X(o);)o=e.input.charCodeAt(++e.position);if(35===o){do{o=e.input.charCodeAt(++e.position)}while(0!==o&&!Z(o));break}if(Z(o))break;for(t=e.position;0!==o&&!ee(o);)o=e.input.charCodeAt(++e.position);r.push(e.input.slice(t,e.position))}0!==o&&ve(e),H.call(pe,n)?pe[n](e,n,r):fe(e,'unknown document directive "'+n+'"')}ge(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,ge(e,!0,-1)):i&&le(e,"directives end mark is expected"),Ee(e,e.lineIndent-1,4,!1,!0),ge(e,!0,-1),e.checkLineBreaks&&J.test(e.input.slice(a,e.position))&&fe(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&ye(e)?46===e.input.charCodeAt(e.position)&&(e.position+=3,ge(e,!0,-1)):e.position=55296&&r<=56319&&t+1=56320&&n<=57343?1024*(r-55296)+n-56320+65536:r}function qe(e){return/^\n* /.test(e)}function Ve(e,t,n,r,o,a,i,u){var s,c,l=0,f=null,p=!1,h=!1,d=-1!==r,m=-1,v=Be(c=Ue(e,0))&&c!==je&&!Le(c)&&45!==c&&63!==c&&58!==c&&44!==c&&91!==c&&93!==c&&123!==c&&125!==c&&35!==c&&38!==c&&42!==c&&33!==c&&124!==c&&61!==c&&62!==c&&39!==c&&34!==c&&37!==c&&64!==c&&96!==c&&function(e){return!Le(e)&&58!==e}(Ue(e,e.length-1));if(t||i)for(s=0;s=65536?s+=2:s++){if(!Be(l=Ue(e,s)))return 5;v=v&&ze(l,f,u),f=l}else{for(s=0;s=65536?s+=2:s++){if(10===(l=Ue(e,s)))p=!0,d&&(h=h||s-m-1>r&&" "!==e[m+1],m=s);else if(!Be(l))return 5;v=v&&ze(l,f,u),f=l}h=h||d&&s-m-1>r&&" "!==e[m+1]}return p||h?n>9&&qe(e)?5:i?2===a?5:2:h?4:3:!v||i||o(e)?2===a?5:2:1}function We(e,t,n,r,o){e.dump=function(){if(0===t.length)return 2===e.quotingType?'""':"''";if(!e.noCompatMode&&(-1!==Pe.indexOf(t)||Ie.test(t)))return 2===e.quotingType?'"'+t+'"':"'"+t+"'";var a=e.indent*Math.max(1,n),i=-1===e.lineWidth?-1:Math.max(Math.min(e.lineWidth,40),e.lineWidth-a),s=r||e.flowLevel>-1&&n>=e.flowLevel;switch(Ve(t,s,e.indent,i,(function(t){return function(e,t){var n,r;for(n=0,r=e.implicitTypes.length;n"+He(t,e.indent)+$e(Re(function(e,t){var n,r,o=/(\n+)([^\n]*)/g,a=(u=e.indexOf("\n"),u=-1!==u?u:e.length,o.lastIndex=u,Je(e.slice(0,u),t)),i="\n"===e[0]||" "===e[0];var u;for(;r=o.exec(e);){var s=r[1],c=r[2];n=" "===c[0],a+=s+(i||n||""===c?"":"\n")+Je(c,t),i=n}return a}(t,i),a));case 5:return'"'+function(e){for(var t,n="",r=0,o=0;o=65536?o+=2:o++)r=Ue(e,o),!(t=Te[r])&&Be(r)?(n+=e[o],r>=65536&&(n+=e[o+1])):n+=t||Ne(r);return n}(t)+'"';default:throw new u("impossible error: invalid scalar style")}}()}function He(e,t){var n=qe(e)?String(t):"",r="\n"===e[e.length-1];return n+(r&&("\n"===e[e.length-2]||"\n"===e)?"+":r?"":"-")+"\n"}function $e(e){return"\n"===e[e.length-1]?e.slice(0,-1):e}function Je(e,t){if(""===e||" "===e[0])return e;for(var n,r,o=/ [^ ]/g,a=0,i=0,u=0,s="";n=o.exec(e);)(u=n.index)-a>t&&(r=i>a?i:u,s+="\n"+e.slice(a,r),a=r+1),i=u;return s+="\n",e.length-a>t&&i>a?s+=e.slice(a,i)+"\n"+e.slice(i+1):s+=e.slice(a),s.slice(1)}function Ke(e,t,n,r){var o,a,i,u="",s=e.tag;for(o=0,a=n.length;o tag resolver accepts not "'+c+'" style');r=s.represent[c](t,c)}e.dump=r}return!0}return!1}function Ge(e,t,n,r,o,a,i){e.tag=null,e.dump=n,Ye(e,n,!1)||Ye(e,n,!0);var s,c=Oe.call(e.dump),l=r;r&&(r=e.flowLevel<0||e.flowLevel>t);var f,p,h="[object Object]"===c||"[object Array]"===c;if(h&&(p=-1!==(f=e.duplicates.indexOf(n))),(null!==e.tag&&"?"!==e.tag||p||2!==e.indent&&t>0)&&(o=!1),p&&e.usedDuplicates[f])e.dump="*ref_"+f;else{if(h&&p&&!e.usedDuplicates[f]&&(e.usedDuplicates[f]=!0),"[object Object]"===c)r&&0!==Object.keys(e.dump).length?(!function(e,t,n,r){var o,a,i,s,c,l,f="",p=e.tag,h=Object.keys(n);if(!0===e.sortKeys)h.sort();else if("function"==typeof e.sortKeys)h.sort(e.sortKeys);else if(e.sortKeys)throw new u("sortKeys must be a boolean or a function");for(o=0,a=h.length;o1024)&&(e.dump&&10===e.dump.charCodeAt(0)?l+="?":l+="? "),l+=e.dump,c&&(l+=De(e,t)),Ge(e,t+1,s,!0,c)&&(e.dump&&10===e.dump.charCodeAt(0)?l+=":":l+=": ",f+=l+=e.dump));e.tag=p,e.dump=f||"{}"}(e,t,e.dump,o),p&&(e.dump="&ref_"+f+e.dump)):(!function(e,t,n){var r,o,a,i,u,s="",c=e.tag,l=Object.keys(n);for(r=0,o=l.length;r1024&&(u+="? "),u+=e.dump+(e.condenseFlow?'"':"")+":"+(e.condenseFlow?"":" "),Ge(e,t,i,!1,!1)&&(s+=u+=e.dump));e.tag=c,e.dump="{"+s+"}"}(e,t,e.dump),p&&(e.dump="&ref_"+f+" "+e.dump));else if("[object Array]"===c)r&&0!==e.dump.length?(e.noArrayIndent&&!i&&t>0?Ke(e,t-1,e.dump,o):Ke(e,t,e.dump,o),p&&(e.dump="&ref_"+f+e.dump)):(!function(e,t,n){var r,o,a,i="",u=e.tag;for(r=0,o=n.length;r",e.dump=s+" "+e.dump)}return!0}function Qe(e,t){var n,r,o=[],a=[];for(Ze(e,o,a),n=0,r=a.length;n=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var d=a.Arguments=a.Array;if(o("keys"),o("values"),o("entries"),!c&&l&&"values"!==d.name)try{u(d,"name",{value:"values"})}catch(e){}},function(e,t){e.exports=function(e){return null!=e&&"object"==typeof e}},function(e,t,n){e.exports=n(634)},function(e,t,n){"use strict";var r=n(978),o=n(979);function a(){this.protocol=null,this.slashes=null,this.auth=null,this.host=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.query=null,this.pathname=null,this.path=null,this.href=null}t.parse=b,t.resolve=function(e,t){return b(e,!1,!0).resolve(t)},t.resolveObject=function(e,t){return e?b(e,!1,!0).resolveObject(t):t},t.format=function(e){o.isString(e)&&(e=b(e));return e instanceof a?e.format():a.prototype.format.call(e)},t.Url=a;var i=/^([a-z0-9.+-]+:)/i,u=/:[0-9]*$/,s=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["{","}","|","\\","^","`"].concat(["<",">",'"',"`"," ","\r","\n","\t"]),l=["'"].concat(c),f=["%","/","?",";","#"].concat(l),p=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,d=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,m={javascript:!0,"javascript:":!0},v={javascript:!0,"javascript:":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},y=n(980);function b(e,t,n){if(e&&o.isObject(e)&&e instanceof a)return e;var r=new a;return r.parse(e,t,n),r}a.prototype.parse=function(e,t,n){if(!o.isString(e))throw new TypeError("Parameter 'url' must be a string, not "+typeof e);var a=e.indexOf("?"),u=-1!==a&&a127?N+="x":N+=I[M];if(!N.match(h)){var D=T.slice(0,O),L=T.slice(O+1),B=I.match(d);B&&(D.push(B[1]),L.unshift(B[2])),L.length&&(b="/"+L.join(".")+b),this.hostname=D.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),j||(this.hostname=r.toASCII(this.hostname));var F=this.port?":"+this.port:"",z=this.hostname||"";this.host=z+F,this.href+=this.host,j&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==b[0]&&(b="/"+b))}if(!m[_])for(O=0,P=l.length;O0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift());return n.search=e.search,n.query=e.query,o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.href=n.format(),n}if(!E.length)return n.pathname=null,n.search?n.path="/"+n.search:n.path=null,n.href=n.format(),n;for(var k=E.slice(-1)[0],A=(n.host||e.host||E.length>1)&&("."===k||".."===k)||""===k,O=0,C=E.length;C>=0;C--)"."===(k=E[C])?E.splice(C,1):".."===k?(E.splice(C,1),O++):O&&(E.splice(C,1),O--);if(!x&&!_)for(;O--;O)E.unshift("..");!x||""===E[0]||E[0]&&"/"===E[0].charAt(0)||E.unshift(""),A&&"/"!==E.join("/").substr(-1)&&E.push("");var j,T=""===E[0]||E[0]&&"/"===E[0].charAt(0);S&&(n.hostname=n.host=T?"":E.length?E.shift():"",(j=!!(n.host&&n.host.indexOf("@")>0)&&n.host.split("@"))&&(n.auth=j.shift(),n.host=n.hostname=j.shift()));return(x=x||n.host&&E.length)&&!T&&E.unshift(""),E.length?n.pathname=E.join("/"):(n.pathname=null,n.path=null),o.isNull(n.pathname)&&o.isNull(n.search)||(n.path=(n.pathname?n.pathname:"")+(n.search?n.search:"")),n.auth=e.auth||n.auth,n.slashes=n.slashes||e.slashes,n.href=n.format(),n},a.prototype.parseHost=function(){var e=this.host,t=u.exec(e);t&&(":"!==(t=t[0])&&(this.port=t.substr(1)),e=e.substr(0,e.length-t.length)),e&&(this.hostname=e)}},function(e,t,n){"use strict";n.r(t),n.d(t,"SHOW_AUTH_POPUP",(function(){return h})),n.d(t,"AUTHORIZE",(function(){return d})),n.d(t,"LOGOUT",(function(){return m})),n.d(t,"PRE_AUTHORIZE_OAUTH2",(function(){return v})),n.d(t,"AUTHORIZE_OAUTH2",(function(){return g})),n.d(t,"VALIDATE",(function(){return y})),n.d(t,"CONFIGURE_AUTH",(function(){return b})),n.d(t,"RESTORE_AUTHORIZATION",(function(){return w})),n.d(t,"showDefinitions",(function(){return x})),n.d(t,"authorize",(function(){return _})),n.d(t,"authorizeWithPersistOption",(function(){return E})),n.d(t,"logout",(function(){return S})),n.d(t,"logoutWithPersistOption",(function(){return k})),n.d(t,"preAuthorizeImplicit",(function(){return A})),n.d(t,"authorizeOauth2",(function(){return O})),n.d(t,"authorizeOauth2WithPersistOption",(function(){return C})),n.d(t,"authorizePassword",(function(){return j})),n.d(t,"authorizeApplication",(function(){return T})),n.d(t,"authorizeAccessCodeWithFormParams",(function(){return P})),n.d(t,"authorizeAccessCodeWithBasicAuthentication",(function(){return I})),n.d(t,"authorizeRequest",(function(){return N})),n.d(t,"configureAuth",(function(){return M})),n.d(t,"restoreAuthorization",(function(){return R})),n.d(t,"persistAuthorizationIfNeeded",(function(){return D}));var r=n(18),o=n.n(r),a=n(33),i=n.n(a),u=n(23),s=n.n(u),c=n(88),l=n.n(c),f=n(27),p=n(5),h="show_popup",d="authorize",m="logout",v="pre_authorize_oauth2",g="authorize_oauth2",y="validate",b="configure_auth",w="restore_authorization";function x(e){return{type:h,payload:e}}function _(e){return{type:d,payload:e}}var E=function(e){return function(t){var n=t.authActions;n.authorize(e),n.persistAuthorizationIfNeeded()}};function S(e){return{type:m,payload:e}}var k=function(e){return function(t){var n=t.authActions;n.logout(e),n.persistAuthorizationIfNeeded()}},A=function(e){return function(t){var n=t.authActions,r=t.errActions,o=e.auth,a=e.token,u=e.isValid,s=o.schema,c=o.name,l=s.get("flow");delete f.a.swaggerUIRedirectOauth2,"accessCode"===l||u||r.newAuthErr({authId:c,source:"auth",level:"warning",message:"Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"}),a.error?r.newAuthErr({authId:c,source:"auth",level:"error",message:i()(a)}):n.authorizeOauth2WithPersistOption({auth:o,token:a})}};function O(e){return{type:g,payload:e}}var C=function(e){return function(t){var n=t.authActions;n.authorizeOauth2(e),n.persistAuthorizationIfNeeded()}},j=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.name,a=e.username,i=e.password,u=e.passwordType,c=e.clientId,l=e.clientSecret,f={grant_type:"password",scope:e.scopes.join(" "),username:a,password:i},h={};switch(u){case"request-body":!function(e,t,n){t&&s()(e,{client_id:t});n&&s()(e,{client_secret:n})}(f,c,l);break;case"basic":h.Authorization="Basic "+Object(p.a)(c+":"+l);break;default:console.warn("Warning: invalid passwordType ".concat(u," was passed, not including client id and secret"))}return n.authorizeRequest({body:Object(p.b)(f),url:r.get("tokenUrl"),name:o,headers:h,query:{},auth:e})}};var T=function(e){return function(t){var n=t.authActions,r=e.schema,o=e.scopes,a=e.name,i=e.clientId,u=e.clientSecret,s={Authorization:"Basic "+Object(p.a)(i+":"+u)},c={grant_type:"client_credentials",scope:o.join(" ")};return n.authorizeRequest({body:Object(p.b)(c),name:a,url:r.get("tokenUrl"),auth:e,headers:s})}},P=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,u=t.clientSecret,s=t.codeVerifier,c={grant_type:"authorization_code",code:t.code,client_id:i,client_secret:u,redirect_uri:n,code_verifier:s};return r.authorizeRequest({body:Object(p.b)(c),name:a,url:o.get("tokenUrl"),auth:t})}},I=function(e){var t=e.auth,n=e.redirectUrl;return function(e){var r=e.authActions,o=t.schema,a=t.name,i=t.clientId,u=t.clientSecret,s=t.codeVerifier,c={Authorization:"Basic "+Object(p.a)(i+":"+u)},l={grant_type:"authorization_code",code:t.code,client_id:i,redirect_uri:n,code_verifier:s};return r.authorizeRequest({body:Object(p.b)(l),name:a,url:o.get("tokenUrl"),auth:t,headers:c})}},N=function(e){return function(t){var n,r=t.fn,a=t.getConfigs,u=t.authActions,c=t.errActions,f=t.oas3Selectors,p=t.specSelectors,h=t.authSelectors,d=e.body,m=e.query,v=void 0===m?{}:m,g=e.headers,y=void 0===g?{}:g,b=e.name,w=e.url,x=e.auth,_=(h.getConfigs()||{}).additionalQueryStringParams;if(p.isOAS3()){var E=f.serverEffectiveValue(f.selectedServer());n=l()(w,E,!0)}else n=l()(w,p.url(),!0);"object"===o()(_)&&(n.query=s()({},n.query,_));var S=n.toString(),k=s()({Accept:"application/json, text/plain, */*","Content-Type":"application/x-www-form-urlencoded","X-Requested-With":"XMLHttpRequest"},y);r.fetch({url:S,method:"post",headers:k,query:v,body:d,requestInterceptor:a().requestInterceptor,responseInterceptor:a().responseInterceptor}).then((function(e){var t=JSON.parse(e.data),n=t&&(t.error||""),r=t&&(t.parseError||"");e.ok?n||r?c.newAuthErr({authId:b,level:"error",source:"auth",message:i()(t)}):u.authorizeOauth2WithPersistOption({auth:x,token:t}):c.newAuthErr({authId:b,level:"error",source:"auth",message:e.statusText})})).catch((function(e){var t=new Error(e).message;if(e.response&&e.response.data){var n=e.response.data;try{var r="string"==typeof n?JSON.parse(n):n;r.error&&(t+=", error: ".concat(r.error)),r.error_description&&(t+=", description: ".concat(r.error_description))}catch(e){}}c.newAuthErr({authId:b,level:"error",source:"auth",message:t})}))}};function M(e){return{type:b,payload:e}}function R(e){return{type:w,payload:e}}var D=function(){return function(e){var t=e.authSelectors;if((0,e.getConfigs)().persistAuthorization){var n=t.authorized();localStorage.setItem("authorized",i()(n.toJS()))}}}},function(e,t,n){var r=n(950);e.exports=function(e){for(var t=1;tS;S++)if((h||S in x)&&(b=_(y=x[S],S,w),e))if(t)A[S]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return S;case 2:c(A,y)}else switch(e){case 4:return!1;case 7:c(A,y)}return f?-1:o||l?l:A}};e.exports={forEach:l(0),map:l(1),filter:l(2),some:l(3),every:l(4),find:l(5),findIndex:l(6),filterReject:l(7)}},function(e,t,n){"use strict";n.r(t),n.d(t,"lastError",(function(){return M})),n.d(t,"url",(function(){return R})),n.d(t,"specStr",(function(){return D})),n.d(t,"specSource",(function(){return L})),n.d(t,"specJson",(function(){return B})),n.d(t,"specResolved",(function(){return F})),n.d(t,"specResolvedSubtree",(function(){return z})),n.d(t,"specJsonWithResolvedSubtrees",(function(){return q})),n.d(t,"spec",(function(){return V})),n.d(t,"isOAS3",(function(){return W})),n.d(t,"info",(function(){return H})),n.d(t,"externalDocs",(function(){return $})),n.d(t,"version",(function(){return J})),n.d(t,"semver",(function(){return K})),n.d(t,"paths",(function(){return Y})),n.d(t,"operations",(function(){return G})),n.d(t,"consumes",(function(){return Q})),n.d(t,"produces",(function(){return Z})),n.d(t,"security",(function(){return X})),n.d(t,"securityDefinitions",(function(){return ee})),n.d(t,"findDefinition",(function(){return te})),n.d(t,"definitions",(function(){return ne})),n.d(t,"basePath",(function(){return re})),n.d(t,"host",(function(){return oe})),n.d(t,"schemes",(function(){return ae})),n.d(t,"operationsWithRootInherited",(function(){return ie})),n.d(t,"tags",(function(){return ue})),n.d(t,"tagDetails",(function(){return se})),n.d(t,"operationsWithTags",(function(){return ce})),n.d(t,"taggedOperations",(function(){return le})),n.d(t,"responses",(function(){return fe})),n.d(t,"requests",(function(){return pe})),n.d(t,"mutatedRequests",(function(){return he})),n.d(t,"responseFor",(function(){return de})),n.d(t,"requestFor",(function(){return me})),n.d(t,"mutatedRequestFor",(function(){return ve})),n.d(t,"allowTryItOutFor",(function(){return ge})),n.d(t,"parameterWithMetaByIdentity",(function(){return ye})),n.d(t,"parameterInclusionSettingFor",(function(){return be})),n.d(t,"parameterWithMeta",(function(){return we})),n.d(t,"operationWithMeta",(function(){return xe})),n.d(t,"getParameter",(function(){return _e})),n.d(t,"hasHost",(function(){return Ee})),n.d(t,"parameterValues",(function(){return Se})),n.d(t,"parametersIncludeIn",(function(){return ke})),n.d(t,"parametersIncludeType",(function(){return Ae})),n.d(t,"contentTypeValues",(function(){return Oe})),n.d(t,"currentProducesFor",(function(){return Ce})),n.d(t,"producesOptionsFor",(function(){return je})),n.d(t,"consumesOptionsFor",(function(){return Te})),n.d(t,"operationScheme",(function(){return Pe})),n.d(t,"canExecuteScheme",(function(){return Ie})),n.d(t,"validateBeforeExecute",(function(){return Ne})),n.d(t,"getOAS3RequiredRequestBodyContentType",(function(){return Me})),n.d(t,"isMediaTypeSchemaPropertiesEqual",(function(){return Re}));var r=n(13),o=n.n(r),a=n(14),i=n.n(a),u=n(2),s=n.n(u),c=n(20),l=n.n(c),f=n(22),p=n.n(f),h=n(19),d=n.n(h),m=n(4),v=n.n(m),g=n(12),y=n.n(g),b=n(55),w=n.n(b),x=n(30),_=n.n(x),E=n(205),S=n.n(E),k=n(72),A=n.n(k),O=n(24),C=n.n(O),j=n(16),T=n(5),P=n(1),I=["get","put","post","delete","options","head","patch","trace"],N=function(e){return e||Object(P.Map)()},M=Object(j.a)(N,(function(e){return e.get("lastError")})),R=Object(j.a)(N,(function(e){return e.get("url")})),D=Object(j.a)(N,(function(e){return e.get("spec")||""})),L=Object(j.a)(N,(function(e){return e.get("specSource")||"not-editor"})),B=Object(j.a)(N,(function(e){return e.get("json",Object(P.Map)())})),F=Object(j.a)(N,(function(e){return e.get("resolved",Object(P.Map)())})),z=function(e,t){var n;return e.getIn(s()(n=["resolvedSubtrees"]).call(n,i()(t)),void 0)},U=function e(t,n){return P.Map.isMap(t)&&P.Map.isMap(n)?n.get("$$ref")?n:Object(P.OrderedMap)().mergeWith(e,t,n):n},q=Object(j.a)(N,(function(e){return Object(P.OrderedMap)().mergeWith(U,e.get("json"),e.get("resolvedSubtrees"))})),V=function(e){return B(e)},W=Object(j.a)(V,(function(){return!1})),H=Object(j.a)(V,(function(e){return De(e&&e.get("info"))})),$=Object(j.a)(V,(function(e){return De(e&&e.get("externalDocs"))})),J=Object(j.a)(H,(function(e){return e&&e.get("version")})),K=Object(j.a)(J,(function(e){var t;return l()(t=/v?([0-9]*)\.([0-9]*)\.([0-9]*)/i.exec(e)).call(t,1)})),Y=Object(j.a)(q,(function(e){return e.get("paths")})),G=Object(j.a)(Y,(function(e){if(!e||e.size<1)return Object(P.List)();var t=Object(P.List)();return e&&p()(e)?(p()(e).call(e,(function(e,n){if(!e||!p()(e))return{};p()(e).call(e,(function(e,r){var o;d()(I).call(I,r)<0||(t=t.push(Object(P.fromJS)({path:n,method:r,operation:e,id:s()(o="".concat(r,"-")).call(o,n)})))}))})),t):Object(P.List)()})),Q=Object(j.a)(V,(function(e){return Object(P.Set)(e.get("consumes"))})),Z=Object(j.a)(V,(function(e){return Object(P.Set)(e.get("produces"))})),X=Object(j.a)(V,(function(e){return e.get("security",Object(P.List)())})),ee=Object(j.a)(V,(function(e){return e.get("securityDefinitions")})),te=function(e,t){var n=e.getIn(["resolvedSubtrees","definitions",t],null),r=e.getIn(["json","definitions",t],null);return n||r||null},ne=Object(j.a)(V,(function(e){var t=e.get("definitions");return P.Map.isMap(t)?t:Object(P.Map)()})),re=Object(j.a)(V,(function(e){return e.get("basePath")})),oe=Object(j.a)(V,(function(e){return e.get("host")})),ae=Object(j.a)(V,(function(e){return e.get("schemes",Object(P.Map)())})),ie=Object(j.a)(G,Q,Z,(function(e,t,n){return v()(e).call(e,(function(e){return e.update("operation",(function(e){if(e){if(!P.Map.isMap(e))return;return e.withMutations((function(e){return e.get("consumes")||e.update("consumes",(function(e){return Object(P.Set)(e).merge(t)})),e.get("produces")||e.update("produces",(function(e){return Object(P.Set)(e).merge(n)})),e}))}return Object(P.Map)()}))}))})),ue=Object(j.a)(V,(function(e){var t=e.get("tags",Object(P.List)());return P.List.isList(t)?y()(t).call(t,(function(e){return P.Map.isMap(e)})):Object(P.List)()})),se=function(e,t){var n,r=ue(e)||Object(P.List)();return w()(n=y()(r).call(r,P.Map.isMap)).call(n,(function(e){return e.get("name")===t}),Object(P.Map)())},ce=Object(j.a)(ie,ue,(function(e,t){return _()(e).call(e,(function(e,t){var n=Object(P.Set)(t.getIn(["operation","tags"]));return n.count()<1?e.update("default",Object(P.List)(),(function(e){return e.push(t)})):_()(n).call(n,(function(e,n){return e.update(n,Object(P.List)(),(function(e){return e.push(t)}))}),e)}),_()(t).call(t,(function(e,t){return e.set(t.get("name"),Object(P.List)())}),Object(P.OrderedMap)()))})),le=function(e){return function(t){var n,r=(0,t.getConfigs)(),o=r.tagsSorter,a=r.operationsSorter;return v()(n=ce(e).sortBy((function(e,t){return t}),(function(e,t){var n="function"==typeof o?o:T.H.tagsSorter[o];return n?n(e,t):null}))).call(n,(function(t,n){var r="function"==typeof a?a:T.H.operationsSorter[a],o=r?S()(t).call(t,r):t;return Object(P.Map)({tagDetails:se(e,n),operations:o})}))}},fe=Object(j.a)(N,(function(e){return e.get("responses",Object(P.Map)())})),pe=Object(j.a)(N,(function(e){return e.get("requests",Object(P.Map)())})),he=Object(j.a)(N,(function(e){return e.get("mutatedRequests",Object(P.Map)())})),de=function(e,t,n){return fe(e).getIn([t,n],null)},me=function(e,t,n){return pe(e).getIn([t,n],null)},ve=function(e,t,n){return he(e).getIn([t,n],null)},ge=function(){return!0},ye=function(e,t,n){var r,o,a=q(e).getIn(s()(r=["paths"]).call(r,i()(t),["parameters"]),Object(P.OrderedMap)()),u=e.getIn(s()(o=["meta","paths"]).call(o,i()(t),["parameters"]),Object(P.OrderedMap)()),c=v()(a).call(a,(function(e){var t,r,o,a=u.get(s()(t="".concat(n.get("in"),".")).call(t,n.get("name"))),i=u.get(s()(r=s()(o="".concat(n.get("in"),".")).call(o,n.get("name"),".hash-")).call(r,n.hashCode()));return Object(P.OrderedMap)().merge(e,a,i)}));return w()(c).call(c,(function(e){return e.get("in")===n.get("in")&&e.get("name")===n.get("name")}),Object(P.OrderedMap)())},be=function(e,t,n,r){var o,a,u=s()(o="".concat(r,".")).call(o,n);return e.getIn(s()(a=["meta","paths"]).call(a,i()(t),["parameter_inclusions",u]),!1)},we=function(e,t,n,r){var o,a=q(e).getIn(s()(o=["paths"]).call(o,i()(t),["parameters"]),Object(P.OrderedMap)()),u=w()(a).call(a,(function(e){return e.get("in")===r&&e.get("name")===n}),Object(P.OrderedMap)());return ye(e,t,u)},xe=function(e,t,n){var r,o=q(e).getIn(["paths",t,n],Object(P.OrderedMap)()),a=e.getIn(["meta","paths",t,n],Object(P.OrderedMap)()),i=v()(r=o.get("parameters",Object(P.List)())).call(r,(function(r){return ye(e,[t,n],r)}));return Object(P.OrderedMap)().merge(o,a).set("parameters",i)};function _e(e,t,n,r){var o;t=t||[];var a=e.getIn(s()(o=["meta","paths"]).call(o,i()(t),["parameters"]),Object(P.fromJS)([]));return w()(a).call(a,(function(e){return P.Map.isMap(e)&&e.get("name")===n&&e.get("in")===r}))||Object(P.Map)()}var Ee=Object(j.a)(V,(function(e){var t=e.get("host");return"string"==typeof t&&t.length>0&&"/"!==t[0]}));function Se(e,t,n){var r;t=t||[];var o=xe.apply(void 0,s()(r=[e]).call(r,i()(t))).get("parameters",Object(P.List)());return _()(o).call(o,(function(e,t){var r=n&&"body"===t.get("in")?t.get("value_xml"):t.get("value");return e.set(Object(T.A)(t,{allowHashes:!1}),r)}),Object(P.fromJS)({}))}function ke(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(P.List.isList(e))return A()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get("in")===t}))}function Ae(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(P.List.isList(e))return A()(e).call(e,(function(e){return P.Map.isMap(e)&&e.get("type")===t}))}function Oe(e,t){var n,r;t=t||[];var o=q(e).getIn(s()(n=["paths"]).call(n,i()(t)),Object(P.fromJS)({})),a=e.getIn(s()(r=["meta","paths"]).call(r,i()(t)),Object(P.fromJS)({})),u=Ce(e,t),c=o.get("parameters")||new P.List,l=a.get("consumes_value")?a.get("consumes_value"):Ae(c,"file")?"multipart/form-data":Ae(c,"formData")?"application/x-www-form-urlencoded":void 0;return Object(P.fromJS)({requestContentType:l,responseContentType:u})}function Ce(e,t){var n,r;t=t||[];var o=q(e).getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==o){var a=e.getIn(s()(r=["meta","paths"]).call(r,i()(t),["produces_value"]),null),u=o.getIn(["produces",0],null);return a||u||"application/json"}}function je(e,t){var n;t=t||[];var r=q(e),a=r.getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var u=t,c=o()(u,1)[0],l=a.get("produces",null),f=r.getIn(["paths",c,"produces"],null),p=r.getIn(["produces"],null);return l||f||p}}function Te(e,t){var n;t=t||[];var r=q(e),a=r.getIn(s()(n=["paths"]).call(n,i()(t)),null);if(null!==a){var u=t,c=o()(u,1)[0],l=a.get("consumes",null),f=r.getIn(["paths",c,"consumes"],null),p=r.getIn(["consumes"],null);return l||f||p}}var Pe=function(e,t,n){var r=e.get("url").match(/^([a-z][a-z0-9+\-.]*):/),o=C()(r)?r[1]:null;return e.getIn(["scheme",t,n])||e.getIn(["scheme","_defaultScheme"])||o||""},Ie=function(e,t,n){var r;return d()(r=["http","https"]).call(r,Pe(e,t,n))>-1},Ne=function(e,t){var n;t=t||[];var r=e.getIn(s()(n=["meta","paths"]).call(n,i()(t),["parameters"]),Object(P.fromJS)([])),o=!0;return p()(r).call(r,(function(e){var t=e.get("errors");t&&t.count()&&(o=!1)})),o},Me=function(e,t){var n,r,o={requestBody:!1,requestContentType:{}},a=e.getIn(s()(n=["resolvedSubtrees","paths"]).call(n,i()(t),["requestBody"]),Object(P.fromJS)([]));return a.size<1||(a.getIn(["required"])&&(o.requestBody=a.getIn(["required"])),p()(r=a.getIn(["content"]).entrySeq()).call(r,(function(e){var t=e[0];if(e[1].getIn(["schema","required"])){var n=e[1].getIn(["schema","required"]).toJS();o.requestContentType[t]=n}}))),o},Re=function(e,t,n,r){var o;if((n||r)&&n===r)return!0;var a=e.getIn(s()(o=["resolvedSubtrees","paths"]).call(o,i()(t),["requestBody","content"]),Object(P.fromJS)([]));if(a.size<2||!n||!r)return!1;var u=a.getIn([n,"schema","properties"],Object(P.fromJS)([])),c=a.getIn([r,"schema","properties"],Object(P.fromJS)([]));return!!u.equals(c)};function De(e){return P.Map.isMap(e)?e:new P.Map}},function(e,t,n){"use strict";(function(t){var r=n(872),o=n(873),a=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,i=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,u=/^[a-zA-Z]:/,s=new RegExp("^[\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF]+");function c(e){return(e||"").toString().replace(s,"")}var l=[["#","hash"],["?","query"],function(e,t){return h(t.protocol)?e.replace(/\\/g,"/"):e},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d+)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],f={hash:1,query:1};function p(e){var n,r=("undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{}).location||{},o={},i=typeof(e=e||r);if("blob:"===e.protocol)o=new m(unescape(e.pathname),{});else if("string"===i)for(n in o=new m(e,{}),f)delete o[n];else if("object"===i){for(n in e)n in f||(o[n]=e[n]);void 0===o.slashes&&(o.slashes=a.test(e.href))}return o}function h(e){return"file:"===e||"ftp:"===e||"http:"===e||"https:"===e||"ws:"===e||"wss:"===e}function d(e,t){e=c(e),t=t||{};var n,r=i.exec(e),o=r[1]?r[1].toLowerCase():"",a=!!r[2],u=!!r[3],s=0;return a?u?(n=r[2]+r[3]+r[4],s=r[2].length+r[3].length):(n=r[2]+r[4],s=r[2].length):u?(n=r[3]+r[4],s=r[3].length):n=r[4],"file:"===o?s>=2&&(n=n.slice(2)):h(o)?n=r[4]:o?a&&(n=n.slice(2)):s>=2&&h(t.protocol)&&(n=r[4]),{protocol:o,slashes:a||h(o),slashesCount:s,rest:n}}function m(e,t,n){if(e=c(e),!(this instanceof m))return new m(e,t,n);var a,i,s,f,v,g,y=l.slice(),b=typeof t,w=this,x=0;for("object"!==b&&"string"!==b&&(n=t,t=null),n&&"function"!=typeof n&&(n=o.parse),a=!(i=d(e||"",t=p(t))).protocol&&!i.slashes,w.slashes=i.slashes||a&&t.slashes,w.protocol=i.protocol||t.protocol||"",e=i.rest,("file:"===i.protocol&&(2!==i.slashesCount||u.test(e))||!i.slashes&&(i.protocol||i.slashesCount<2||!h(w.protocol)))&&(y[3]=[/(.*)/,"pathname"]);x=4?[t[0],t[1],t[2],t[3],"".concat(t[0],".").concat(t[1]),"".concat(t[0],".").concat(t[2]),"".concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[0]),"".concat(t[1],".").concat(t[2]),"".concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[1]),"".concat(t[2],".").concat(t[3]),"".concat(t[3],".").concat(t[0]),"".concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[0]),"".concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[0],".").concat(t[1],".").concat(t[2],".").concat(t[3]),"".concat(t[0],".").concat(t[1],".").concat(t[3],".").concat(t[2]),"".concat(t[0],".").concat(t[2],".").concat(t[1],".").concat(t[3]),"".concat(t[0],".").concat(t[2],".").concat(t[3],".").concat(t[1]),"".concat(t[0],".").concat(t[3],".").concat(t[1],".").concat(t[2]),"".concat(t[0],".").concat(t[3],".").concat(t[2],".").concat(t[1]),"".concat(t[1],".").concat(t[0],".").concat(t[2],".").concat(t[3]),"".concat(t[1],".").concat(t[0],".").concat(t[3],".").concat(t[2]),"".concat(t[1],".").concat(t[2],".").concat(t[0],".").concat(t[3]),"".concat(t[1],".").concat(t[2],".").concat(t[3],".").concat(t[0]),"".concat(t[1],".").concat(t[3],".").concat(t[0],".").concat(t[2]),"".concat(t[1],".").concat(t[3],".").concat(t[2],".").concat(t[0]),"".concat(t[2],".").concat(t[0],".").concat(t[1],".").concat(t[3]),"".concat(t[2],".").concat(t[0],".").concat(t[3],".").concat(t[1]),"".concat(t[2],".").concat(t[1],".").concat(t[0],".").concat(t[3]),"".concat(t[2],".").concat(t[1],".").concat(t[3],".").concat(t[0]),"".concat(t[2],".").concat(t[3],".").concat(t[0],".").concat(t[1]),"".concat(t[2],".").concat(t[3],".").concat(t[1],".").concat(t[0]),"".concat(t[3],".").concat(t[0],".").concat(t[1],".").concat(t[2]),"".concat(t[3],".").concat(t[0],".").concat(t[2],".").concat(t[1]),"".concat(t[3],".").concat(t[1],".").concat(t[0],".").concat(t[2]),"".concat(t[3],".").concat(t[1],".").concat(t[2],".").concat(t[0]),"".concat(t[3],".").concat(t[2],".").concat(t[0],".").concat(t[1]),"".concat(t[3],".").concat(t[2],".").concat(t[1],".").concat(t[0])]:void 0),g[r]}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=e.filter((function(e){return"token"!==e})),o=y(r);return o.reduce((function(e,t){return p()({},e,n[t])}),t)}function w(e){return e.join(" ")}function x(e){var t=e.node,n=e.stylesheet,r=e.style,o=void 0===r?{}:r,a=e.useInlineStyles,i=e.key,u=t.properties,s=t.type,c=t.tagName,l=t.value;if("text"===s)return l;if(c){var f,h=function(e,t){var n=0;return function(r){return n+=1,r.map((function(r,o){return x({node:r,stylesheet:e,useInlineStyles:t,key:"code-segment-".concat(n,"-").concat(o)})}))}}(n,a);if(a){var m=Object.keys(n).reduce((function(e,t){return t.split(".").forEach((function(t){e.includes(t)||e.push(t)})),e}),[]),g=u.className&&u.className.includes("token")?["token"]:[],y=u.className&&g.concat(u.className.filter((function(e){return!m.includes(e)})));f=p()({},u,{className:w(y)||void 0,style:b(u.className,Object.assign({},u.style,o),n)})}else f=p()({},u,{className:w(u.className)});var _=h(t.children);return d.a.createElement(c,v()({key:i},f),_)}}var _=/\n/g;function E(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,o=void 0===r?{float:"left",paddingRight:"10px"}:r,a=e.numberStyle,i=void 0===a?{}:a,u=e.startingLineNumber;return d.a.createElement("code",{style:Object.assign({},n,o)},function(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map((function(e,t){var o=t+n;return d.a.createElement("span",{key:"line-".concat(t),className:"react-syntax-highlighter-line-number",style:"function"==typeof r?r(o):r},"".concat(o,"\n"))}))}({lines:t.replace(/\n$/,"").split("\n"),style:i,startingLineNumber:u}))}function S(e,t){return{type:"element",tagName:"span",properties:{key:"line-number--".concat(e),className:["comment","linenumber","react-syntax-highlighter-line-number"],style:t},children:[{type:"text",value:e}]}}function k(e,t,n){var r,o={display:"inline-block",minWidth:(r=n,"".concat(r.toString().length,".25em")),paddingRight:"1em",textAlign:"right",userSelect:"none"},a="function"==typeof e?e(t):e;return p()({},o,a)}function A(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,o=e.largestLineNumber,a=e.showInlineLineNumbers,i=e.lineProps,u=void 0===i?{}:i,s=e.className,c=void 0===s?[]:s,l=e.showLineNumbers,f=e.wrapLongLines,h="function"==typeof u?u(n):u;if(h.className=c,n&&a){var d=k(r,n,o);t.unshift(S(n,d))}return f&l&&(h.style=p()({},h.style,{display:"flex"})),{type:"element",tagName:"span",properties:h,children:t}}function O(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],r=0;r2&&void 0!==arguments[2]?arguments[2]:[];return A({children:e,lineNumber:t,lineNumberStyle:u,largestLineNumber:i,showInlineLineNumbers:o,lineProps:n,className:a,showLineNumbers:r,wrapLongLines:s})}function m(e,t){if(r&&t&&o){var n=k(u,t,i);e.unshift(S(t,n))}return e}function v(e,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return t||r.length>0?d(e,n,r):m(e,n)}for(var g=function(){var e=l[h],t=e.children[0].value;if(t.match(_)){var n=t.split("\n");n.forEach((function(t,o){var i=r&&f.length+a,u={type:"text",value:"".concat(t,"\n")};if(0===o){var s=v(l.slice(p+1,h).concat(A({children:[u],className:e.properties.className})),i);f.push(s)}else if(o===n.length-1){if(l[h+1]&&l[h+1].children&&l[h+1].children[0]){var c=A({children:[{type:"text",value:"".concat(t)}],className:e.properties.className});l.splice(h+1,0,c)}else{var d=v([u],i,e.properties.className);f.push(d)}}else{var m=v([u],i,e.properties.className);f.push(m)}})),p=h}h++};h .hljs-title":{color:"#88C0D0"},"hljs-keyword":{color:"#81A1C1"},"hljs-literal":{color:"#81A1C1"},"hljs-symbol":{color:"#81A1C1"},"hljs-number":{color:"#B48EAD"},"hljs-regexp":{color:"#EBCB8B"},"hljs-string":{color:"#A3BE8C"},"hljs-title":{color:"#8FBCBB"},"hljs-params":{color:"#D8DEE9"},"hljs-bullet":{color:"#81A1C1"},"hljs-code":{color:"#8FBCBB"},"hljs-emphasis":{fontStyle:"italic"},"hljs-formula":{color:"#8FBCBB"},"hljs-strong":{fontWeight:"bold"},"hljs-link:hover":{textDecoration:"underline"},"hljs-quote":{color:"#4C566A"},"hljs-comment":{color:"#4C566A"},"hljs-doctag":{color:"#8FBCBB"},"hljs-meta":{color:"#5E81AC"},"hljs-meta-keyword":{color:"#5E81AC"},"hljs-meta-string":{color:"#A3BE8C"},"hljs-attr":{color:"#8FBCBB"},"hljs-attribute":{color:"#D8DEE9"},"hljs-builtin-name":{color:"#81A1C1"},"hljs-name":{color:"#81A1C1"},"hljs-section":{color:"#88C0D0"},"hljs-tag":{color:"#81A1C1"},"hljs-variable":{color:"#D8DEE9"},"hljs-template-variable":{color:"#D8DEE9"},"hljs-template-tag":{color:"#5E81AC"},"abnf .hljs-attribute":{color:"#88C0D0"},"abnf .hljs-symbol":{color:"#EBCB8B"},"apache .hljs-attribute":{color:"#88C0D0"},"apache .hljs-section":{color:"#81A1C1"},"arduino .hljs-built_in":{color:"#88C0D0"},"aspectj .hljs-meta":{color:"#D08770"},"aspectj > .hljs-title":{color:"#88C0D0"},"bnf .hljs-attribute":{color:"#8FBCBB"},"clojure .hljs-name":{color:"#88C0D0"},"clojure .hljs-symbol":{color:"#EBCB8B"},"coq .hljs-built_in":{color:"#88C0D0"},"cpp .hljs-meta-string":{color:"#8FBCBB"},"css .hljs-built_in":{color:"#88C0D0"},"css .hljs-keyword":{color:"#D08770"},"diff .hljs-meta":{color:"#8FBCBB"},"ebnf .hljs-attribute":{color:"#8FBCBB"},"glsl .hljs-built_in":{color:"#88C0D0"},"groovy .hljs-meta:not(:first-child)":{color:"#D08770"},"haxe .hljs-meta":{color:"#D08770"},"java .hljs-meta":{color:"#D08770"},"ldif .hljs-attribute":{color:"#8FBCBB"},"lisp .hljs-name":{color:"#88C0D0"},"lua .hljs-built_in":{color:"#88C0D0"},"moonscript .hljs-built_in":{color:"#88C0D0"},"nginx .hljs-attribute":{color:"#88C0D0"},"nginx .hljs-section":{color:"#5E81AC"},"pf .hljs-built_in":{color:"#88C0D0"},"processing .hljs-built_in":{color:"#88C0D0"},"scss .hljs-keyword":{color:"#81A1C1"},"stylus .hljs-keyword":{color:"#81A1C1"},"swift .hljs-meta":{color:"#D08770"},"vim .hljs-built_in":{color:"#88C0D0",fontStyle:"italic"},"yaml .hljs-meta":{color:"#D08770"}},obsidian:{hljs:{display:"block",overflowX:"auto",padding:"0.5em",background:"#282b2e",color:"#e0e2e4"},"hljs-keyword":{color:"#93c763",fontWeight:"bold"},"hljs-selector-tag":{color:"#93c763",fontWeight:"bold"},"hljs-literal":{color:"#93c763",fontWeight:"bold"},"hljs-selector-id":{color:"#93c763"},"hljs-number":{color:"#ffcd22"},"hljs-attribute":{color:"#668bb0"},"hljs-code":{color:"white"},"hljs-class .hljs-title":{color:"white"},"hljs-section":{color:"white",fontWeight:"bold"},"hljs-regexp":{color:"#d39745"},"hljs-link":{color:"#d39745"},"hljs-meta":{color:"#557182"},"hljs-tag":{color:"#8cbbad"},"hljs-name":{color:"#8cbbad",fontWeight:"bold"},"hljs-bullet":{color:"#8cbbad"},"hljs-subst":{color:"#8cbbad"},"hljs-emphasis":{color:"#8cbbad"},"hljs-type":{color:"#8cbbad",fontWeight:"bold"},"hljs-built_in":{color:"#8cbbad"},"hljs-selector-attr":{color:"#8cbbad"},"hljs-selector-pseudo":{color:"#8cbbad"},"hljs-addition":{color:"#8cbbad"},"hljs-variable":{color:"#8cbbad"},"hljs-template-tag":{color:"#8cbbad"},"hljs-template-variable":{color:"#8cbbad"},"hljs-string":{color:"#ec7600"},"hljs-symbol":{color:"#ec7600"},"hljs-comment":{color:"#818e96"},"hljs-quote":{color:"#818e96"},"hljs-deletion":{color:"#818e96"},"hljs-selector-class":{color:"#A082BD"},"hljs-doctag":{fontWeight:"bold"},"hljs-title":{fontWeight:"bold"},"hljs-strong":{fontWeight:"bold"}},"tomorrow-night":{"hljs-comment":{color:"#969896"},"hljs-quote":{color:"#969896"},"hljs-variable":{color:"#cc6666"},"hljs-template-variable":{color:"#cc6666"},"hljs-tag":{color:"#cc6666"},"hljs-name":{color:"#cc6666"},"hljs-selector-id":{color:"#cc6666"},"hljs-selector-class":{color:"#cc6666"},"hljs-regexp":{color:"#cc6666"},"hljs-deletion":{color:"#cc6666"},"hljs-number":{color:"#de935f"},"hljs-built_in":{color:"#de935f"},"hljs-builtin-name":{color:"#de935f"},"hljs-literal":{color:"#de935f"},"hljs-type":{color:"#de935f"},"hljs-params":{color:"#de935f"},"hljs-meta":{color:"#de935f"},"hljs-link":{color:"#de935f"},"hljs-attribute":{color:"#f0c674"},"hljs-string":{color:"#b5bd68"},"hljs-symbol":{color:"#b5bd68"},"hljs-bullet":{color:"#b5bd68"},"hljs-addition":{color:"#b5bd68"},"hljs-title":{color:"#81a2be"},"hljs-section":{color:"#81a2be"},"hljs-keyword":{color:"#b294bb"},"hljs-selector-tag":{color:"#b294bb"},hljs:{display:"block",overflowX:"auto",background:"#1d1f21",color:"#c5c8c6",padding:"0.5em"},"hljs-emphasis":{fontStyle:"italic"},"hljs-strong":{fontWeight:"bold"}}},X=o()(Z),ee=function(e){return i()(X).call(X,e)?Z[e]:(console.warn("Request style '".concat(e,"' is not available, returning default instead")),Q)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.File=t.Blob=t.FormData=void 0;const r="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:window;t.FormData=r.FormData,t.Blob=r.Blob,t.File=r.File},function(e,t,n){var r=n(148),o=Function.prototype,a=o.apply,i=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?i.bind(a):function(){return i.apply(a,arguments)})},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){var r=n(57);e.exports=r("navigator","userAgent")||""},function(e,t){},function(e,t,n){var r,o=n(50),a=n(178),i=n(228),u=n(153),s=n(341),c=n(223),l=n(179),f=l("IE_PROTO"),p=function(){},h=function(e){return"